Skip to content

Commit f0f47e1

Browse files
committed
Fix null response to 404
1 parent d963cee commit f0f47e1

14 files changed

+43
-79
lines changed

api/src/main/java/ca/bc/gov/educ/api/course/config/RestErrorHandler.java

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package ca.bc.gov.educ.api.course.config;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
4+
import ca.bc.gov.educ.api.course.exception.GradBusinessRuleException;
5+
import ca.bc.gov.educ.api.course.util.ApiResponseMessage.MessageTypeEnum;
6+
import ca.bc.gov.educ.api.course.util.ApiResponseModel;
7+
import ca.bc.gov.educ.api.course.util.GradValidation;
38
import org.hibernate.dialect.lock.OptimisticEntityLockException;
49
import org.hibernate.exception.ConstraintViolationException;
510
import org.jboss.logging.Logger;
@@ -15,11 +20,6 @@
1520
import org.springframework.web.context.request.WebRequest;
1621
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
1722

18-
import ca.bc.gov.educ.api.course.util.ApiResponseMessage.MessageTypeEnum;
19-
import ca.bc.gov.educ.api.course.util.ApiResponseModel;
20-
import ca.bc.gov.educ.api.course.exception.GradBusinessRuleException;
21-
import ca.bc.gov.educ.api.course.util.GradValidation;
22-
2323
@ControllerAdvice
2424
public class RestErrorHandler extends ResponseEntityExceptionHandler {
2525

@@ -55,16 +55,17 @@ protected ResponseEntity<Object> handleAuthorizationErrors(Exception ex, WebRequ
5555
return new ResponseEntity<>(ApiResponseModel.ERROR(null, message), HttpStatus.FORBIDDEN);
5656
}
5757

58-
@ExceptionHandler(value = { GradBusinessRuleException.class })
59-
protected ResponseEntity<Object> handleIrisBusinessException(Exception ex, WebRequest request) {
60-
ApiResponseModel<?> response = ApiResponseModel.ERROR(null);
58+
@ExceptionHandler(value = { GradBusinessRuleException.class, EntityNotFoundException.class })
59+
protected ResponseEntity<Object> handleGradBusinessException(Exception ex, WebRequest request) {
60+
ApiResponseModel<?> response = ApiResponseModel.ERROR(request.toString());
6161
validation.ifErrors(response::addErrorMessages);
6262
validation.ifWarnings(response::addWarningMessages);
6363
if (response.getMessages().isEmpty()) {
6464
response.addMessageItem(ex.getLocalizedMessage(), MessageTypeEnum.ERROR);
6565
}
6666
validation.clear();
67-
return new ResponseEntity<>(response, HttpStatus.UNPROCESSABLE_ENTITY);
67+
HttpStatus httpStatus = (ex instanceof EntityNotFoundException) ? HttpStatus.NOT_FOUND : HttpStatus.UNPROCESSABLE_ENTITY;
68+
return new ResponseEntity<>(response, httpStatus);
6869
}
6970

7071
@ExceptionHandler(value = { OptimisticEntityLockException.class })

api/src/main/java/ca/bc/gov/educ/api/course/controller/EquivalentOrChallengeCodeController.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1111
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1212
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
13-
import org.springframework.http.HttpStatusCode;
1413
import org.springframework.http.ResponseEntity;
1514
import org.springframework.security.access.prepost.PreAuthorize;
1615
import org.springframework.web.bind.annotation.GetMapping;
@@ -45,11 +44,6 @@ public ResponseEntity<List<EquivalentOrChallengeCode>> getEquivalentOrChallengeC
4544
@Operation(summary = "Find Equivalent Or Challenge Code", description = "Find Equivalent Or Challenge Code", tags = {"Equivalent Or Challenge Code"})
4645
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "NOT FOUND")})
4746
public ResponseEntity<EquivalentOrChallengeCode> getEquivalentOrChallengeCode(@PathVariable String equivalentOrChallengeCode) {
48-
EquivalentOrChallengeCode result = equivalentOrChallengeCodeService.getEquivalentOrChallengeCode(equivalentOrChallengeCode);
49-
if(result != null) {
50-
return ResponseEntity.ok().body(result);
51-
} else {
52-
return ResponseEntity.status(HttpStatusCode.valueOf(404)).body(null);
53-
}
47+
return ResponseEntity.ok().body(equivalentOrChallengeCodeService.getEquivalentOrChallengeCode(equivalentOrChallengeCode));
5448
}
5549
}

api/src/main/java/ca/bc/gov/educ/api/course/controller/ExamSpecialCaseCodeController.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1111
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1212
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
13-
import org.springframework.http.HttpStatusCode;
1413
import org.springframework.http.ResponseEntity;
1514
import org.springframework.security.access.prepost.PreAuthorize;
1615
import org.springframework.web.bind.annotation.GetMapping;
@@ -45,11 +44,6 @@ public ResponseEntity<List<ExamSpecialCaseCode>> getExamSpecialCaseCodes() {
4544
@Operation(summary = "Find Exam Special Case Code", description = "Find Exam Special Case Code", tags = {"Exam Special Case Code"})
4645
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "NOT FOUND")})
4746
public ResponseEntity<ExamSpecialCaseCode> getExamSpecialCaseCode(@PathVariable String examSpecialCaseCode) {
48-
ExamSpecialCaseCode result = examSpecialCaseCodeService.getExamSpecialCaseCode(examSpecialCaseCode);
49-
if(result != null) {
50-
return ResponseEntity.ok().body(result);
51-
} else {
52-
return ResponseEntity.status(HttpStatusCode.valueOf(404)).body(null);
53-
}
47+
return ResponseEntity.ok().body(examSpecialCaseCodeService.getExamSpecialCaseCode(examSpecialCaseCode));
5448
}
5549
}

api/src/main/java/ca/bc/gov/educ/api/course/controller/FineArtsAppliedSkillsCodeController.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1111
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1212
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
13-
import org.springframework.http.HttpStatusCode;
1413
import org.springframework.http.ResponseEntity;
1514
import org.springframework.security.access.prepost.PreAuthorize;
1615
import org.springframework.web.bind.annotation.GetMapping;
@@ -45,11 +44,6 @@ public ResponseEntity<List<FineArtsAppliedSkillsCode>> getFineArtsAppliedSkillsC
4544
@Operation(summary = "Find Fine Arts Applied Skills Code", description = "Find Fine Arts Applied Skills Code", tags = {"Fine Arts Applied Skills Code"})
4645
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "NOT FOUND")})
4746
public ResponseEntity<FineArtsAppliedSkillsCode> getFineArtsAppliedSkillsCode(@PathVariable String fineArtsAppliedSkillsCode) {
48-
FineArtsAppliedSkillsCode result = fineArtsAppliedSkillsCodeService.getFineArtsAppliedSkillsCode(fineArtsAppliedSkillsCode);
49-
if(result != null) {
50-
return ResponseEntity.ok().body(result);
51-
} else {
52-
return ResponseEntity.status(HttpStatusCode.valueOf(404)).body(null);
53-
}
47+
return ResponseEntity.ok().body(fineArtsAppliedSkillsCodeService.getFineArtsAppliedSkillsCode(fineArtsAppliedSkillsCode));
5448
}
5549
}

api/src/main/java/ca/bc/gov/educ/api/course/exception/EntityNotFoundException.java

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ca.bc.gov.educ.api.course.exception;
22

33
import org.apache.commons.lang3.StringUtils;
4+
45
import java.util.HashMap;
56
import java.util.Map;
67
import java.util.stream.IntStream;
@@ -17,6 +18,10 @@ public EntityNotFoundException(Class<?> clazz, String... searchParamsMap) {
1718
super(EntityNotFoundException.generateMessage(clazz.getSimpleName(), toMap(String.class, String.class, searchParamsMap)));
1819
}
1920

21+
public EntityNotFoundException(String message) {
22+
super(message);
23+
}
24+
2025
private static String generateMessage(String entity, Map<String, String> searchParams) {
2126
return StringUtils.capitalize(entity) +
2227
" was not found for parameters " +

api/src/main/java/ca/bc/gov/educ/api/course/service/EquivalentOrChallengeCodeService.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.bc.gov.educ.api.course.service;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
34
import ca.bc.gov.educ.api.course.model.dto.EquivalentOrChallengeCode;
45
import ca.bc.gov.educ.api.course.model.transformer.EquivalentOrChallengeCodeTransformer;
56
import ca.bc.gov.educ.api.course.repository.EquivalentOrChallengeCodeRepository;
@@ -39,8 +40,10 @@ public List<EquivalentOrChallengeCode> getEquivalentOrChallengeCodeList() {
3940
* @return EquivalentOrChallengeCode
4041
*/
4142
@Retry(name = "generalgetcall")
42-
public EquivalentOrChallengeCode getEquivalentOrChallengeCode(String equivalentOrChallengeCode) {
43-
return equivalentOrChallengeCodeTransformer.transformToDTO(equivalentOrChallengeCodeRepository.findById(equivalentOrChallengeCode));
43+
public EquivalentOrChallengeCode getEquivalentOrChallengeCode(String equivalentOrChallengeCode) throws EntityNotFoundException {
44+
EquivalentOrChallengeCode result = equivalentOrChallengeCodeTransformer.transformToDTO(equivalentOrChallengeCodeRepository.findById(equivalentOrChallengeCode));
45+
if(result != null) return result;
46+
throw new EntityNotFoundException(String.format("Equivalent Or Challenge Code %s not found", equivalentOrChallengeCode));
4447
}
4548

4649
private List<EquivalentOrChallengeCode> sort(List<EquivalentOrChallengeCode> equivalentOrChallengeCodes) {

api/src/main/java/ca/bc/gov/educ/api/course/service/ExamSpecialCaseCodeService.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.bc.gov.educ.api.course.service;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
34
import ca.bc.gov.educ.api.course.model.dto.ExamSpecialCaseCode;
45
import ca.bc.gov.educ.api.course.model.transformer.ExamSpecialCaseCodeTransformer;
56
import ca.bc.gov.educ.api.course.repository.ExamSpecialCaseCodeRepository;
@@ -40,7 +41,9 @@ public List<ExamSpecialCaseCode> getExamSpecialCaseCodeList() {
4041
*/
4142
@Retry(name = "generalgetcall")
4243
public ExamSpecialCaseCode getExamSpecialCaseCode(String examSpecialCaseCode) {
43-
return examSpecialCaseCodeTransformer.transformToDTO(examSpecialCaseCodeRepository.findById(examSpecialCaseCode));
44+
ExamSpecialCaseCode result = examSpecialCaseCodeTransformer.transformToDTO(examSpecialCaseCodeRepository.findById(examSpecialCaseCode));
45+
if(result != null) return result;
46+
throw new EntityNotFoundException(String.format("Exam Special Code %s not found", examSpecialCaseCode));
4447
}
4548

4649
private List<ExamSpecialCaseCode> sort(List<ExamSpecialCaseCode> examSpecialCaseCodes) {

api/src/main/java/ca/bc/gov/educ/api/course/service/FineArtsAppliedSkillsCodeService.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.bc.gov.educ.api.course.service;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
34
import ca.bc.gov.educ.api.course.model.dto.FineArtsAppliedSkillsCode;
45
import ca.bc.gov.educ.api.course.model.transformer.FineArtsAppliedSkillsCodeTransformer;
56
import ca.bc.gov.educ.api.course.repository.FineArtsAppliedSkillsCodeRepository;
@@ -40,7 +41,9 @@ public List<FineArtsAppliedSkillsCode> getFineArtsAppliedSkillsCodeList() {
4041
*/
4142
@Retry(name = "generalgetcall")
4243
public FineArtsAppliedSkillsCode getFineArtsAppliedSkillsCode(String fineArtsAppliedSkillsCode) {
43-
return fineArtsAppliedSkillsCodeTransformer.transformToDTO(fineArtsAppliedSkillsCodeRepository.findById(fineArtsAppliedSkillsCode));
44+
FineArtsAppliedSkillsCode result = fineArtsAppliedSkillsCodeTransformer.transformToDTO(fineArtsAppliedSkillsCodeRepository.findById(fineArtsAppliedSkillsCode));
45+
if(result != null) return result;
46+
throw new EntityNotFoundException(String.format("Fine Art Applied Skills Code %s not found", fineArtsAppliedSkillsCode));
4447
}
4548

4649
private List<FineArtsAppliedSkillsCode> sort(List<FineArtsAppliedSkillsCode> fineArtsAppliedSkillsCodes) {

api/src/test/java/ca/bc/gov/educ/api/course/controller/EquivalentOrChallengeCodeControllerTest.java

-9
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import java.util.List;
1818

1919
import static org.junit.Assert.assertNotNull;
20-
import static org.junit.Assert.assertTrue;
2120

2221

2322
@RunWith(MockitoJUnitRunner.class)
@@ -59,12 +58,4 @@ public void testGetEquivalentOrChallengeCode() {
5958
equivalentOrChallengeCodeController.getEquivalentOrChallengeCode("equivalentOrChallengeCode");
6059
Mockito.verify(equivalentOrChallengeCodeService).getEquivalentOrChallengeCode("equivalentOrChallengeCode");
6160
}
62-
63-
@Test
64-
public void testGetEquivalentOrChallengeCode_noContent() {
65-
Mockito.when(equivalentOrChallengeCodeService.getEquivalentOrChallengeCode("equivalentOrChallengeCode")).thenReturn(null);
66-
ResponseEntity<EquivalentOrChallengeCode> result = equivalentOrChallengeCodeController.getEquivalentOrChallengeCode("equivalentOrChallengeCode");
67-
Mockito.verify(equivalentOrChallengeCodeService).getEquivalentOrChallengeCode("equivalentOrChallengeCode");
68-
assertTrue(result.getStatusCode().is4xxClientError());
69-
}
7061
}

api/src/test/java/ca/bc/gov/educ/api/course/controller/ExamSpecialCaseCodeControllerTest.java

-11
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,11 @@
1010
import org.mockito.Mockito;
1111
import org.mockito.junit.MockitoJUnitRunner;
1212
import org.mockito.junit.jupiter.MockitoExtension;
13-
import org.springframework.http.ResponseEntity;
1413

1514
import java.sql.Date;
1615
import java.util.ArrayList;
1716
import java.util.List;
1817

19-
import static org.junit.Assert.assertTrue;
20-
2118

2219
@RunWith(MockitoJUnitRunner.class)
2320
@ExtendWith(MockitoExtension.class)
@@ -59,12 +56,4 @@ public void testGetExamSpecialCaseCode() {
5956
examSpecialCaseCodeController.getExamSpecialCaseCode("examSpecialCaseCode");
6057
Mockito.verify(examSpecialCaseCodeService).getExamSpecialCaseCode("examSpecialCaseCode");
6158
}
62-
63-
@Test
64-
public void testGetExamSpecialCaseCode_noContent() {
65-
Mockito.when(examSpecialCaseCodeService.getExamSpecialCaseCode("examSpecialCaseCode")).thenReturn(null);
66-
ResponseEntity<ExamSpecialCaseCode> result = examSpecialCaseCodeController.getExamSpecialCaseCode("examSpecialCaseCode");
67-
Mockito.verify(examSpecialCaseCodeService).getExamSpecialCaseCode("examSpecialCaseCode");
68-
assertTrue(result.getStatusCode().is4xxClientError());
69-
}
7059
}

api/src/test/java/ca/bc/gov/educ/api/course/controller/FineArtsAppliedSkillsCodeControllerTest.java

+1-11
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,11 @@
1010
import org.mockito.Mockito;
1111
import org.mockito.junit.MockitoJUnitRunner;
1212
import org.mockito.junit.jupiter.MockitoExtension;
13-
import org.springframework.http.ResponseEntity;
1413

1514
import java.sql.Date;
1615
import java.util.ArrayList;
1716
import java.util.List;
1817

19-
import static org.junit.Assert.assertTrue;
20-
2118

2219
@RunWith(MockitoJUnitRunner.class)
2320
@ExtendWith(MockitoExtension.class)
@@ -59,12 +56,5 @@ public void testGetFineArtsAppliedSkillsCode() {
5956
fineArtsAppliedSkillsCodeController.getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
6057
Mockito.verify(fineArtsAppliedSkillsCodeService).getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
6158
}
62-
63-
@Test
64-
public void testGetFineArtsAppliedSkillsCode_noContent() {
65-
Mockito.when(fineArtsAppliedSkillsCodeService.getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode")).thenReturn(null);
66-
ResponseEntity<FineArtsAppliedSkillsCode> result = fineArtsAppliedSkillsCodeController.getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
67-
Mockito.verify(fineArtsAppliedSkillsCodeService).getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
68-
assertTrue(result.getStatusCode().is4xxClientError());
69-
}
59+
7060
}

api/src/test/java/ca/bc/gov/educ/api/course/service/EquivalentOrChallengeCodeServiceTest.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.bc.gov.educ.api.course.service;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
34
import ca.bc.gov.educ.api.course.model.entity.EquivalentOrChallengeCodeEntity;
45
import ca.bc.gov.educ.api.course.repository.EquivalentOrChallengeCodeRepository;
56
import org.junit.Test;
@@ -18,7 +19,6 @@
1819

1920
import static org.assertj.core.api.Assertions.assertThat;
2021
import static org.junit.Assert.assertNotNull;
21-
import static org.junit.Assert.assertNull;
2222

2323
@RunWith(SpringRunner.class)
2424
@SpringBootTest
@@ -62,10 +62,9 @@ public void testGetEquivalentOrChallengeCode() {
6262
assertNotNull(result);
6363
}
6464

65-
@Test
65+
@Test(expected=EntityNotFoundException.class)
6666
public void testGetEquivalentOrChallengeCode_noContent() {
6767
Mockito.when(equivalentOrChallengeCodeRepository.findById("equivalentOrChallengeCode")).thenReturn(Optional.empty());
68-
var result = equivalentOrChallengeCodeService.getEquivalentOrChallengeCode("equivalentOrChallengeCode");
69-
assertNull(result);
68+
equivalentOrChallengeCodeService.getEquivalentOrChallengeCode("equivalentOrChallengeCode");
7069
}
7170
}

api/src/test/java/ca/bc/gov/educ/api/course/service/ExamSpecialCaseCodeServiceTest.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.bc.gov.educ.api.course.service;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
34
import ca.bc.gov.educ.api.course.model.entity.ExamSpecialCaseCodeEntity;
45
import ca.bc.gov.educ.api.course.repository.ExamSpecialCaseCodeRepository;
56
import org.junit.Test;
@@ -18,7 +19,6 @@
1819

1920
import static org.assertj.core.api.Assertions.assertThat;
2021
import static org.junit.Assert.assertNotNull;
21-
import static org.junit.Assert.assertNull;
2222

2323
@RunWith(SpringRunner.class)
2424
@SpringBootTest
@@ -61,11 +61,10 @@ public void testGetExamSpecialCaseCode() {
6161
var result = examSpecialCaseCodeService.getExamSpecialCaseCode("examSpecialCaseCode");
6262
assertNotNull(result);
6363
}
64-
65-
@Test
64+
65+
@Test(expected= EntityNotFoundException.class)
6666
public void testGetExamSpecialCaseCode_noContent() {
6767
Mockito.when(examSpecialCaseCodeRepository.findById("examSpecialCaseCode")).thenReturn(Optional.empty());
68-
var result = examSpecialCaseCodeService.getExamSpecialCaseCode("examSpecialCaseCode");
69-
assertNull(result);
68+
examSpecialCaseCodeService.getExamSpecialCaseCode("examSpecialCaseCode");
7069
}
7170
}

api/src/test/java/ca/bc/gov/educ/api/course/service/FineArtsAppliedSkillsCodeServiceTest.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.bc.gov.educ.api.course.service;
22

3+
import ca.bc.gov.educ.api.course.exception.EntityNotFoundException;
34
import ca.bc.gov.educ.api.course.model.entity.FineArtsAppliedSkillsCodeEntity;
45
import ca.bc.gov.educ.api.course.repository.FineArtsAppliedSkillsCodeRepository;
56
import org.junit.Test;
@@ -18,7 +19,6 @@
1819

1920
import static org.assertj.core.api.Assertions.assertThat;
2021
import static org.junit.Assert.assertNotNull;
21-
import static org.junit.Assert.assertNull;
2222

2323
@RunWith(SpringRunner.class)
2424
@SpringBootTest
@@ -61,11 +61,10 @@ public void testGetFineArtsAppliedSkillsCode() {
6161
var result = fineArtsAppliedSkillsCodeService.getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
6262
assertNotNull(result);
6363
}
64-
65-
@Test
64+
65+
@Test(expected= EntityNotFoundException.class)
6666
public void testGetFineArtsAppliedSkillsCode_noContent() {
6767
Mockito.when(fineArtsAppliedSkillsCodeRepository.findById("fineArtsAppliedSkillsCode")).thenReturn(Optional.empty());
68-
var result = fineArtsAppliedSkillsCodeService.getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
69-
assertNull(result);
68+
fineArtsAppliedSkillsCodeService.getFineArtsAppliedSkillsCode("fineArtsAppliedSkillsCode");
7069
}
7170
}

0 commit comments

Comments
 (0)