Skip to content

Commit a145034

Browse files
authored
Merge pull request #8 from helpdeveloper/gz-wire-mock-sample
feat: implemented protocol (sample with new rest client module)
2 parents 9771cac + a2c9f74 commit a145034

File tree

26 files changed

+560
-91
lines changed

26 files changed

+560
-91
lines changed

acceptance-test/pom.xml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717
<mutation.skip>true</mutation.skip>
1818
<maven-resources-plugin.version>3.1.0</maven-resources-plugin.version>
1919
<maven-failsafe-plugin.version>2.22.0</maven-failsafe-plugin.version>
20-
<mysql-connector-java.version>8.0.23</mysql-connector-java.version>
20+
<mysql-connector-java.version>8.0.25</mysql-connector-java.version>
2121
<docker-maven-plugin.version>0.35.0</docker-maven-plugin.version>
2222
<run-java-sh.version>1.2.2</run-java-sh.version>
2323
<mutation.skip>true</mutation.skip>
24+
<wiremock-jre8.version>2.27.2</wiremock-jre8.version>
2425
</properties>
2526

2627
<dependencies>
@@ -92,6 +93,12 @@
9293
<artifactId>javafaker</artifactId>
9394
<scope>test</scope>
9495
</dependency>
96+
<dependency>
97+
<groupId>com.github.tomakehurst</groupId>
98+
<artifactId>wiremock-jre8</artifactId>
99+
<version>${wiremock-jre8.version}</version>
100+
<scope>test</scope>
101+
</dependency>
95102
</dependencies>
96103

97104

acceptance-test/src/test/java/br/com/helpdev/atdd/AbstractContainerBaseTest.java

Lines changed: 0 additions & 57 deletions
This file was deleted.
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package br.com.helpdev.atdd;
2+
3+
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
4+
5+
import com.github.tomakehurst.wiremock.WireMockServer;
6+
import io.restassured.RestAssured;
7+
import org.junit.jupiter.api.AfterEach;
8+
import org.slf4j.LoggerFactory;
9+
import org.testcontainers.Testcontainers;
10+
import org.testcontainers.containers.GenericContainer;
11+
import org.testcontainers.containers.MySQLContainer;
12+
import org.testcontainers.containers.Network;
13+
import org.testcontainers.containers.output.Slf4jLogConsumer;
14+
import org.testcontainers.containers.wait.strategy.Wait;
15+
import org.testcontainers.lifecycle.Startable;
16+
import org.testcontainers.utility.MountableFile;
17+
18+
abstract class DefaultContainerStarterTest {
19+
20+
private static final GenericContainer<?> APP;
21+
private static final GenericContainer<?> FLYWAY;
22+
private static final GenericContainer<?> MYSQL_CONTAINER;
23+
private static final Network NETWORK = Network.newNetwork();
24+
protected static final WireMockServer MOCK_SERVER;
25+
26+
/* Containers are initialized in static block to create only once in test execution */
27+
static {
28+
MOCK_SERVER = new WireMockServer(wireMockConfig().dynamicPort());
29+
MOCK_SERVER.start();
30+
exposeHostMachinePortToContainersForApiIntegrations();
31+
32+
MYSQL_CONTAINER = buildMySqlContainer();
33+
MYSQL_CONTAINER.start();
34+
35+
FLYWAY = buildFlywayContainer(MYSQL_CONTAINER);
36+
FLYWAY.start();
37+
38+
APP = buildAppContainer(MYSQL_CONTAINER, FLYWAY);
39+
APP.start();
40+
41+
initRestAssured();
42+
}
43+
44+
private static GenericContainer<?> buildMySqlContainer() {
45+
return new MySQLContainer<>("mysql:5.7.22")
46+
.withNetwork(NETWORK)
47+
.withNetworkAliases("testdb");
48+
}
49+
50+
private static GenericContainer<?> buildFlywayContainer(final Startable... dependsOn) {
51+
return new GenericContainer<>("flyway/flyway")
52+
.dependsOn(dependsOn)
53+
.withNetwork(NETWORK)
54+
.withCopyFileToContainer(MountableFile.forHostPath("../resources/flyway/db"), "/flyway/sql")
55+
.withCommand("-url=jdbc:mysql://testdb?useSSL=false -schemas=test -user=test -password=test -connectRetries=60 migrate")
56+
.waitingFor(Wait.forLogMessage("(?s).*No migration necessary(?s).*|(?s).*Successfully applied(?s).*", 1))
57+
.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger("FLYWAY")));
58+
}
59+
60+
private static GenericContainer<?> buildAppContainer(final Startable... dependsOn) {
61+
return new GenericContainer<>("app-test:integration")
62+
.dependsOn(dependsOn)
63+
.withNetwork(NETWORK)
64+
.withEnv("RANDOM_DATA_API_URL", "http://host.testcontainers.internal:" + MOCK_SERVER.port())
65+
.withEnv("MYSQL_USER", "test")
66+
.withEnv("MYSQL_PASSWORD", "test")
67+
.withEnv("MYSQL_URL", "jdbc:mysql://testdb:" + MySQLContainer.MYSQL_PORT + "/test?autoReconnect=true&useSSL=false")
68+
.withExposedPorts(8080)
69+
.waitingFor(Wait.forHttp("/health/ready").forStatusCode(200))
70+
.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger("APP_CONTAINER")));
71+
}
72+
73+
74+
private static void initRestAssured() {
75+
RestAssured.baseURI = "http://" + APP.getHost();
76+
RestAssured.port = APP.getFirstMappedPort();
77+
RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();
78+
}
79+
80+
private static void exposeHostMachinePortToContainersForApiIntegrations() {
81+
Testcontainers.exposeHostPorts(MOCK_SERVER.port());
82+
}
83+
84+
@AfterEach
85+
void tearDown() {
86+
MOCK_SERVER.resetAll();
87+
/* add here others resets needed after each test */
88+
}
89+
90+
}

acceptance-test/src/test/java/br/com/helpdev/atdd/ApplicationIT.java renamed to acceptance-test/src/test/java/br/com/helpdev/atdd/MessageV1EndpointIT.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package br.com.helpdev.atdd;
22

3+
import static br.com.helpdev.atdd.mock.RandomDataApiMock.mockRandomIdNumber;
34
import static io.restassured.RestAssured.given;
5+
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
46
import static org.hamcrest.CoreMatchers.equalTo;
57
import static org.hamcrest.CoreMatchers.notNullValue;
68

@@ -11,10 +13,12 @@
1113
import java.time.ZonedDateTime;
1214
import org.junit.jupiter.api.Test;
1315

14-
class ApplicationIT extends AbstractContainerBaseTest {
16+
class MessageV1EndpointIT extends DefaultContainerStarterTest {
1517

1618
@Test
1719
void whenCreateNewScheduleThenReturn() {
20+
mockRandomIdNumber(MOCK_SERVER);
21+
1822
var now = ZonedDateTime.now();
1923
Integer id = given()
2024
.contentType(ContentType.JSON)
@@ -36,14 +40,16 @@ void whenCreateNewScheduleThenReturn() {
3640
.get("/v1/message/{id}", id)
3741
.then()
3842
.statusCode(200)
43+
.body("protocol", equalTo("000-22-1110"))
3944
.body("scheduleDate", notNullValue())
4045
.body("body", equalTo("Hello"))
4146
.body("channel", equalTo("WHATSAPP"))
4247
.body("recipient.name", equalTo("John James"))
4348
.body("recipient.phoneId", equalTo("123"))
4449
.body("recipient.email", equalTo("[email protected]"))
4550
.body("recipient.phoneNumber", equalTo("89898989"))
46-
.body("chats[0].status", equalTo("WAITING"));
51+
.body("chats[0].status", equalTo("WAITING"))
52+
.body(matchesJsonSchemaInClasspath("jsons/v1/postMessage.json"));
4753
}
4854

4955
@Test
@@ -59,6 +65,8 @@ void whenGetWithInvalidIdThenReturnError() {
5965

6066
@Test
6167
void whenDeleteMessageThenRemove() {
68+
mockRandomIdNumber(MOCK_SERVER);
69+
6270
var now = ZonedDateTime.now();
6371
Integer id = given()
6472
.contentType(ContentType.JSON)
@@ -93,6 +101,8 @@ void whenDeleteWithInvalidIdThenReturnError() {
93101

94102
@Test
95103
void whenCreateNewEmailScheduleThenReturn() {
104+
mockRandomIdNumber(MOCK_SERVER);
105+
96106
given()
97107
.contentType(ContentType.JSON)
98108
.body(buildMessage(ZonedDateTime.now(), CommunicationChannelDto.EMAIL))
@@ -108,6 +118,8 @@ void whenCreateNewEmailScheduleThenReturn() {
108118

109119
@Test
110120
void whenCreateNewPushScheduleThenReturn() {
121+
mockRandomIdNumber(MOCK_SERVER);
122+
111123
given()
112124
.contentType(ContentType.JSON)
113125
.body(buildMessage(ZonedDateTime.now(), CommunicationChannelDto.PUSH))
@@ -123,6 +135,8 @@ void whenCreateNewPushScheduleThenReturn() {
123135

124136
@Test
125137
void whenCreateNewSmsScheduleThenReturn() {
138+
mockRandomIdNumber(MOCK_SERVER);
139+
126140
given()
127141
.contentType(ContentType.JSON)
128142
.body(buildMessage(ZonedDateTime.now(), CommunicationChannelDto.SMS))
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package br.com.helpdev.atdd.mock;
2+
3+
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
4+
import static com.github.tomakehurst.wiremock.client.WireMock.get;
5+
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathMatching;
6+
7+
import com.github.tomakehurst.wiremock.WireMockServer;
8+
9+
public class RandomDataApiMock {
10+
11+
public static void mockRandomIdNumber(final WireMockServer mockServer) {
12+
mockServer.stubFor(get(urlPathMatching("/api/id_number/random_id_number"))
13+
.willReturn(aResponse()
14+
.withBodyFile("randomIdNumberResponse.json")
15+
.withStatus(200)
16+
.withHeader("Content-Type", "application/json")));
17+
}
18+
19+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"id": 8511,
3+
"uid": "2c6bbb23-8ad5-4e36-94d0-945f3fc541af",
4+
"valid_us_ssn": "000-22-1110",
5+
"invalid_us_ssn": "666-31-7707"
6+
}

0 commit comments

Comments
 (0)