Skip to content

Commit 82d5ca7

Browse files
committed
add tests
1 parent 96ac531 commit 82d5ca7

10 files changed

Lines changed: 419 additions & 4 deletions

File tree

checkstyle-suppressions.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66

77
<suppressions>
88
<suppress checks="Javadoc" files="."/>
9-
<!--<suppress checks="JavadocPackage" files="."/>-->
10-
<!--<suppress checks="DesignForExtension" files="."/>-->
11-
<!--<suppress checks="LineLength" files="."/>-->
129
<suppress checks="MethodName" files=".*[\\/]src[\\/](test|it)[\\/]"/>
1310
<suppress checks="VisibilityModifier" files=".*[\\/]src[\\/](test|it)[\\/]"/>
14-
<!--<suppress checks="FinalParameters" files=".*[\\/]src[\\/](test|it)[\\/]"/>-->
1511
<suppress checks="FileTabCharacter" files=".*[\\/]src[\\/](test|it)[\\/]"/>
1612
</suppressions>

pom.xml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,45 @@
5353
<artifactId>mapstruct</artifactId>
5454
<version>${mapstruct.version}</version>
5555
</dependency>
56+
<dependency>
57+
<groupId>org.postgresql</groupId>
58+
<artifactId>postgresql</artifactId>
59+
</dependency>
60+
<dependency>
61+
<groupId>com.vladmihalcea</groupId>
62+
<artifactId>hibernate-types-60</artifactId>
63+
<version>2.21.1</version>
64+
</dependency>
65+
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
66+
<dependency>
67+
<groupId>com.fasterxml.jackson.core</groupId>
68+
<artifactId>jackson-databind</artifactId>
69+
</dependency>
70+
71+
<dependency>
72+
<groupId>com.github.javafaker</groupId>
73+
<artifactId>javafaker</artifactId>
74+
<version>1.0.2</version>
75+
<scope>test</scope>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.testcontainers</groupId>
79+
<artifactId>testcontainers</artifactId>
80+
<version>1.16.0</version>
81+
<scope>test</scope>
82+
</dependency>
83+
<dependency>
84+
<groupId>org.testcontainers</groupId>
85+
<artifactId>junit-jupiter</artifactId>
86+
<version>1.16.0</version>
87+
<scope>test</scope>
88+
</dependency>
89+
<dependency>
90+
<groupId>org.testcontainers</groupId>
91+
<artifactId>postgresql</artifactId>
92+
<version>1.16.3</version>
93+
<scope>test</scope>
94+
</dependency>
5695
</dependencies>
5796

5897
<build>

src/main/java/it/aboutbits/springboot/emailservice/lib/application/EmailAttachmentMapper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package it.aboutbits.springboot.emailservice.lib.application;
22

3+
import it.aboutbits.springboot.emailservice.lib.AttachmentReference;
34
import it.aboutbits.springboot.emailservice.lib.EmailAttachmentDto;
45
import it.aboutbits.springboot.emailservice.lib.model.EmailAttachment;
56
import org.mapstruct.Mapper;
@@ -10,5 +11,9 @@
1011
public interface EmailAttachmentMapper {
1112
EmailAttachmentDto toDto(EmailAttachment model);
1213

14+
default AttachmentReference map(String value) {
15+
return new AttachmentReference(value);
16+
}
17+
1318
List<EmailAttachmentDto> toDto(List<EmailAttachment> model);
1419
}

src/main/java/it/aboutbits/springboot/emailservice/lib/model/Email.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
import jakarta.persistence.NamedEntityGraph;
1414
import jakarta.persistence.OneToMany;
1515
import jakarta.persistence.Table;
16+
import lombok.AllArgsConstructor;
17+
import lombok.Builder;
1618
import lombok.Getter;
19+
import lombok.NoArgsConstructor;
1720
import lombok.Setter;
1821
import org.hibernate.annotations.CreationTimestamp;
1922
import org.hibernate.annotations.JdbcTypeCode;
@@ -33,6 +36,9 @@
3336
@Entity
3437
@Getter
3538
@Setter
39+
@Builder
40+
@AllArgsConstructor
41+
@NoArgsConstructor
3642
@Table(name = "email_service_emails")
3743
public class Email {
3844
@Id
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package it.aboutbits.springboot.emailservice;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SuppressWarnings("checkstyle:HideUtilityClassConstructor")
7+
@SpringBootApplication
8+
@EnableEmailService
9+
public class TestApplication {
10+
public static void main(final String[] args) {
11+
SpringApplication.run(TestApplication.class, args);
12+
}
13+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package it.aboutbits.springboot.emailservice.lib.application;
2+
3+
import it.aboutbits.springboot.emailservice.lib.AttachmentReference;
4+
import it.aboutbits.springboot.emailservice.lib.EmailState;
5+
import it.aboutbits.springboot.emailservice.support.database.WithPostgres;
6+
import org.junit.jupiter.api.Test;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.boot.test.context.SpringBootTest;
9+
import org.springframework.boot.test.mock.mockito.MockBean;
10+
import org.springframework.mail.javamail.JavaMailSender;
11+
12+
import java.time.OffsetDateTime;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
@SpringBootTest
17+
@WithPostgres
18+
class ManageEmailTest {
19+
@MockBean
20+
JavaMailSender javaMailSender;
21+
22+
@Autowired
23+
private ManageEmail manageEmail;
24+
25+
@Test
26+
void givenRequiredParameters_schedule_shouldCreateNewNotification() {
27+
var parameter = EmailParameter.builder()
28+
.scheduleAt(OffsetDateTime.now())
29+
.email(EmailParameter.Email.builder()
30+
.subject("Example email subject")
31+
.textBody("Email body")
32+
.htmlBody("<h1>Html email body</h1>")
33+
.recipient("person1@example.com")
34+
.recipient("person2@example.com")
35+
.fromAddress("somebody@aboutbits.it")
36+
.fromName("somebody")
37+
.build()
38+
).build();
39+
40+
var result = manageEmail.schedule(parameter);
41+
42+
assertThat(result.id()).isPositive();
43+
assertThat(result.state()).isEqualTo(EmailState.PENDING);
44+
assertThat(result.subject()).isEqualTo(parameter.email().subject());
45+
assertThat(result.fromAddress()).isEqualTo(parameter.email().fromAddress());
46+
assertThat(result.fromName()).isEqualTo(parameter.email().fromName());
47+
assertThat(result.recipients()).containsAll(parameter.email().recipients());
48+
assertThat(result.textBody()).isEqualTo(parameter.email().textBody());
49+
assertThat(result.htmlBody()).isEqualTo(parameter.email().htmlBody());
50+
assertThat(result.reference()).isEqualTo(parameter.reference());
51+
assertThat(result.attachments()).isEmpty();
52+
assertThat(result.sendingScheduledAt()).isEqualTo(parameter.scheduleAt());
53+
}
54+
55+
@Test
56+
void givenRequiredParameterWithAttachedFiles_schedule_shouldCreateNewNotification() {
57+
var parameter = EmailParameter.builder()
58+
.scheduleAt(OffsetDateTime.now())
59+
.email(EmailParameter.Email.builder()
60+
.subject("Example email subject")
61+
.textBody("Email body")
62+
.htmlBody("<h1>Html email body</h1>")
63+
.recipient("person1@example.com")
64+
.recipient("person2@example.com")
65+
.attachment(
66+
EmailParameter.Email.Attachment.builder()
67+
.contentType("image/png")
68+
.fileName("x.png")
69+
.reference(new AttachmentReference("something"))
70+
.build()
71+
)
72+
.fromAddress("somebody@aboutbits.it")
73+
.fromName("somebody")
74+
.build()
75+
).build();
76+
77+
var result = manageEmail.schedule(parameter);
78+
79+
assertThat(result.id()).isPositive();
80+
assertThat(result.state()).isEqualTo(EmailState.PENDING);
81+
assertThat(result.subject()).isEqualTo(parameter.email().subject());
82+
assertThat(result.fromAddress()).isEqualTo(parameter.email().fromAddress());
83+
assertThat(result.fromName()).isEqualTo(parameter.email().fromName());
84+
assertThat(result.recipients()).containsAll(parameter.email().recipients());
85+
assertThat(result.textBody()).isEqualTo(parameter.email().textBody());
86+
assertThat(result.htmlBody()).isEqualTo(parameter.email().htmlBody());
87+
assertThat(result.reference()).isEqualTo(parameter.reference());
88+
assertThat(result.attachments()).hasSize(1);
89+
assertThat(result.sendingScheduledAt()).isEqualTo(parameter.scheduleAt());
90+
}
91+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package it.aboutbits.springboot.emailservice.lib.application;
2+
3+
import it.aboutbits.springboot.emailservice.lib.EmailDto;
4+
import it.aboutbits.springboot.emailservice.lib.EmailState;
5+
import it.aboutbits.springboot.emailservice.lib.jpa.EmailRepository;
6+
import it.aboutbits.springboot.emailservice.support.database.WithPostgres;
7+
import it.aboutbits.springboot.emailservice.support.database.factory.EmailFactory;
8+
import org.junit.jupiter.api.Test;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.boot.test.context.SpringBootTest;
11+
import org.springframework.boot.test.mock.mockito.MockBean;
12+
import org.springframework.data.domain.PageRequest;
13+
import org.springframework.mail.javamail.JavaMailSender;
14+
15+
import java.util.Set;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
19+
20+
@SpringBootTest
21+
@WithPostgres
22+
class QueryEmailTest {
23+
@MockBean
24+
JavaMailSender javaMailSender;
25+
26+
@Autowired
27+
EmailRepository emailRepository;
28+
29+
@Autowired
30+
QueryEmail queryEmail;
31+
32+
@Test
33+
void givenEmailNotification_byState_shouldSuccess() {
34+
emailRepository.saveAll(Set.of(
35+
EmailFactory.once().build(),
36+
EmailFactory.once().state(EmailState.SENT).build(),
37+
EmailFactory.once().state(EmailState.SENT).build()
38+
));
39+
40+
var result = queryEmail.paginatedByState(
41+
EmailState.SENT,
42+
PageRequest.of(0, 20)
43+
);
44+
45+
assertThat(result.getTotalElements()).isEqualTo(2L);
46+
}
47+
48+
@Test
49+
void givenEmailNotificationWithPagination_byState_shouldSuccess() {
50+
emailRepository.saveAll(Set.of(
51+
EmailFactory.once().build(),
52+
EmailFactory.once().state(EmailState.SENT).build(),
53+
EmailFactory.once().state(EmailState.SENT).build()
54+
));
55+
56+
var result = queryEmail.paginatedByState(
57+
EmailState.SENT,
58+
PageRequest.of(1, 1)
59+
);
60+
61+
assertThat(result.getTotalPages()).isEqualTo(2);
62+
assertThat(result.getTotalElements()).isEqualTo(2L);
63+
assertThat(result.getContent()).hasSize(1);
64+
}
65+
66+
@Test
67+
void givenEmailNotificationWithPagination_byReference_shouldSuccess() {
68+
emailRepository.saveAll(Set.of(
69+
EmailFactory.once().reference("something").build(),
70+
EmailFactory.once().reference("something else").build(),
71+
EmailFactory.once().reference("something").build()
72+
));
73+
74+
var result = queryEmail.byReference(
75+
"something"
76+
);
77+
78+
assertThat(result).hasSize(2);
79+
}
80+
81+
@Test
82+
void givenEmailNotification_byIds_shouldSuccess() {
83+
var notificationA = emailRepository.save(EmailFactory.once().build());
84+
var notificationB = emailRepository.save(EmailFactory.once().build());
85+
emailRepository.save(EmailFactory.once().build());
86+
87+
var result = queryEmail.byIds(Set.of(notificationA.getId(), notificationB.getId()));
88+
89+
assertThat(result)
90+
.hasSize(2)
91+
.map(EmailDto::id)
92+
.containsExactlyInAnyOrder(notificationA.getId(), notificationB.getId());
93+
94+
}
95+
96+
@Test
97+
void givenEmailNotification_byIdOrFail_shouldSuccess() {
98+
var notification = emailRepository.save(EmailFactory.once().build());
99+
100+
var result = queryEmail.byId(notification.getId());
101+
102+
assertThat(result).isPresent();
103+
assertThat(result.get().id()).isEqualTo(notification.getId());
104+
}
105+
106+
@Test
107+
void givenNoEmailNotification_byIdOrFail_shouldFail() {
108+
assertThat(queryEmail.byId(123L)).isNotPresent();
109+
}
110+
}

0 commit comments

Comments
 (0)