Skip to content

Commit cd0eefd

Browse files
stephenokeefeItneet
authored andcommitted
Integration tests and Open API validation
1 parent 8c5e490 commit cd0eefd

File tree

10 files changed

+86
-23
lines changed

10 files changed

+86
-23
lines changed

src/integrationTest/java/uk/gov/hmcts/darts/authorisation/component/impl/AuthorisationImplTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import static uk.gov.hmcts.darts.common.enums.SecurityRoleEnum.JUDICIARY;
3030
import static uk.gov.hmcts.darts.common.enums.SecurityRoleEnum.REQUESTER;
3131
import static uk.gov.hmcts.darts.hearings.exception.HearingApiError.HEARING_NOT_FOUND;
32-
import static uk.gov.hmcts.darts.transcriptions.exception.TranscriptionApiError.TRANSCRIPTION_NOT_FOUND;
32+
import static uk.gov.hmcts.darts.transcriptions.exception.TranscriptionApiError.BAD_REQUEST_TRANSCRIPTION_ID;
3333

3434
class AuthorisationImplTest extends IntegrationBase {
3535

@@ -222,8 +222,8 @@ void authoriseByTranscriptionIdShouldThrowTranscriptionApiErrorTranscriptionNotF
222222
-1L, Set.of(JUDICIARY))
223223
);
224224

225-
assertEquals(TRANSCRIPTION_NOT_FOUND.getTitle(), exception.getMessage());
226-
assertEquals(TRANSCRIPTION_NOT_FOUND, exception.getError());
225+
assertEquals(BAD_REQUEST_TRANSCRIPTION_ID.getTitle(), exception.getMessage());
226+
assertEquals(BAD_REQUEST_TRANSCRIPTION_ID, exception.getError());
227227
}
228228

229229
@Test

src/integrationTest/java/uk/gov/hmcts/darts/transcriptions/api/TranscriptionOpenApiContractTest.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
import com.atlassian.oai.validator.model.Request;
55
import com.atlassian.oai.validator.model.SimpleRequest;
66
import com.atlassian.oai.validator.report.ValidationReport;
7-
import lombok.extern.slf4j.Slf4j;
87
import org.junit.jupiter.api.Test;
98

109
import static org.junit.jupiter.api.Assertions.assertTrue;
1110

12-
@Slf4j
1311
class TranscriptionOpenApiContractTest {
1412

1513
private static final OpenApiInteractionValidator VALIDATOR =
@@ -20,14 +18,39 @@ class TranscriptionOpenApiContractTest {
2018
).build();
2119

2220
@Test
23-
void negativeTranscriptionId() {
21+
void openApi_ShouldReturnError_WhenNegativeTranscriptionIdUsed() {
2422
Request request = SimpleRequest.Builder
25-
.get("/transcriptions/-1/document")
23+
.get("/transcriptions/-123/document")
2624
.build();
2725

2826
ValidationReport report = VALIDATOR.validateRequest(request);
2927

30-
assertTrue(report.hasErrors());
31-
report.getMessages().forEach(m -> log.info(m.getMessage()));
28+
assertTrue(report.getMessages().stream()
29+
.anyMatch(m -> m.getMessage().contains("Numeric instance is lower than the required " +
30+
"minimum (minimum: 1, found: -123)")));
31+
}
32+
33+
@Test
34+
void openApi_ShouldReturnError_WhenAboveMaximumTranscriptionIdUsed() {
35+
Request request = SimpleRequest.Builder
36+
.get("/transcriptions/922337203685477580799/document")
37+
.build();
38+
39+
ValidationReport report = VALIDATOR.validateRequest(request);
40+
41+
assertTrue(report.getMessages().stream()
42+
.anyMatch(m -> m.getMessage().contains("Numeric instance is greater than the required" +
43+
" maximum (maximum: 9223372036854775807, found: 922337203685477580799)")));
44+
}
45+
46+
@Test
47+
void openApi_ShouldReturnNoError_WhenValidTranscriptionIdUsed() {
48+
Request request = SimpleRequest.Builder
49+
.get("/transcriptions/1000/document")
50+
.build();
51+
52+
ValidationReport report = VALIDATOR.validateRequest(request);
53+
54+
assertTrue(report.getMessages().isEmpty(), "Expected no validation errors for a valid transcription_id");
3255
}
3356
}

src/integrationTest/java/uk/gov/hmcts/darts/transcriptions/controller/TranscriptionControllerDownloadTranscriptIntTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,13 +328,13 @@ void downloadTranscript_ShouldReturnError_WhenNegativeTranscriptionIdUsed() thro
328328
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
329329
);
330330
MvcResult mvcResult = mockMvc.perform(requestBuilder)
331-
.andExpect(status().isNotFound())
331+
.andExpect(status().isBadRequest())
332332
.andReturn();
333333

334334
String actualResponse = mvcResult.getResponse().getContentAsString();
335335

336336
String expectedResponse = """
337-
{"type":"TRANSCRIPTION_101","title":"The requested transcription cannot be found","status":404}
337+
{"type":"TRANSCRIPTION_124","title":"Invalid transcription id","status":400}
338338
""";
339339
JSONAssert.assertEquals(expectedResponse, actualResponse, JSONCompareMode.NON_EXTENSIBLE);
340340

src/integrationTest/java/uk/gov/hmcts/darts/transcriptions/controller/TranscriptionControllerGetTranscriptionTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,11 @@ void getTranscriptionNotFoundWhenIsCurrentFalse() throws Exception {
287287
}
288288

289289
@Test
290-
void getTranscriptionNotFound() throws Exception {
290+
void getTranscriptionBadRequest() throws Exception {
291291
MockHttpServletRequestBuilder requestBuilder = get(ENDPOINT_URL_TRANSCRIPTION, -999);
292-
MvcResult response = mockMvc.perform(requestBuilder).andExpect(status().isNotFound()).andReturn();
292+
MvcResult response = mockMvc.perform(requestBuilder).andExpect(status().isBadRequest()).andReturn();
293293
String actualResponse = response.getResponse().getContentAsString();
294-
String expectedResponse = getContentsFromFile("tests/transcriptions/transcription/expectedResponseNotFound.json");
294+
String expectedResponse = getContentsFromFile("tests/transcriptions/transcription/expectedResponseBadRequest.json");
295295
JSONAssert.assertEquals(expectedResponse, actualResponse, JSONCompareMode.NON_EXTENSIBLE);
296296
}
297297

src/integrationTest/java/uk/gov/hmcts/darts/transcriptions/controller/TranscriptionControllerUpdateTranscriptionWithTranscriberIntTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,12 @@ void updateTranscriptionShouldReturnTranscriptionNotFoundError() throws Exceptio
142142
.header("Content-Type", "application/json")
143143
.content(objectMapper.writeValueAsString(updateTranscription));
144144
MvcResult mvcResult = mockMvc.perform(requestBuilder)
145-
.andExpect(status().isNotFound())
145+
.andExpect(status().isBadRequest())
146146
.andReturn();
147147

148148
String actualJson = mvcResult.getResponse().getContentAsString();
149149
String expectedJson = """
150-
{"type":"TRANSCRIPTION_101","title":"The requested transcription cannot be found","status":404}
150+
{"type":"TRANSCRIPTION_124","title":"Invalid transcription id","status":400}
151151
""";
152152
JSONAssert.assertEquals(expectedJson, actualJson, JSONCompareMode.NON_EXTENSIBLE);
153153

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"type":"TRANSCRIPTION_124","title":"Invalid transcription id","status":400}

src/main/java/uk/gov/hmcts/darts/authorisation/component/impl/AuthorisationImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
66
import org.apache.commons.collections4.CollectionUtils;
7+
import org.apache.coyote.BadRequestException;
78
import org.springframework.stereotype.Component;
89
import uk.gov.hmcts.darts.audio.entity.MediaRequestEntity;
910
import uk.gov.hmcts.darts.authorisation.api.AuthorisationApi;
@@ -22,6 +23,7 @@
2223
import uk.gov.hmcts.darts.common.repository.MediaRequestRepository;
2324
import uk.gov.hmcts.darts.common.repository.TranscriptionRepository;
2425
import uk.gov.hmcts.darts.common.repository.TransformedMediaRepository;
26+
import uk.gov.hmcts.darts.util.DataUtil;
2527

2628
import java.util.Collections;
2729
import java.util.List;
@@ -36,6 +38,7 @@
3638
import static uk.gov.hmcts.darts.audio.exception.AudioRequestsApiError.TRANSFORMED_MEDIA_NOT_FOUND;
3739
import static uk.gov.hmcts.darts.cases.exception.CaseApiError.CASE_NOT_FOUND;
3840
import static uk.gov.hmcts.darts.hearings.exception.HearingApiError.HEARING_NOT_FOUND;
41+
import static uk.gov.hmcts.darts.transcriptions.exception.TranscriptionApiError.BAD_REQUEST_TRANSCRIPTION_ID;
3942
import static uk.gov.hmcts.darts.transcriptions.exception.TranscriptionApiError.TRANSCRIPTION_NOT_FOUND;
4043

4144
@Component
@@ -115,6 +118,9 @@ public void authoriseByMediaId(Long mediaId, Set<SecurityRoleEnum> securityRoles
115118
@SuppressWarnings({"PMD.ExceptionAsFlowControl"})
116119
public void authoriseByTranscriptionId(Long transcriptionId, Set<SecurityRoleEnum> securityRoles) {
117120
try {
121+
if (!DataUtil.isWithinBounds(transcriptionId, 1L, 9_223_372_036_854_775_807L)) {
122+
throw new BadRequestException();
123+
}
118124
final List<CourthouseEntity> courthouses = getCourthousesFromTranscription(transcriptionId);
119125
if (CollectionUtils.isEmpty(courthouses)) {
120126
throw new EntityNotFoundException();
@@ -123,6 +129,9 @@ public void authoriseByTranscriptionId(Long transcriptionId, Set<SecurityRoleEnu
123129
} catch (EntityNotFoundException ex) {
124130
log.error("Unable to find Transcription-Courtroom-Courthouse for checkAuthorisation. TranscriptionId={}", transcriptionId, ex);
125131
throw new DartsApiException(TRANSCRIPTION_NOT_FOUND, ex);
132+
} catch (BadRequestException ex) {
133+
log.error("TranscriptionId is out of accepted range. TranscriptionId={}", transcriptionId, ex);
134+
throw new DartsApiException(BAD_REQUEST_TRANSCRIPTION_ID, ex);
126135
}
127136
}
128137

src/main/java/uk/gov/hmcts/darts/transcriptions/exception/TranscriptionApiError.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,12 @@ public enum TranscriptionApiError implements DartsApiError {
133133
TOO_MANY_RESULTS(
134134
TranscriptionsErrorCode.TOO_MANY_RESULTS.getValue(),
135135
HttpStatus.UNPROCESSABLE_ENTITY,
136-
TranscriptionsTitleErrors.TOO_MANY_RESULTS.getValue());
136+
TranscriptionsTitleErrors.TOO_MANY_RESULTS.getValue()
137+
),
138+
BAD_REQUEST_TRANSCRIPTION_ID(
139+
TranscriptionsErrorCode.BAD_REQUEST_TRANSCRIPTION_ID.getValue(),
140+
HttpStatus.BAD_REQUEST,
141+
TranscriptionsTitleErrors.BAD_REQUEST_TRANSCRIPTION_ID.getValue());
137142

138143

139144
private static final String ERROR_TYPE_PREFIX = "TRANSCRIPTION";

src/main/java/uk/gov/hmcts/darts/util/DataUtil.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,15 @@ public static boolean toBoolean(Boolean value) {
125125
public static boolean toBoolean(Boolean value, boolean defaultValue) {
126126
return Optional.ofNullable(value).orElse(defaultValue);
127127
}
128+
129+
public static boolean isWithinBounds(Long value, Long min, Long max) {
130+
if (value == null) {
131+
return false;
132+
}
133+
if (min != null && value < min) {
134+
return false;
135+
}
136+
return max == null || value <= max;
137+
}
138+
128139
}

src/main/resources/openapi/transcriptions.yaml

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,17 @@ paths:
396396
content:
397397
application/json+problem:
398398
schema:
399-
$ref: './problem.yaml'
399+
allOf:
400+
- $ref: './problem.yaml'
401+
- type: object
402+
required:
403+
- type
404+
properties:
405+
type:
406+
$ref: '#/components/schemas/DownloadTranscript400ErrorCode'
400407
example:
401-
type: "TRANSCRIPTION_109"
402-
title: "Failed to download transcript"
408+
type: "TRANSCRIPTION_124"
409+
title: "Invalid transcription id"
403410
status: 400
404411
'401':
405412
description: Unauthorised Error
@@ -1482,7 +1489,12 @@ components:
14821489
type: integer
14831490
description: The number of assigned transcript requests for a user with transcriber role.
14841491
example: 3
1485-
1492+
DownloadTranscript400ErrorCode:
1493+
type: string
1494+
enum:
1495+
- "TRANSCRIPTION_124"
1496+
x-enum-varnames:
1497+
- BAD_REQUEST_TRANSCRIPTION_ID
14861498
UpdateTranscriptions400ErrorCode:
14871499
type: string
14881500
enum:
@@ -1983,8 +1995,9 @@ components:
19831995
- "TRANSCRIPTION_121"
19841996
- "TRANSCRIPTION_122"
19851997
- "TRANSCRIPTION_123"
1998+
- "TRANSCRIPTION_124"
19861999
x-enum-varnames: [ FAILED_TO_VALIDATE_TRANSCRIPTION_REQUEST, TRANSCRIPTION_NOT_FOUND, BAD_REQUEST_TRANSCRIPTION_STATUS, BAD_REQUEST_WORKFLOW_COMMENT, BAD_REQUEST_TRANSCRIPTION_TYPE, TRANSCRIPTION_WORKFLOW_ACTION_INVALID, BAD_REQUEST_TRANSCRIPTION_URGENCY, DUPLICATE_TRANSCRIPTION, FAILED_TO_ATTACH_TRANSCRIPT, AUDIO_NOT_FOUND, FAILED_TO_UPDATE_TRANSCRIPTIONS, TRANSCRIPTION_DOCUMENT_NOT_FOUND, TRANSCRIPTION_DOCUMENT_ALREADY_HIDDEN, TRANSCRIPTION_DOCUMENT_HIDE_ACTION_PAYLOAD_INCORRECT_USAGE, TRANSCRIPTION_DOCUMENT_SHOW_ACTION_PAYLOAD_INCORRECT_USAGE, TRANSCRIPTION_DOCUMENT_HIDE_ACTION_REASON_NOT_FOUND,
1987-
TRANSCRIPTION_DOCUMENT_DELETE_NOT_SUPPORTED, TRANSCRIPTION_DOCUMENT_DELETION_ALREADY_APPROVED, TRANSCRIPTION_DOCUMENT_DELETION_CAN_NOT_APPROVE_OWN_REQUEST, TOO_MANY_RESULTS, TRANSCRIPTION_DOCUMENT_MARKED_FOR_DELETION_REASON_NOT_FOUND,FAILED_TO_UPLOAD_TRANSCRIPT ]
2000+
TRANSCRIPTION_DOCUMENT_DELETE_NOT_SUPPORTED, TRANSCRIPTION_DOCUMENT_DELETION_ALREADY_APPROVED, TRANSCRIPTION_DOCUMENT_DELETION_CAN_NOT_APPROVE_OWN_REQUEST, TOO_MANY_RESULTS, TRANSCRIPTION_DOCUMENT_MARKED_FOR_DELETION_REASON_NOT_FOUND,FAILED_TO_UPLOAD_TRANSCRIPT, BAD_REQUEST_TRANSCRIPTION_ID]
19882001

19892002
TranscriptionsTitleErrors:
19902003
type: string
@@ -2012,6 +2025,7 @@ components:
20122025
- "Too many results"
20132026
- "Transcription document marked for deletion reason not found"
20142027
- "Failed to upload transcript"
2028+
- "Invalid transcription id"
20152029

20162030
x-enum-varnames: [ FAILED_TO_VALIDATE_TRANSCRIPTION_REQUEST, TRANSCRIPTION_NOT_FOUND, BAD_REQUEST_TRANSCRIPTION_STATUS, BAD_REQUEST_WORKFLOW_COMMENT, BAD_REQUEST_TRANSCRIPTION_TYPE, TRANSCRIPTION_WORKFLOW_ACTION_INVALID, BAD_REQUEST_TRANSCRIPTION_URGENCY, DUPLICATE_TRANSCRIPTION, FAILED_TO_ATTACH_TRANSCRIPT, AUDIO_NOT_FOUND, FAILED_TO_UPDATE_TRANSCRIPTIONS, TRANSCRIPTION_DOCUMENT_NOT_FOUND, TRANSCRIPTION_DOCUMENT_ALREADY_HIDDEN, TRANSCRIPTION_DOCUMENT_HIDE_ACTION_PAYLOAD_INCORRECT_USAGE, TRANSCRIPTION_DOCUMENT_SHOW_ACTION_PAYLOAD_INCORRECT_USAGE,
2017-
TRANSCRIPTION_DOCUMENT_HIDE_ACTION_REASON_NOT_FOUND, TRANSCRIPTION_DOCUMENT_HIDE_ACTION_REASON_MARKED_FOR_DELETION, TRANSCRIPTION_DOCUMENT_DELETE_NOT_SUPPORTED, TRANSCRIPTION_DOCUMENT_DELETION_ALREADY_APPROVED, TRANSCRIPTION_DOCUMENT_DELETION_CAN_NOT_APPROVE_OWN_REQUEST, TOO_MANY_RESULTS, TRANSCRIPTION_DOCUMENT_MARKED_FOR_DELETION_REASON_NOT_FOUND,FAILED_TO_UPLOAD_TRANSCRIPT ]
2031+
TRANSCRIPTION_DOCUMENT_HIDE_ACTION_REASON_NOT_FOUND, TRANSCRIPTION_DOCUMENT_HIDE_ACTION_REASON_MARKED_FOR_DELETION, TRANSCRIPTION_DOCUMENT_DELETE_NOT_SUPPORTED, TRANSCRIPTION_DOCUMENT_DELETION_ALREADY_APPROVED, TRANSCRIPTION_DOCUMENT_DELETION_CAN_NOT_APPROVE_OWN_REQUEST, TOO_MANY_RESULTS, TRANSCRIPTION_DOCUMENT_MARKED_FOR_DELETION_REASON_NOT_FOUND,FAILED_TO_UPLOAD_TRANSCRIPT , BAD_REQUEST_TRANSCRIPTION_ID]

0 commit comments

Comments
 (0)