Skip to content

Commit bd141a6

Browse files
authored
Remove code duplication by introducing AbstractRestProblemIT class (#27)
1 parent 788757c commit bd141a6

File tree

5 files changed

+160
-286
lines changed

5 files changed

+160
-286
lines changed

belgif-rest-problem-it/belgif-rest-problem-it-common/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
<artifactId>assertj-core</artifactId>
3333
<scope>provided</scope>
3434
</dependency>
35+
<dependency>
36+
<groupId>io.rest-assured</groupId>
37+
<artifactId>rest-assured</artifactId>
38+
<scope>provided</scope>
39+
</dependency>
3540
</dependencies>
3641

3742
</project>
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package io.github.belgif.rest.problem;
2+
3+
import static org.hamcrest.Matchers.*;
4+
import static org.junit.jupiter.api.TestInstance.Lifecycle.*;
5+
6+
import java.util.stream.Stream;
7+
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.TestInstance;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.MethodSource;
12+
13+
import io.restassured.specification.RequestSpecification;
14+
15+
@TestInstance(PER_CLASS)
16+
// PER_CLASS because otherwise @MethodSource("getClients") requires a static getClients() method
17+
abstract class AbstractRestProblemIT {
18+
19+
protected abstract RequestSpecification getSpec();
20+
21+
protected abstract Stream<String> getClients();
22+
23+
@Test
24+
void badRequest() {
25+
getSpec().when().get("/badRequest").then().assertThat()
26+
.statusCode(400)
27+
.body("type", equalTo("urn:problem-type:belgif:badRequest"))
28+
.body("detail", equalTo("Bad Request from frontend"));
29+
}
30+
31+
@Test
32+
void custom() {
33+
getSpec().when().get("/custom").then().assertThat()
34+
.statusCode(409)
35+
.body("type", equalTo("urn:problem-type:acme:custom"))
36+
.body("customField", equalTo("value from frontend"));
37+
}
38+
39+
@Test
40+
void runtime() {
41+
getSpec().when().get("/runtime").then().assertThat()
42+
.statusCode(500)
43+
.body("type", equalTo("urn:problem-type:belgif:internalServerError"));
44+
}
45+
46+
@Test
47+
void unmapped() {
48+
getSpec().when().get("/unmapped").then().assertThat()
49+
.statusCode(400)
50+
.body("type", equalTo("urn:problem-type:belgif:test:unmapped"))
51+
.body("detail", equalTo("Unmapped problem from frontend"));
52+
}
53+
54+
@Test
55+
void retryAfter() {
56+
getSpec().when().get("/retryAfter").then().assertThat()
57+
.statusCode(503)
58+
.header("Retry-After", "10000")
59+
.body("type", equalTo("urn:problem-type:belgif:serviceUnavailable"));
60+
}
61+
62+
@ParameterizedTest
63+
@MethodSource("getClients")
64+
void badRequestFromBackend(String client) {
65+
getSpec().when().queryParam("client", client)
66+
.get("/badRequestFromBackend").then().assertThat()
67+
.statusCode(400)
68+
.body("type", equalTo("urn:problem-type:belgif:badRequest"))
69+
.body("detail", equalTo("Bad Request from backend (caught successfully by frontend)"));
70+
}
71+
72+
@ParameterizedTest
73+
@MethodSource("getClients")
74+
void customFromBackend(String client) {
75+
getSpec().when().queryParam("client", client)
76+
.get("/customFromBackend").then().assertThat()
77+
.statusCode(409)
78+
.body("type", equalTo("urn:problem-type:acme:custom"))
79+
.body("customField", equalTo("value from backend (caught successfully by frontend)"));
80+
}
81+
82+
@ParameterizedTest
83+
@MethodSource("getClients")
84+
void unmappedFromBackend(String client) {
85+
getSpec().when().queryParam("client", client)
86+
.get("/unmappedFromBackend").then().assertThat()
87+
.statusCode(400)
88+
.body("type", equalTo("urn:problem-type:belgif:test:unmapped"))
89+
.body("detail", equalTo("Unmapped problem from backend (caught successfully by frontend)"));
90+
}
91+
92+
@Test
93+
void beanValidation() {
94+
getSpec().when().queryParam("positive", -1)
95+
.get("/beanValidation").then().assertThat()
96+
.statusCode(400)
97+
.body("type", equalTo("urn:problem-type:belgif:badRequest"))
98+
.body("issues[0].type", equalTo("urn:problem-type:belgif:input-validation:schemaViolation"))
99+
.body("issues[0].title", equalTo("Input value is invalid with respect to the schema"))
100+
.body("issues[0].detail", equalTo("must be greater than 0"))
101+
.body("issues[0].in", equalTo("query"))
102+
.body("issues[0].name", equalTo("positive"))
103+
.body("issues[0].value", equalTo(-1))
104+
.body("issues[1].type", equalTo("urn:problem-type:belgif:input-validation:schemaViolation"))
105+
.body("issues[1].title", equalTo("Input value is invalid with respect to the schema"))
106+
.body("issues[1].detail", equalTo("must not be null"))
107+
.body("issues[1].in", equalTo("query"))
108+
.body("issues[1].name", equalTo("required"))
109+
.body("issues[1].value", nullValue());
110+
}
111+
112+
@Test
113+
void notFound() {
114+
getSpec().when().get("/not/found").then().assertThat()
115+
.statusCode(404);
116+
}
117+
118+
}
Lines changed: 14 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package io.github.belgif.rest.problem;
22

3-
import static org.hamcrest.Matchers.*;
3+
import java.util.Arrays;
4+
import java.util.stream.Stream;
45

56
import org.junit.jupiter.api.AfterAll;
6-
import org.junit.jupiter.api.BeforeEach;
7-
import org.junit.jupiter.api.Test;
8-
import org.junit.jupiter.params.ParameterizedTest;
9-
import org.junit.jupiter.params.provider.EnumSource;
107
import org.slf4j.Logger;
118
import org.slf4j.LoggerFactory;
129
import org.testcontainers.containers.GenericContainer;
@@ -22,13 +19,13 @@
2219
import io.restassured.specification.RequestSpecification;
2320

2421
@Testcontainers
25-
class RestProblemJakartaEeIT {
22+
class RestProblemJakartaEeIT extends AbstractRestProblemIT {
2623

2724
private static final Logger LOGGER = LoggerFactory.getLogger(RestProblemJakartaEeIT.class);
2825

2926
@Container
3027
@SuppressWarnings({ "rawtypes", "unchecked" })
31-
public static final GenericContainer JBOSS_CONTAINER =
28+
public static final GenericContainer WILDFLY_CONTAINER =
3229
new GenericContainer("quay.io/wildfly/wildfly:31.0.1.Final-jdk17")
3330
.withEnv("PREPEND_JAVA_OPTS", "-javaagent:/opt/jboss/wildfly/standalone/deployments/jacocoagent.jar"
3431
+ "=destfile=/tmp/jacoco-it.exec,includes=io.github.belgif.rest.problem.*")
@@ -42,117 +39,25 @@ class RestProblemJakartaEeIT {
4239
.waitingFor(Wait.forLogMessage(".*WFLYSRV0025.*", 1))
4340
.withLogConsumer(new Slf4jLogConsumer(LOGGER));
4441

45-
enum Client {
46-
MICROPROFILE, JAXRS, JAXRS_ASYNC, RESTEASY, RESTEASY_PROXY
47-
}
48-
49-
private RequestSpecification spec;
50-
5142
@AfterAll
5243
static void dumpJacocoReport() {
53-
try (StopContainerCmd stop = JBOSS_CONTAINER.getDockerClient()
54-
.stopContainerCmd(JBOSS_CONTAINER.getContainerId())) {
44+
try (StopContainerCmd stop = WILDFLY_CONTAINER.getDockerClient()
45+
.stopContainerCmd(WILDFLY_CONTAINER.getContainerId())) {
5546
stop.exec();
56-
JBOSS_CONTAINER.copyFileFromContainer("/tmp/jacoco-it.exec", "target/jacoco-it.exec");
47+
WILDFLY_CONTAINER.copyFileFromContainer("/tmp/jacoco-it.exec", "target/jacoco-it.exec");
5748
}
5849
}
5950

60-
@BeforeEach
61-
void before() {
62-
spec = RestAssured.with().baseUri("http://" + JBOSS_CONTAINER.getHost())
63-
.port(JBOSS_CONTAINER.getMappedPort(8080))
51+
@Override
52+
protected RequestSpecification getSpec() {
53+
return RestAssured.with().baseUri("http://" + WILDFLY_CONTAINER.getHost())
54+
.port(WILDFLY_CONTAINER.getMappedPort(8080))
6455
.basePath("/rest-problem/frontend");
6556
}
6657

67-
@Test
68-
void badRequest() {
69-
spec.when().get("/badRequest").then().assertThat()
70-
.statusCode(400)
71-
.body("type", equalTo("urn:problem-type:belgif:badRequest"))
72-
.body("detail", equalTo("Bad Request from frontend"));
73-
}
74-
75-
@Test
76-
void custom() {
77-
spec.when().get("/custom").then().assertThat()
78-
.statusCode(409)
79-
.body("type", equalTo("urn:problem-type:acme:custom"))
80-
.body("customField", equalTo("value from frontend"));
81-
}
82-
83-
@Test
84-
void runtime() {
85-
spec.when().get("/runtime").then().assertThat()
86-
.statusCode(500)
87-
.body("type", equalTo("urn:problem-type:belgif:internalServerError"));
88-
}
89-
90-
@Test
91-
void unmapped() {
92-
spec.when().get("/unmapped").then().assertThat()
93-
.statusCode(400)
94-
.body("type", equalTo("urn:problem-type:belgif:test:unmapped"))
95-
.body("detail", equalTo("Unmapped problem from frontend"));
96-
}
97-
98-
@Test
99-
void retryAfter() {
100-
spec.when().get("/retryAfter").then().assertThat()
101-
.statusCode(503)
102-
.header("Retry-After", "10000")
103-
.body("type", equalTo("urn:problem-type:belgif:serviceUnavailable"));
104-
}
105-
106-
@ParameterizedTest
107-
@EnumSource
108-
void badRequestFromBackend(Client client) {
109-
spec.when().get("/badRequestFromBackend?client=" + client).then().assertThat()
110-
.statusCode(400)
111-
.body("type", equalTo("urn:problem-type:belgif:badRequest"))
112-
.body("detail", equalTo("Bad Request from backend (caught successfully by frontend)"));
113-
}
114-
115-
@ParameterizedTest
116-
@EnumSource
117-
void customFromBackend(Client client) {
118-
spec.when().get("/customFromBackend?client=" + client).then().assertThat()
119-
.statusCode(409)
120-
.body("type", equalTo("urn:problem-type:acme:custom"))
121-
.body("customField", equalTo("value from backend (caught successfully by frontend)"));
122-
}
123-
124-
@ParameterizedTest
125-
@EnumSource
126-
void unmappedFromBackend(Client client) {
127-
spec.when().get("/unmappedFromBackend?client=" + client).then().assertThat()
128-
.statusCode(400)
129-
.body("type", equalTo("urn:problem-type:belgif:test:unmapped"))
130-
.body("detail", equalTo("Unmapped problem from backend (caught successfully by frontend)"));
131-
}
132-
133-
@Test
134-
void beanValidation() {
135-
spec.when().get("/beanValidation?positive=-1").then().assertThat()
136-
.statusCode(400)
137-
.body("type", equalTo("urn:problem-type:belgif:badRequest"))
138-
.body("issues[0].type", equalTo("urn:problem-type:belgif:input-validation:schemaViolation"))
139-
.body("issues[0].title", equalTo("Input value is invalid with respect to the schema"))
140-
.body("issues[0].detail", equalTo("must be greater than 0"))
141-
.body("issues[0].in", equalTo("query"))
142-
.body("issues[0].name", equalTo("positive"))
143-
.body("issues[0].value", equalTo(-1))
144-
.body("issues[1].type", equalTo("urn:problem-type:belgif:input-validation:schemaViolation"))
145-
.body("issues[1].title", equalTo("Input value is invalid with respect to the schema"))
146-
.body("issues[1].detail", equalTo("must not be null"))
147-
.body("issues[1].in", equalTo("query"))
148-
.body("issues[1].name", equalTo("required"))
149-
.body("issues[1].value", nullValue());
150-
}
151-
152-
@Test
153-
void notFound() {
154-
spec.when().get("/not/found").then().assertThat()
155-
.statusCode(404);
58+
@Override
59+
protected Stream<String> getClients() {
60+
return Arrays.stream(Client.values()).map(Client::name);
15661
}
15762

15863
}

0 commit comments

Comments
 (0)