SubMessage { public static Builder builder() { return new Builder(); } @VisibleForTesting  SubMessage(ImmutableMap<String, String> headers,
                                  Optional<Emailer> from,
                                  ImmutableList<Emailer> to,
                                  ImmutableList<Emailer> cc,
                                  ImmutableList<Emailer> bcc,
                                  ImmutableList<Emailer> replyTo,
                                  String subject,
                                  Instant date,
                                  Optional<String> textBody,
                                  Optional<String> htmlBody,
                                  ImmutableList<Attachment> attachments,
                                  ImmutableMap<BlobId, SubMessage> attachedMessages); static Builder builder(); ImmutableMap<String, String> getHeaders(); Optional<Emailer> getFrom(); ImmutableList<Emailer> getTo(); ImmutableList<Emailer> getCc(); ImmutableList<Emailer> getBcc(); ImmutableList<Emailer> getReplyTo(); String getSubject(); Instant getDate(); Optional<String> getTextBody(); Optional<String> getHtmlBody(); ImmutableList<Attachment> getAttachments(); ImmutableMap<BlobId, SubMessage> getAttachedMessages();  }
@Test void buildShouldThrowWhenHeadersIsNull() { assertThatThrownBy(() -> SubMessage.builder().build()) .isInstanceOf(IllegalStateException.class); }
@Test void buildShouldThrowWhenSubjectIsNull() { assertThatThrownBy(() -> SubMessage.builder() .headers(ImmutableMap.of()) .build()) .isInstanceOf(IllegalStateException.class); }
@Test void buildShouldThrowWhenSubjectIsEmpty() { assertThatThrownBy(() -> SubMessage.builder() .headers(ImmutableMap.of()) .subject("") .build()) .isInstanceOf(IllegalStateException.class); }
@Test void buildShouldThrowWhenDateIsNull() { assertThatThrownBy(() -> SubMessage.builder() .headers(ImmutableMap.of()) .subject("subject") .build()) .isInstanceOf(IllegalStateException.class); }
@Test void buildShouldWorkWhenMandatoryFieldsArePresent() { Instant currentDate = Instant.now(); SubMessage expected = new SubMessage(ImmutableMap.of("key", "value"), Optional.empty(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), "subject", currentDate, Optional.empty(), Optional.empty(), ImmutableList.of(), ImmutableMap.of()); SubMessage tested = SubMessage.builder() .headers(ImmutableMap.of("key", "value")) .subject("subject") .date(currentDate) .build(); assertThat(tested).isEqualToComparingFieldByField(expected); }
@Test void buildShouldThrowWhenAttachedMessageIsNotMatchingAttachments() { Attachment simpleAttachment = Attachment.builder().blobId(BlobId.of("blobId")).type("type").name("name").size(123).build(); ImmutableList<Attachment> attachments = ImmutableList.of(simpleAttachment); SubMessage simpleMessage = SubMessage.builder() .headers(ImmutableMap.of("key", "value")) .subject("subject") .date(Instant.now()) .build(); ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("differentBlobId"), simpleMessage); assertThatThrownBy(() -> SubMessage.builder() .headers(ImmutableMap.of("key", "value")) .subject("subject") .date(Instant.now()) .attachments(attachments) .attachedMessages(attachedMessages) .build()) .isInstanceOf(IllegalStateException.class); }
@Test void buildShouldWorkWhenAllFieldsArePresent() { Emailer from = Emailer.builder().name("from").email("from@domain").build(); ImmutableList<Emailer> to = ImmutableList.of(Emailer.builder().name("to").email("to@domain").build()); ImmutableList<Emailer> cc = ImmutableList.of(Emailer.builder().name("cc").email("cc@domain").build()); ImmutableList<Emailer> bcc = ImmutableList.of(Emailer.builder().name("bcc").email("bcc@domain").build()); ImmutableList<Emailer> replyTo = ImmutableList.of(Emailer.builder().name("replyTo").email("replyTo@domain").build()); Instant currentDate = Instant.now(); Attachment simpleAttachment = Attachment.builder().blobId(BlobId.of("blobId")).type("type").name("name").size(123).build(); ImmutableList<Attachment> attachments = ImmutableList.of(simpleAttachment); SubMessage simpleMessage = SubMessage.builder() .headers(ImmutableMap.of("key", "value")) .subject("subject") .date(currentDate) .build(); ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("blobId"), simpleMessage); SubMessage expected = new SubMessage( ImmutableMap.of("key", "value"), Optional.of(from), to, cc, bcc, replyTo, "subject", currentDate, DEFAULT_TEXT_BODY, DEFAULT_HTML_BODY, attachments, attachedMessages); SubMessage tested = SubMessage.builder() .headers(ImmutableMap.of("key", "value")) .from(from) .to(to) .cc(cc) .bcc(bcc) .replyTo(replyTo) .subject("subject") .date(currentDate) .textBody(DEFAULT_TEXT_BODY) .htmlBody(DEFAULT_HTML_BODY) .attachments(attachments) .attachedMessages(attachedMessages) .build(); assertThat(tested).isEqualToComparingFieldByField(expected); }