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 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"); } }