You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
3.0 KiB
Java

package at.procon.dip.ingestion.service;
import at.procon.dip.ingestion.service.MailMessageExtractionService.MailAttachment;
import at.procon.dip.testsupport.MailBundleTestSupport;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import static org.junit.jupiter.api.Assertions.*;
class MailMessageExtractionServiceBundleTest {
private static Path bundleRoot;
private final MailMessageExtractionService service = new MailMessageExtractionService();
@BeforeAll
static void extractBundle() throws Exception {
bundleRoot = MailBundleTestSupport.extractBundleToTempDir();
}
@ParameterizedTest(name = "parse {0}")
@MethodSource("at.procon.dip.testsupport.MailBundleTestSupport#bundleMailNames")
void parse_should_extract_expected_attachments_from_filesystem_bundle(String fileName) throws Exception {
Path eml = bundleRoot.resolve("eml").resolve(fileName);
byte[] rawMime = Files.readAllBytes(eml);
MailMessageExtractionService.ParsedMailMessage parsed = service.parse(rawMime);
assertNotNull(parsed.subject(), "subject should be parsed for " + fileName);
assertNotNull(parsed.receivedAt(), "receivedAt should be parsed for " + fileName);
assertFalse(parsed.attachments().isEmpty(), "attachments should be extracted for " + fileName);
List<String> actualNames = parsed.attachments().stream().map(MailAttachment::fileName).toList();
assertEquals(MailBundleTestSupport.EXPECTED_ATTACHMENT_NAMES.get(fileName), actualNames,
"attachment filenames should match validation bundle for " + fileName);
}
@Test
void parse_should_preserve_utf8_attachment_filenames() throws Exception {
Path eml = bundleRoot.resolve("eml").resolve("sample-mail-04-utf8-filenames.eml");
byte[] rawMime = Files.readAllBytes(eml);
MailMessageExtractionService.ParsedMailMessage parsed = service.parse(rawMime);
List<String> actualNames = parsed.attachments().stream().map(MailAttachment::fileName).toList();
assertEquals(List.of("prüfbericht.pdf", "данни.xlsx", "überblick.csv"), actualNames);
assertTrue(parsed.textBody().contains("UTF") || !parsed.textBody().isBlank(),
"UTF-8 sample should produce a readable body");
}
@Test
void parse_should_keep_octet_stream_attachments_in_bundle() throws Exception {
Path eml = bundleRoot.resolve("eml").resolve("sample-mail-05-generic-octet-stream.eml");
byte[] rawMime = Files.readAllBytes(eml);
MailMessageExtractionService.ParsedMailMessage parsed = service.parse(rawMime);
assertEquals(3, parsed.attachments().size());
assertTrue(parsed.attachments().stream().allMatch(a -> a.contentType() != null && a.contentType().contains("application/octet-stream")));
}
}