@Test public void shouldBuildWithMinimalSubset() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .build(); FinalRecipient finalRecipientField = FinalRecipient.builder().finalRecipient(Text.fromRawText("any@domain.com")).build(); MDNReport mdnReport = MDNReport.builder() .finalRecipientField(finalRecipientField) .dispositionField(disposition) .build(); assertThat(mdnReport) .isEqualTo(new MDNReport( Optional.empty(), Optional.empty(), Optional.empty(), finalRecipientField, Optional.empty(), disposition, ImmutableList.of(), ImmutableList.of())); }
@Test public void parseShouldReturnMdnReportWhenMinimalSubset() { String minimal = "Final-Recipient: rfc822; final_recipient\r\n" + "Disposition: automatic-action/MDN-sent-automatically;processed\r\n"; Optional<MDNReport> expected = Optional.of(MDNReport.builder() .finalRecipientField("final_recipient") .dispositionField(Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .build()) .build()); MDNReportParser testee = new MDNReportParser(); Optional<MDNReport> actual = testee.parse(minimal); assertThat(actual).isEqualTo(expected); }
@Test public void generateMDNReportShouldFormatNullOriginalRecipient() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Deleted) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-automatically;deleted/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatErrorFieldsOnSeveralLines() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .addErrorField(new Error(Text.fromRawText("An error message\non several lines"))) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: automatic-action/MDN-sent-automatically;processed/error,failed\r\n" + "Error: An error message\r\n" + " on several lines\r\n"); }
@Test public void generateMDNReportShouldFormatUnknownModifier() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Manual) .type(DispositionType.Deleted) .addModifier(new DispositionModifier("new")) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-manually;deleted/new\r\n"); }
@Test public void generateMDNReportShouldFormatOneModifier() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Manual) .type(DispositionType.Deleted) .addModifier(DispositionModifier.Error) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-manually;deleted/error\r\n"); }
.finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id"))
@Test public void generateMDNReportShouldFormatErrorField() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .addErrorField(new Error(Text.fromRawText("An error message"))) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: automatic-action/MDN-sent-automatically;processed/error,failed\r\n" + "Error: An error message\r\n"); }
@Test public void generateMDNReportShouldFormatGateway() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .gatewayField(Gateway.builder().name(Text.fromRawText("host.com")).build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "MDN-Gateway: dns;host.com\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: automatic-action/MDN-sent-automatically;processed/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatTypeDisplayed() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Manual) .type(DispositionType.Displayed) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-manually;displayed/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatTypeDispatcher() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Manual) .type(DispositionType.Dispatched) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-manually;dispatched/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatNullUserAgentProduct() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Deleted) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; \r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-automatically;deleted/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatAutomaticActions() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: automatic-action/MDN-sent-automatically;processed/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatWhenMissingOriginalMessageId() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Deleted) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Disposition: manual-action/MDN-sent-automatically;deleted/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatNoModifier() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Manual) .type(DispositionType.Deleted) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-manually;deleted\r\n"); }
@Test public void generateMDNReportShouldFormatUnknownAddressTypeForOriginalRecipient() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Automatic) .sendingMode(DispositionSendingMode.Automatic) .type(DispositionType.Processed) .addModifier(DispositionModifier.Error) .addModifier(DispositionModifier.Failed) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.ofUnknown(Text.fromRawText("#$%*"))) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: unknown; #$%*\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: automatic-action/MDN-sent-automatically;processed/error,failed\r\n"); }
@Test public void generateMDNReportShouldFormatAllModifier() { Disposition disposition = Disposition.builder() .actionMode(DispositionActionMode.Manual) .sendingMode(DispositionSendingMode.Manual) .type(DispositionType.Deleted) .addModifiers(DispositionModifier.Error, DispositionModifier.Expired, DispositionModifier.Failed, DispositionModifier.MailboxTerminated, DispositionModifier.Superseded, DispositionModifier.Warning) .build(); String report = MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .originalMessageIdField(new OriginalMessageId("original_message_id")) .dispositionField(disposition) .build() .formattedValue(); assertThat(report) .isEqualTo("Reporting-UA: UA_name; UA_product\r\n" + "Original-Recipient: rfc822; originalRecipient\r\n" + "Final-Recipient: rfc822; final_recipient\r\n" + "Original-Message-ID: original_message_id\r\n" + "Disposition: manual-action/MDN-sent-manually;deleted/error,expired,failed,mailbox-terminated,superseded,warning\r\n"); }
public MDNReport generateReport(Message originalMessage, MailboxSession mailboxSession) throws InvalidOriginMessageForMDNException { if (originalMessage.getMessageId() == null) { throw InvalidOriginMessageForMDNException.missingHeader("Message-ID"); } return MDNReport.builder() .dispositionField(generateDisposition()) .originalRecipientField(mailboxSession.getUser().getUserName()) .originalMessageIdField(originalMessage.getMessageId()) .finalRecipientField(mailboxSession.getUser().getUserName()) .reportingUserAgentField(getReportingUA()) .build(); }
boolean setFinalRecipientField() { this.<MDNReport.Builder>peekParent().finalRecipientField(this.<FinalRecipient>popT()); return true; }
@Test public void generateMDNReportThrowOnNullDisposition() { expectedException.expect(IllegalStateException.class); MDNReport.builder() .reportingUserAgentField(ReportingUserAgent.builder().userAgentName("UA_name").userAgentProduct("UA_product").build()) .finalRecipientField(FinalRecipient.builder().finalRecipient(Text.fromRawText("final_recipient")).build()) .originalRecipientField(OriginalRecipient.builder().originalRecipient(Text.fromRawText("originalRecipient")).build()) .build(); }