Skip to content

Commit 7a9b55d

Browse files
Merge pull request finos#1463 from grahampacker-ms/add-constraints-to-standards
Adding constrainst to Standards resource (finos#761)
2 parents c1adaa3 + a779aaa commit 7a9b55d

File tree

2 files changed

+124
-10
lines changed

2 files changed

+124
-10
lines changed

calm-hub/src/main/java/org/finos/calm/resources/StandardResource.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.finos.calm.resources;
22

3+
import jakarta.validation.constraints.Pattern;
34
import jakarta.ws.rs.*;
45
import jakarta.ws.rs.core.MediaType;
56
import jakarta.ws.rs.core.Response;
@@ -19,12 +20,17 @@
1920
import java.net.URI;
2021
import java.net.URISyntaxException;
2122

23+
import static org.finos.calm.resources.ResourceValidationConstants.NAMESPACE_MESSAGE;
24+
import static org.finos.calm.resources.ResourceValidationConstants.NAMESPACE_REGEX;
25+
import static org.finos.calm.resources.ResourceValidationConstants.VERSION_MESSAGE;
26+
import static org.finos.calm.resources.ResourceValidationConstants.VERSION_REGEX;
27+
2228
@Path("calm/namespaces")
2329
public class StandardResource {
2430

2531
private final StandardStore standardStore;
2632

27-
private final Logger logger = LoggerFactory.getLogger(StandardStore.class);
33+
private final Logger logger = LoggerFactory.getLogger(StandardResource.class);
2834

2935
public StandardResource(StandardStore standardStore) {
3036
this.standardStore = standardStore;
@@ -34,7 +40,9 @@ public StandardResource(StandardStore standardStore) {
3440
@Path("{namespace}/standards")
3541
@Produces(MediaType.APPLICATION_JSON)
3642
@PermittedScopes({CalmHubScopes.ARCHITECTURES_ALL, CalmHubScopes.ARCHITECTURES_READ})
37-
public Response getStandardsForNamespace(@PathParam("namespace") String namespace) {
43+
public Response getStandardsForNamespace(
44+
@PathParam("namespace") @Pattern(regexp = NAMESPACE_REGEX, message = NAMESPACE_MESSAGE) String namespace
45+
) {
3846
try {
3947
return Response.ok(new ValueWrapper<>(standardStore.getStandardsForNamespace(namespace))).build();
4048
} catch (NamespaceNotFoundException e) {
@@ -48,7 +56,10 @@ public Response getStandardsForNamespace(@PathParam("namespace") String namespac
4856
@Produces(MediaType.APPLICATION_JSON)
4957
@Consumes(MediaType.APPLICATION_JSON)
5058
@PermittedScopes({CalmHubScopes.ARCHITECTURES_ALL, CalmHubScopes.ARCHITECTURES_READ})
51-
public Response createStandardForNamespace(@PathParam("namespace") String namespace, CreateStandardRequest standard) throws URISyntaxException {
59+
public Response createStandardForNamespace(
60+
@PathParam("namespace") @Pattern(regexp = NAMESPACE_REGEX, message = NAMESPACE_MESSAGE) String namespace,
61+
CreateStandardRequest standard
62+
) throws URISyntaxException {
5263
try {
5364
Standard createdStandard = standardStore.createStandardForNamespace(standard, namespace);
5465
return Response.created(new URI("/calm/namespaces/" + namespace + "/standards/" + createdStandard.getId() + "/versions/1.0.0")).build();
@@ -62,7 +73,10 @@ public Response createStandardForNamespace(@PathParam("namespace") String namesp
6273
@Path("{namespace}/standards/{standardId}/versions")
6374
@Produces(MediaType.APPLICATION_JSON)
6475
@PermittedScopes({CalmHubScopes.ARCHITECTURES_ALL, CalmHubScopes.ARCHITECTURES_READ})
65-
public Response getStandardVersions(@PathParam("namespace") String namespace, @PathParam("standardId") Integer standardId) {
76+
public Response getStandardVersions(
77+
@PathParam("namespace") @Pattern(regexp = NAMESPACE_REGEX, message = NAMESPACE_MESSAGE) String namespace,
78+
@PathParam("standardId") Integer standardId
79+
) {
6680
try {
6781
return Response.ok(new ValueWrapper<>(standardStore.getStandardVersions(namespace, standardId))).build();
6882
} catch (NamespaceNotFoundException e) {
@@ -78,8 +92,11 @@ public Response getStandardVersions(@PathParam("namespace") String namespace, @P
7892
@Path("{namespace}/standards/{standardId}/versions/{version}")
7993
@Produces(MediaType.APPLICATION_JSON)
8094
@PermittedScopes({CalmHubScopes.ARCHITECTURES_ALL, CalmHubScopes.ARCHITECTURES_READ})
81-
public Response getStandardForVersion(@PathParam("namespace") String namespace, @PathParam("standardId") Integer standardId,
82-
@PathParam("version") String version) {
95+
public Response getStandardForVersion(
96+
@PathParam("namespace") @Pattern(regexp = NAMESPACE_REGEX, message = NAMESPACE_MESSAGE) String namespace,
97+
@PathParam("standardId") Integer standardId,
98+
@PathParam("version") @Pattern(regexp = VERSION_REGEX, message = VERSION_MESSAGE) String version
99+
) {
83100
try {
84101
return Response.ok(standardStore.getStandardForVersion(namespace, standardId, version)).build();
85102
} catch (StandardNotFoundException e) {
@@ -99,8 +116,12 @@ public Response getStandardForVersion(@PathParam("namespace") String namespace,
99116
@Produces(MediaType.APPLICATION_JSON)
100117
@Consumes(MediaType.APPLICATION_JSON)
101118
@PermittedScopes({CalmHubScopes.ARCHITECTURES_ALL, CalmHubScopes.ARCHITECTURES_READ})
102-
public Response createStandardForVersion(@PathParam("namespace") String namespace, @PathParam("standardId") Integer standardId,
103-
@PathParam("version") String version, CreateStandardRequest createStandardRequest) throws URISyntaxException {
119+
public Response createStandardForVersion(
120+
@PathParam("namespace") @Pattern(regexp = NAMESPACE_REGEX, message = NAMESPACE_MESSAGE) String namespace,
121+
@PathParam("standardId") Integer standardId,
122+
@PathParam("version") @Pattern(regexp = VERSION_REGEX, message = VERSION_MESSAGE) String version,
123+
CreateStandardRequest createStandardRequest
124+
) throws URISyntaxException {
104125

105126
try {
106127
standardStore.createStandardForVersion(createStandardRequest, namespace, standardId, version);

calm-hub/src/test/java/org/finos/calm/resources/TestStandardResourceShould.java

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.util.stream.Stream;
2626

2727
import static io.restassured.RestAssured.given;
28+
import static org.finos.calm.resources.ResourceValidationConstants.NAMESPACE_MESSAGE;
29+
import static org.finos.calm.resources.ResourceValidationConstants.VERSION_MESSAGE;
2830
import static org.hamcrest.Matchers.containsString;
2931
import static org.hamcrest.Matchers.equalTo;
3032
import static org.mockito.ArgumentMatchers.anyString;
@@ -49,7 +51,7 @@ void beforeEach() {
4951
}
5052

5153
@Test
52-
void return_a_404_when_an_invalid_namespace_is_provided_on_get_standards() throws NamespaceNotFoundException {
54+
void return_a_404_when_a_namespace_is_provided_that_does_not_exist_on_get_standards() throws NamespaceNotFoundException {
5355
when(mockStandardStore.getStandardsForNamespace(anyString())).thenThrow(new NamespaceNotFoundException());
5456

5557
given()
@@ -61,6 +63,16 @@ void return_a_404_when_an_invalid_namespace_is_provided_on_get_standards() throw
6163
verify(mockStandardStore).getStandardsForNamespace("invalid");
6264
}
6365

66+
@Test
67+
void return_a_400_when_an_invalid_namespace_is_provided_on_get_standards() {
68+
given()
69+
.when()
70+
.get("/calm/namespaces/$$$$$/standards")
71+
.then()
72+
.statusCode(400)
73+
.body(containsString(NAMESPACE_MESSAGE));
74+
}
75+
6476
@Test
6577
void return_list_of_standards_response_when_valid_namespace_provided_on_get_standards() throws NamespaceNotFoundException, JsonProcessingException {
6678
List<NamespaceStandardSummary> expectedStandardSummary = List.of(this.nistStandardSummary, this.finosStandardSummary);
@@ -81,7 +93,7 @@ void return_list_of_standards_response_when_valid_namespace_provided_on_get_stan
8193
}
8294

8395
@Test
84-
void return_a_404_when_invalid_namespace_is_provided_on_create_standards() throws NamespaceNotFoundException, JsonProcessingException {
96+
void return_a_404_when_namespace_is_provided_that_does_not_exist_on_create_standards() throws NamespaceNotFoundException, JsonProcessingException {
8597
when(mockStandardStore.createStandardForNamespace(any(CreateStandardRequest.class), eq("invalid"))).thenThrow(new NamespaceNotFoundException());
8698
CreateStandardRequest createStandardRequest = new CreateStandardRequest();
8799
createStandardRequest.setName("nist");
@@ -99,6 +111,23 @@ void return_a_404_when_invalid_namespace_is_provided_on_create_standards() throw
99111
verify(mockStandardStore).createStandardForNamespace(createStandardRequest, "invalid");
100112
}
101113

114+
@Test
115+
void return_a_400_when_invalid_namespace_is_provided_on_create_standards() throws JsonProcessingException {
116+
CreateStandardRequest createStandardRequest = new CreateStandardRequest();
117+
createStandardRequest.setName("nist");
118+
createStandardRequest.setDescription("NIST Standard");
119+
createStandardRequest.setStandardJson("{}");
120+
121+
given()
122+
.header("Content-Type", "application/json")
123+
.body(objectMapper.writeValueAsString(createStandardRequest))
124+
.when()
125+
.post("/calm/namespaces/$$$$$/standards")
126+
.then()
127+
.statusCode(400)
128+
.body(containsString(NAMESPACE_MESSAGE));
129+
}
130+
102131
@Test
103132
void return_a_created_status_code_with_location_of_standard_when_creating_a_standard() throws NamespaceNotFoundException, JsonProcessingException {
104133
Standard storedNist = new Standard("nist", "NIST Standard", "{ \"test\": \"json\" }", 5, "1.0.0");
@@ -120,6 +149,16 @@ void return_a_created_status_code_with_location_of_standard_when_creating_a_stan
120149
verify(mockStandardStore).createStandardForNamespace(createStandardRequest, "valid");
121150
}
122151

152+
@Test
153+
void return_400_when_invalid_namespace_provided_when_getting_versions_of_standard() {
154+
given()
155+
.when()
156+
.get("/calm/namespaces/$$$$$/standards/5/versions")
157+
.then()
158+
.statusCode(400)
159+
.body(containsString(NAMESPACE_MESSAGE));
160+
}
161+
123162
static Stream<Arguments> provideParametersForStandardVersionTests() {
124163
return Stream.of(
125164
Arguments.of("invalid", new NamespaceNotFoundException(), 404, "Invalid namespace provided"),
@@ -157,6 +196,26 @@ void respond_correctly_to_get_standard_versions_query(String namespace, Throwabl
157196
verify(mockStandardStore).getStandardVersions(namespace, 5);
158197
}
159198

199+
@Test
200+
void return_400_when_invalid_namespace_provided_when_getting_version_of_standard() {
201+
given()
202+
.when()
203+
.get("/calm/namespaces/$$$$/standards/5/versions/1.0.0")
204+
.then()
205+
.statusCode(400)
206+
.body(containsString(NAMESPACE_MESSAGE));
207+
}
208+
209+
@Test
210+
void return_400_when_invalid_version_provided_when_getting_version_of_standard() {
211+
given()
212+
.when()
213+
.get("/calm/namespaces/finos/standards/5/versions/invalid_version")
214+
.then()
215+
.statusCode(400)
216+
.body(containsString(VERSION_MESSAGE));
217+
}
218+
160219
static Stream<Arguments> provideParametersForGetStandardTests() {
161220
return Stream.of(
162221
Arguments.of("invalid", new NamespaceNotFoundException(), 404),
@@ -197,6 +256,40 @@ void respond_to_get_standard_for_a_specific_version_correctly(String namespace,
197256
}
198257
}
199258

259+
@Test
260+
void return_400_when_invalid_namespace_provided_when_creating_new_version_of_standard() {
261+
CreateStandardRequest createStandardRequest = new CreateStandardRequest();
262+
createStandardRequest.setName("amazing-standard");
263+
createStandardRequest.setDescription("An amazing standard");
264+
createStandardRequest.setStandardJson("{}");
265+
266+
given()
267+
.header("Content-Type", "application/json")
268+
.body(createStandardRequest)
269+
.when()
270+
.post("/calm/namespaces/$$$$/standards/5/versions/1.0.1")
271+
.then()
272+
.statusCode(400)
273+
.body(containsString(NAMESPACE_MESSAGE));
274+
}
275+
276+
@Test
277+
void return_400_when_invalid_version_provided_when_creating_new_version_of_standard() {
278+
CreateStandardRequest createStandardRequest = new CreateStandardRequest();
279+
createStandardRequest.setName("amazing-standard");
280+
createStandardRequest.setDescription("An amazing standard");
281+
createStandardRequest.setStandardJson("{}");
282+
283+
given()
284+
.header("Content-Type", "application/json")
285+
.body(createStandardRequest)
286+
.when()
287+
.post("/calm/namespaces/finos/standards/5/versions/invalid-version")
288+
.then()
289+
.statusCode(400)
290+
.body(containsString(VERSION_MESSAGE));
291+
}
292+
200293
static Stream<Arguments> provideParametersForCreateStandardTests() {
201294
return Stream.of(
202295
Arguments.of("invalid", new NamespaceNotFoundException(), 404),

0 commit comments

Comments
 (0)