Skip to content

Commit 12b161c

Browse files
authored
add http testing tools (#29)
1 parent 3ac2c4e commit 12b161c

14 files changed

Lines changed: 816 additions & 2 deletions

pom.xml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
34
<modelVersion>4.0.0</modelVersion>
45

56
<parent>
@@ -23,7 +24,7 @@
2324
<dependency>
2425
<groupId>it.aboutbits</groupId>
2526
<artifactId>spring-boot-toolbox</artifactId>
26-
<version>1.6.0</version>
27+
<version>1.7.0</version>
2728
</dependency>
2829
</dependencies>
2930
</dependencyManagement>
@@ -39,6 +40,12 @@
3940
<artifactId>spring-boot-starter-validation</artifactId>
4041
</dependency>
4142

43+
<dependency>
44+
<groupId>org.springframework.boot</groupId>
45+
<artifactId>spring-boot-starter-web</artifactId>
46+
</dependency>
47+
48+
4249
<!-- Utilities -->
4350
<dependency>
4451
<groupId>org.projectlombok</groupId>
@@ -47,6 +54,10 @@
4754
</dependency>
4855

4956
<!-- Testing -->
57+
<dependency>
58+
<groupId>org.springframework.security</groupId>
59+
<artifactId>spring-security-test</artifactId>
60+
</dependency>
5061
<dependency>
5162
<groupId>org.springframework.boot</groupId>
5263
<artifactId>spring-boot-starter-test</artifactId>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package it.aboutbits.springboot.testing.web.request;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.NonNull;
5+
import org.springframework.test.web.servlet.MockMvc;
6+
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
7+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
8+
9+
import static org.springframework.http.MediaType.APPLICATION_JSON;
10+
11+
public class Delete extends Request<MockHttpServletRequestBuilder> {
12+
Delete(
13+
@NonNull MockMvc mockMvc,
14+
@NonNull ObjectMapper objectMapper,
15+
@NonNull String url,
16+
@NonNull Object... pathVariables
17+
) {
18+
super(mockMvc, objectMapper, url, APPLICATION_JSON, pathVariables);
19+
}
20+
21+
@Override
22+
protected @NonNull MockHttpServletRequestBuilder getRequestBuilder(@NonNull UrlWithVariables url) {
23+
return MockMvcRequestBuilders.delete(url.url(), url.pathVariables());
24+
}
25+
26+
@Override
27+
protected boolean useCsrf() {
28+
return true;
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package it.aboutbits.springboot.testing.web.request;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.NonNull;
5+
import org.springframework.test.web.servlet.MockMvc;
6+
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
7+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
8+
9+
import static org.springframework.http.MediaType.APPLICATION_JSON;
10+
11+
public class Get extends Request<MockHttpServletRequestBuilder> {
12+
Get(
13+
@NonNull MockMvc mockMvc,
14+
@NonNull ObjectMapper objectMapper,
15+
@NonNull String url,
16+
@NonNull Object... pathVariables
17+
) {
18+
super(mockMvc, objectMapper, url, APPLICATION_JSON, pathVariables);
19+
}
20+
21+
@Override
22+
protected @NonNull MockHttpServletRequestBuilder getRequestBuilder(@NonNull UrlWithVariables url) {
23+
return MockMvcRequestBuilders.get(url.url(), url.pathVariables());
24+
}
25+
26+
@Override
27+
protected boolean useCsrf() {
28+
return false;
29+
}
30+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package it.aboutbits.springboot.testing.web.request;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.NonNull;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.test.web.servlet.MockMvc;
7+
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
8+
9+
@RequiredArgsConstructor
10+
public class HttpTestClient {
11+
private final MockMvc mockMvc;
12+
private final ObjectMapper objectMapper;
13+
14+
public Request<MockHttpServletRequestBuilder> get(@NonNull String url, Object... pathVariables) {
15+
return new Get(mockMvc, objectMapper, url, pathVariables);
16+
}
17+
18+
public Request<MockHttpServletRequestBuilder> put(@NonNull String url, Object... pathVariables) {
19+
return new Put(mockMvc, objectMapper, url, pathVariables);
20+
}
21+
22+
public MultipartRequest putMultipart(@NonNull String url, Object... pathVariables) {
23+
return new PutMultipart(mockMvc, objectMapper, url, pathVariables);
24+
}
25+
26+
public Request<MockHttpServletRequestBuilder> post(@NonNull String url, Object... pathVariables) {
27+
return new Post(mockMvc, objectMapper, url, pathVariables);
28+
}
29+
30+
public MultipartRequest postMultipart(@NonNull String url, Object... pathVariables) {
31+
return new PostMultipart(mockMvc, objectMapper, url, pathVariables);
32+
}
33+
34+
public Request<MockHttpServletRequestBuilder> patch(@NonNull String url, Object... pathVariables) {
35+
return new Patch(mockMvc, objectMapper, url, pathVariables);
36+
}
37+
38+
public MultipartRequest patchMultipart(@NonNull String url, Object... pathVariables) {
39+
return new PatchMultipart(mockMvc, objectMapper, url, pathVariables);
40+
}
41+
42+
public Request<MockHttpServletRequestBuilder> delete(@NonNull String url, Object... pathVariables) {
43+
return new Delete(mockMvc, objectMapper, url, pathVariables);
44+
}
45+
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package it.aboutbits.springboot.testing.web.request;
2+
3+
import lombok.Getter;
4+
import lombok.NonNull;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.mock.web.MockMultipartFile;
7+
8+
import static it.aboutbits.springboot.testing.web.request.RequestSecurityAssert.assertThatRequest;
9+
10+
@Getter
11+
@RequiredArgsConstructor
12+
public class HttpTestSecurity {
13+
private final HttpTestClient httpTestClient;
14+
15+
public void assertGetGranted(@NonNull String url, Object... pathVariables) {
16+
var result = httpTestClient.get(url, pathVariables)
17+
.returnRaw();
18+
19+
assertThatRequest(result).wasGranted();
20+
}
21+
22+
public void assertGetDenied(@NonNull String url, Object... pathVariables) {
23+
var result = httpTestClient.get(url, pathVariables)
24+
.returnRaw();
25+
26+
assertThatRequest(result).wasDenied();
27+
}
28+
29+
public void assertPostGranted(@NonNull String url, Object... pathVariables) {
30+
var result = httpTestClient.post(url, pathVariables)
31+
.body("{}")
32+
.returnRaw();
33+
34+
assertThatRequest(result).wasGranted();
35+
}
36+
37+
public void assertPostDenied(@NonNull String url, Object... pathVariables) {
38+
var result = httpTestClient.post(url, pathVariables)
39+
.body("{}")
40+
.returnRaw();
41+
42+
assertThatRequest(result).wasDenied();
43+
}
44+
45+
public void assertPostMultipartGranted(
46+
@NonNull String url,
47+
@NonNull MockMultipartFile multipartFile,
48+
Object... pathVariables
49+
) {
50+
var result = httpTestClient.postMultipart(url, pathVariables)
51+
.file(multipartFile)
52+
.returnRaw();
53+
54+
assertThatRequest(result).wasGranted();
55+
}
56+
57+
public void assertPostMultipartDenied(
58+
@NonNull String url,
59+
@NonNull MockMultipartFile multipartFile,
60+
Object... pathVariables
61+
) {
62+
var result = httpTestClient.postMultipart(url, pathVariables)
63+
.file(multipartFile)
64+
.returnRaw();
65+
66+
assertThatRequest(result).wasDenied();
67+
}
68+
69+
public void assertPutGranted(@NonNull String url, Object... pathVariables) {
70+
var result = httpTestClient.put(url, pathVariables)
71+
.body("{}")
72+
.returnRaw();
73+
74+
assertThatRequest(result).wasGranted();
75+
}
76+
77+
public void assertPutDenied(@NonNull String url, Object... pathVariables) {
78+
var result = httpTestClient.put(url, pathVariables)
79+
.body("{}")
80+
.returnRaw();
81+
82+
assertThatRequest(result).wasDenied();
83+
}
84+
85+
public void assertPutMultipartGranted(
86+
@NonNull String url,
87+
@NonNull MockMultipartFile multipartFile,
88+
Object... pathVariables
89+
) {
90+
var result = httpTestClient.putMultipart(url, pathVariables)
91+
.file(multipartFile)
92+
.returnRaw();
93+
94+
assertThatRequest(result).wasGranted();
95+
}
96+
97+
public void assertPutMultipartDenied(
98+
@NonNull String url,
99+
@NonNull MockMultipartFile multipartFile,
100+
Object... pathVariables
101+
) {
102+
var result = httpTestClient.putMultipart(url, pathVariables)
103+
.file(multipartFile)
104+
.returnRaw();
105+
106+
assertThatRequest(result).wasDenied();
107+
}
108+
109+
public void assertPatchGranted(@NonNull String url, Object... pathVariables) {
110+
var result = httpTestClient.patch(url, pathVariables)
111+
.body("{}")
112+
.returnRaw();
113+
114+
assertThatRequest(result).wasGranted();
115+
}
116+
117+
public void assertPatchDenied(@NonNull String url, Object... pathVariables) {
118+
var result = httpTestClient.patch(url, pathVariables)
119+
.body("{}")
120+
.returnRaw();
121+
122+
assertThatRequest(result).wasDenied();
123+
}
124+
125+
public void assertPatchMultipartGranted(
126+
@NonNull String url,
127+
@NonNull MockMultipartFile multipartFile,
128+
Object... pathVariables
129+
) {
130+
var result = httpTestClient.patchMultipart(url, pathVariables)
131+
.file(multipartFile)
132+
.returnRaw();
133+
134+
assertThatRequest(result).wasGranted();
135+
}
136+
137+
public void assertPatchMultipartDenied(
138+
@NonNull String url,
139+
@NonNull MockMultipartFile multipartFile,
140+
Object... pathVariables
141+
) {
142+
var result = httpTestClient.patchMultipart(url, pathVariables)
143+
.file(multipartFile)
144+
.returnRaw();
145+
146+
assertThatRequest(result).wasDenied();
147+
}
148+
149+
public void assertDeleteGranted(@NonNull String url, Object... pathVariables) {
150+
var result = httpTestClient.delete(url, pathVariables)
151+
.body("{}")
152+
.returnRaw();
153+
154+
assertThatRequest(result).wasGranted();
155+
}
156+
157+
public void assertDeleteDenied(@NonNull String url, Object... pathVariables) {
158+
var result = httpTestClient.delete(url, pathVariables)
159+
.body("{}")
160+
.returnRaw();
161+
162+
assertThatRequest(result).wasDenied();
163+
}
164+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package it.aboutbits.springboot.testing.web.request;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.NonNull;
5+
import org.springframework.mock.web.MockMultipartFile;
6+
import org.springframework.mock.web.MockPart;
7+
import org.springframework.test.web.servlet.MockMvc;
8+
import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
import static org.springframework.http.MediaType.MULTIPART_FORM_DATA;
14+
15+
public abstract class MultipartRequest extends Request<MockMultipartHttpServletRequestBuilder> {
16+
protected List<MockPart> parts = new ArrayList<>();
17+
protected List<MockMultipartFile> files = new ArrayList<>();
18+
19+
MultipartRequest(
20+
@NonNull MockMvc mockMvc,
21+
@NonNull ObjectMapper objectMapper,
22+
@NonNull String url,
23+
@NonNull Object... pathVariables
24+
) {
25+
super(mockMvc, objectMapper, url, MULTIPART_FORM_DATA, pathVariables);
26+
}
27+
28+
public MultipartRequest part(@NonNull MockPart part) {
29+
parts.add(part);
30+
return this;
31+
}
32+
33+
public MultipartRequest file(@NonNull MockMultipartFile file) {
34+
files.add(file);
35+
return this;
36+
}
37+
38+
@Override
39+
protected @NonNull MockMultipartHttpServletRequestBuilder prepareRequestBuilder() {
40+
var requestBuilder = super.prepareRequestBuilder();
41+
42+
for (var file : files) {
43+
requestBuilder.file(file);
44+
}
45+
for (var part : parts) {
46+
requestBuilder.part(part);
47+
}
48+
49+
return requestBuilder;
50+
}
51+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package it.aboutbits.springboot.testing.web.request;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.NonNull;
5+
import org.springframework.test.web.servlet.MockMvc;
6+
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
7+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
8+
9+
import static org.springframework.http.MediaType.APPLICATION_JSON;
10+
11+
public class Patch extends Request<MockHttpServletRequestBuilder> {
12+
Patch(
13+
@NonNull MockMvc mockMvc,
14+
@NonNull ObjectMapper objectMapper,
15+
@NonNull String url,
16+
@NonNull Object... pathVariables
17+
) {
18+
super(mockMvc, objectMapper, url, APPLICATION_JSON, pathVariables);
19+
}
20+
21+
@Override
22+
protected @NonNull MockHttpServletRequestBuilder getRequestBuilder(@NonNull UrlWithVariables url) {
23+
return MockMvcRequestBuilders.patch(url.url(), url.pathVariables());
24+
}
25+
26+
@Override
27+
protected boolean useCsrf() {
28+
return true;
29+
}
30+
}

0 commit comments

Comments
 (0)