Почтовый кабинет: регистрация, папки, черновики, вложения, грид @jambotron/aria-grid, интерфейс по synthwave-шаблону
Бэкенд: регистрация со входом сразу и /api/config, профиль и смена пароля, свои папки, PATCH письма (прочитано, флажок, перенос; Спам ставит отметку), корзина и очистка, черновики, несколько адресатов и копия, вложения черновика уходят с письмом, вложения и заголовки To/Cc входящих сохраняются, письма заблокированных — в Спам. Исправлено: загрузка файла (415), колонка content_id (500 на любых вложениях), SPA-маршрут с точкой. Фронтенд переписан: все таблицы — грид, оформление — шаблон synthwave-design-showcase.html. α Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
package com.mailserver.service;
|
||||
|
||||
import com.mailserver.domain.Attachment;
|
||||
import com.mailserver.domain.User;
|
||||
import com.mailserver.dto.SendRequest;
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.Session;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
class SubmissionServiceTest {
|
||||
|
||||
@Test
|
||||
void addressesAreSplitLowercasedAndDeduplicated() {
|
||||
assertThat(SubmissionService.addresses(" Bob@Mail.test, alice@mail.test;bob@mail.test carol@x.org "))
|
||||
.containsExactly("bob@mail.test", "alice@mail.test", "carol@x.org");
|
||||
assertThat(SubmissionService.addresses(null)).isEmpty();
|
||||
assertThat(SubmissionService.addresses(" ")).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
void malformedAddressIsRejected() {
|
||||
assertThatThrownBy(() -> SubmissionService.addresses("bob@mail.test, not-an-address"))
|
||||
.isInstanceOf(ResponseStatusException.class)
|
||||
.hasMessageContaining("not-an-address");
|
||||
}
|
||||
|
||||
@Test
|
||||
void attachmentsGoIntoTheMessageAndComeBackOutOnDelivery(@TempDir Path dir) throws Exception {
|
||||
Path file = dir.resolve("report.pdf");
|
||||
Files.writeString(file, "%PDF-1.4 test");
|
||||
Attachment attachment = new Attachment();
|
||||
attachment.setFilename("Отчёт 2026.pdf");
|
||||
attachment.setContentType("application/pdf");
|
||||
attachment.setFilePath(file.toString());
|
||||
|
||||
User user = new User();
|
||||
user.setEmail("admin@mail.test");
|
||||
user.setDisplayName("Admin");
|
||||
SendRequest request = new SendRequest();
|
||||
request.setSubject("Report");
|
||||
request.setBody("See the file");
|
||||
|
||||
MimeMessage mime = SubmissionService.mime(user, List.of("bob@mail.test"), List.of("carol@mail.test"), request,
|
||||
List.of(attachment));
|
||||
ByteArrayOutputStream raw = new ByteArrayOutputStream();
|
||||
mime.writeTo(raw);
|
||||
|
||||
MimeMessage parsed = new MimeMessage(Session.getInstance(new Properties()), new ByteArrayInputStream(raw.toByteArray()));
|
||||
assertThat(parsed.getRecipients(Message.RecipientType.CC)[0].toString()).isEqualTo("carol@mail.test");
|
||||
assertThat(LocalDelivery.addresses(parsed, Message.RecipientType.TO)).isEqualTo("bob@mail.test");
|
||||
assertThat(LocalDelivery.addresses(parsed, Message.RecipientType.CC)).isEqualTo("carol@mail.test");
|
||||
assertThat(LocalDelivery.body(parsed).text()).isEqualTo("See the file");
|
||||
List<LocalDelivery.FilePart> files = LocalDelivery.attachments(parsed);
|
||||
assertThat(files).hasSize(1);
|
||||
assertThat(files.get(0).name()).isEqualTo("Отчёт 2026.pdf");
|
||||
assertThat(files.get(0).contentType()).isEqualTo("application/pdf");
|
||||
assertThat(new String(files.get(0).bytes(), StandardCharsets.UTF_8)).isEqualTo("%PDF-1.4 test");
|
||||
}
|
||||
|
||||
@Test
|
||||
void plainMessageHasNoAttachments() throws Exception {
|
||||
User user = new User();
|
||||
user.setEmail("admin@mail.test");
|
||||
SendRequest request = new SendRequest();
|
||||
request.setBody("Hi");
|
||||
MimeMessage mime = SubmissionService.mime(user, List.of("bob@mail.test"), List.of(), request, List.of());
|
||||
assertThat(LocalDelivery.attachments(mime)).isEmpty();
|
||||
assertThat(LocalDelivery.body(mime).text()).isEqualTo("Hi");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user