From c12c9c8e9d092274783a72e3c24785467edac852 Mon Sep 17 00:00:00 2001 From: Phil Payne Date: Wed, 22 May 2024 10:43:26 +0100 Subject: [PATCH] Story(CCLS-2099) Post assessment endpoint includes amendments to the PUT request to update existing assessments --- assessment-api/open-api-specification.yml | 147 ++++++++++-------- ...seAssessmentControllerIntegrationTest.java | 23 ++- .../controller/AssessmentController.java | 24 ++- .../caab/assessment/entity/AuditTrail.java | 6 +- .../caab/assessment/entity/OpaAttribute.java | 6 +- .../caab/assessment/entity/OpaCheckpoint.java | 6 +- .../caab/assessment/entity/OpaEntity.java | 12 +- .../caab/assessment/entity/OpaListEntity.java | 6 +- .../assessment/entity/OpaRelationship.java | 6 +- .../entity/OpaRelationshipTarget.java | 6 +- .../caab/assessment/entity/OpaSession.java | 7 +- .../assessment/mapper/AssessmentMapper.java | 4 + .../assessment/service/AssessmentService.java | 35 ++++- .../controller/AssessmentControllerTest.java | 25 ++- .../service/AssessmentServiceTest.java | 40 +++-- 15 files changed, 246 insertions(+), 107 deletions(-) diff --git a/assessment-api/open-api-specification.yml b/assessment-api/open-api-specification.yml index 4bbfe1c..cd1002e 100644 --- a/assessment-api/open-api-specification.yml +++ b/assessment-api/open-api-specification.yml @@ -11,21 +11,9 @@ paths: operationId: 'getAssessments' parameters: - $ref: '#/components/parameters/assessmentType' - - name: 'provider-id' - in: 'query' - schema: - type: 'string' - example: '1234567890' - - name: 'case-reference-number' - in: 'query' - schema: - type: 'string' - example: '1234567890' - - name: 'status' - in: 'query' - schema: - type: 'string' - example: 'INCOMPLETE' + - $ref: '#/components/parameters/providerId' + - $ref: '#/components/parameters/caseReferenceNumber' + - $ref: '#/components/parameters/status' responses: '200': description: 'Successful operation' @@ -41,28 +29,6 @@ paths: description: 'Not found' '500': description: 'Internal server error' - put: - tags: - - assessments - summary: 'update an existing assessment' - operationId: 'updateAssessment' - parameters: - - $ref: '#/components/parameters/requiredUserLoginId' - requestBody: - description: update an existing assessment - content: - application/json: - schema: - $ref: '#/components/schemas/assessmentDetail' - responses: - '204': - description: 'Successful update' - '400': - description: 'Bad request' - '401': - description: 'Unauthorized' - '500': - description: 'Internal server error' delete: tags: - assessments @@ -83,11 +49,7 @@ paths: schema: type: 'string' example: '1234567890' - - name: 'status' - in: 'query' - schema: - type: 'string' - example: 'INCOMPLETE' + - $ref: '#/components/parameters/status' responses: '204': description: 'Successful deletion' @@ -99,6 +61,28 @@ paths: description: 'Not found' '500': description: 'Internal server error' + post: + tags: + - assessments + summary: 'create an assessment' + operationId: 'createAssessment' + parameters: + - $ref: '#/components/parameters/requiredUserLoginId' + requestBody: + description: create an assessment + content: + application/json: + schema: + $ref: '#/components/schemas/assessmentDetail' + responses: + '201': + description: 'Successful create' + '400': + description: 'Bad request' + '401': + description: 'Unauthorized' + '500': + description: 'Internal server error' /assessments/{assessment-id}: get: tags: @@ -106,13 +90,7 @@ paths: summary: 'get assessment by id ' operationId: 'getAssessment' parameters: - - name: 'assessment-id' - in: 'path' - required: true - schema: - type: 'integer' - format: 'int64' - example: '1234567890' + - $ref: '#/components/parameters/assessmentId' responses: '200': description: 'Successful operation' @@ -128,6 +106,29 @@ paths: description: 'Not found' '500': description: 'Internal server error' + put: + tags: + - assessments + summary: 'update an existing assessment' + operationId: 'updateAssessment' + parameters: + - $ref: '#/components/parameters/assessmentId' + - $ref: '#/components/parameters/requiredUserLoginId' + requestBody: + description: update an existing assessment + content: + application/json: + schema: + $ref: '#/components/schemas/assessmentDetail' + responses: + '204': + description: 'Successful update' + '400': + description: 'Bad request' + '401': + description: 'Unauthorized' + '500': + description: 'Internal server error' patch: tags: - assessments @@ -140,13 +141,7 @@ paths: schema: $ref: '#/components/schemas/patchAssessmentDetail' parameters: - - name: 'assessment-id' - in: 'path' - required: true - schema: - type: 'integer' - format: 'int64' - example: '1234567890' + - $ref: '#/components/parameters/assessmentId' - $ref: '#/components/parameters/requiredUserLoginId' responses: '204': @@ -166,13 +161,7 @@ paths: summary: 'delete checkpoint from assessment' operationId: 'deleteAssessmentCheckpoint' parameters: - - name: 'assessment-id' - in: 'path' - required: true - schema: - type: 'integer' - format: 'int64' - example: '1234567890' + - $ref: '#/components/parameters/assessmentId' - $ref: '#/components/parameters/requiredUserLoginId' responses: '204': @@ -204,7 +193,14 @@ components: - 'meansAssessment_PREPOP' - 'meritsAssessment' - 'meritsAssessment_PREPOP' - + assessmentId: + name: 'assessment-id' + in: 'path' + required: true + schema: + type: 'integer' + format: 'int64' + example: '1234567890' requiredUserLoginId: name: 'Caab-User-Login-Id' in: header @@ -212,6 +208,24 @@ components: schema: type: 'string' example: 'SOMEUSER@COMPANY.CO.UK' + providerId: + name: 'provider-id' + in: 'query' + schema: + type: 'string' + example: '1234567890' + caseReferenceNumber: + name: 'case-reference-number' + in: 'query' + schema: + type: 'string' + example: '1234567890' + status: + name: 'status' + in: 'query' + schema: + type: 'string' + example: 'INCOMPLETE' schemas: assessmentDetails: @@ -289,7 +303,6 @@ components: items: $ref: '#/components/schemas/assessmentEntityDetail' required: - - id - entityType - entities assessmentEntityDetail: @@ -312,8 +325,9 @@ components: $ref: '#/components/schemas/assessmentRelationshipDetail' prepopulated: type: boolean + completed: + type: boolean required: - - id - entityId - prepopulated assessmentAttributeDetail: @@ -333,7 +347,6 @@ components: asked: type: boolean required: - - id - attributeId assessmentRelationshipDetail: type: object diff --git a/assessment-service/src/integrationTest/java/uk/gov/laa/ccms/caab/assessment/controller/BaseAssessmentControllerIntegrationTest.java b/assessment-service/src/integrationTest/java/uk/gov/laa/ccms/caab/assessment/controller/BaseAssessmentControllerIntegrationTest.java index e33de7b..5cca8be 100644 --- a/assessment-service/src/integrationTest/java/uk/gov/laa/ccms/caab/assessment/controller/BaseAssessmentControllerIntegrationTest.java +++ b/assessment-service/src/integrationTest/java/uk/gov/laa/ccms/caab/assessment/controller/BaseAssessmentControllerIntegrationTest.java @@ -5,11 +5,12 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static uk.gov.laa.ccms.caab.assessment.audit.AuditorAwareImpl.currentUserHolder; import jakarta.transaction.Transactional; import java.util.List; import java.util.stream.Stream; -import javax.management.relation.Relation; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -32,6 +33,21 @@ public abstract class BaseAssessmentControllerIntegrationTest { @Autowired private AssessmentController assessmentController; + protected final String caabUserLoginId = "audit@user.com"; + + @Test + @Transactional + public void testCreateAssessment_expect201() { + + currentUserHolder.set(caabUserLoginId); + + AssessmentDetail assessment = buildAssessmentDetail(); + ResponseEntity response = + assessmentController.createAssessment(caabUserLoginId, assessment); + + assertEquals(HttpStatus.CREATED, response.getStatusCode()); + } + //get by id expect 200 @Test @Sql(scripts = "/sql/assessments_insert.sql") @@ -189,11 +205,12 @@ private static Stream updateAssessmentArguments_base() { @Sql(scripts = "/sql/assessments_insert.sql") @Transactional public void testUpdateAssessment() { - final String loginId = "testUser"; + final Long assessmentId = 26L; + currentUserHolder.set(caabUserLoginId); AssessmentDetail expected = buildAssessmentDetail(); - ResponseEntity response = assessmentController.updateAssessment(loginId, expected); + ResponseEntity response = assessmentController.updateAssessment(assessmentId, caabUserLoginId, expected); assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode()); ResponseEntity updatedResponse = assessmentController.getAssessment(expected.getId()); diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentController.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentController.java index 1fbacec..8f34cf2 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentController.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentController.java @@ -1,10 +1,12 @@ package uk.gov.laa.ccms.caab.assessment.controller; +import java.net.URI; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import uk.gov.laa.ccms.caab.assessment.api.AssessmentsApi; import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetail; import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetails; @@ -57,6 +59,21 @@ public ResponseEntity getAssessments( return ResponseEntity.ok(assessmentService.getAssessments(criteria, name)); } + @Override + public ResponseEntity createAssessment( + final String caabUserLoginId, + final AssessmentDetail assessment) { + + Long assessmentId = assessmentService.createAssessment(assessment); + + URI uri = ServletUriComponentsBuilder.fromCurrentRequest() + .path("/{id}") + .buildAndExpand(assessmentId) + .toUri(); + + return ResponseEntity.created(uri).build(); + } + @Override public ResponseEntity deleteAssessmentCheckpoint( final Long assessmentId, @@ -117,17 +134,22 @@ public ResponseEntity patchAssessment( /** * updates an assessment. * + * @param assessmentId The ID of the assessment to update. * @param caabUserLoginId The CAAB user login ID performing the update. * @param assessment The details to update the assessment with. * @return ResponseEntity with the status of the update operation. */ @Override public ResponseEntity updateAssessment( + final Long assessmentId, final String caabUserLoginId, final AssessmentDetail assessment) { - assessmentService.updateAssessment(assessment); + assessmentService.updateAssessment(assessmentId, assessment); return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + + + } diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/AuditTrail.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/AuditTrail.java index db60012..a086cb8 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/AuditTrail.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/AuditTrail.java @@ -3,7 +3,8 @@ import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import java.util.Date; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import org.springframework.data.annotation.CreatedBy; @@ -13,7 +14,8 @@ * Represents an audit trail for various entities within the CCMS system. */ @Embeddable -@Data +@Getter +@Setter public class AuditTrail { /** diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaAttribute.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaAttribute.java index 263b1c9..b5f0256 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaAttribute.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaAttribute.java @@ -10,7 +10,8 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.hibernate.type.NumericBooleanConverter; /** @@ -22,7 +23,8 @@ allocationSize = 1, name = "XXCCMS_OPA_ATTRIBUTE_S", sequenceName = "XXCCMS_OPA_GENERATED_ID_S") -@Data +@Getter +@Setter public class OpaAttribute { /** diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaCheckpoint.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaCheckpoint.java index c0d4fc3..0208587 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaCheckpoint.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaCheckpoint.java @@ -9,14 +9,16 @@ import jakarta.persistence.MapsId; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; /** * Represents an Oracle Intelligence Advisor Checkpoint. */ @Entity @Table(name = "XXCCMS_OPA_CHECKPOINT") -@Data +@Getter +@Setter public class OpaCheckpoint { @Id diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaEntity.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaEntity.java index eab18e7..05584eb 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaEntity.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaEntity.java @@ -13,7 +13,8 @@ import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; import java.util.List; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.hibernate.type.NumericBooleanConverter; /** @@ -25,7 +26,8 @@ allocationSize = 1, name = "XXCCMS_OPA_ENTITY_S", sequenceName = "XXCCMS_OPA_GENERATED_ID_S") -@Data +@Getter +@Setter public class OpaEntity { /** @@ -88,5 +90,11 @@ public class OpaEntity { @Convert(converter = NumericBooleanConverter.class) private Boolean prepopulated; + @Column(name = "COMPLETED") + @Convert(converter = NumericBooleanConverter.class) + private Boolean completed; + + + } diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaListEntity.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaListEntity.java index 753b83c..7afe127 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaListEntity.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaListEntity.java @@ -12,7 +12,8 @@ import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; import java.util.List; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; /** * Represents an Oracle Intelligence Advisor list entity. @@ -23,7 +24,8 @@ allocationSize = 1, name = "XXCCMS_OPA_LIST_ENTITY_S", sequenceName = "XXCCMS_OPA_GENERATED_ID_S") -@Data +@Getter +@Setter public class OpaListEntity { diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationship.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationship.java index e6cb737..ac879a2 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationship.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationship.java @@ -14,7 +14,8 @@ import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; import java.util.Set; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.hibernate.type.NumericBooleanConverter; /** @@ -26,7 +27,8 @@ allocationSize = 1, name = "XXCCMS_OPA_RELATIONSHIP_S", sequenceName = "XXCCMS_OPA_GENERATED_ID_S") -@Data +@Getter +@Setter public class OpaRelationship { /** diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationshipTarget.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationshipTarget.java index 68d5e0f..0b06002 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationshipTarget.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaRelationshipTarget.java @@ -6,7 +6,8 @@ import jakarta.persistence.Id; import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; /** * Represents an Oracle Intelligence Advisor relationship target. @@ -17,7 +18,8 @@ allocationSize = 1, name = "XXCCMS_OPA_RELATIONSHIP_TARGET_S", sequenceName = "XXCCMS_OPA_GENERATED_ID_S") -@Data +@Getter +@Setter public class OpaRelationshipTarget { /** diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaSession.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaSession.java index 62b6292..13f2706 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaSession.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/entity/OpaSession.java @@ -13,7 +13,8 @@ import jakarta.persistence.SequenceGenerator; import jakarta.persistence.Table; import java.util.List; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; import org.springframework.data.jpa.domain.support.AuditingEntityListener; /** @@ -21,12 +22,12 @@ */ @Entity @Table(name = "XXCCMS_OPA_SESSION") - @SequenceGenerator( allocationSize = 1, name = "XXCCMS_OPASESSION_GENERATED_ID_S", sequenceName = "XXCCMS_OPA_GENERATED_ID_S") -@Data +@Getter +@Setter @EntityListeners(AuditingEntityListener.class) public class OpaSession { diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/mapper/AssessmentMapper.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/mapper/AssessmentMapper.java index 152190b..6a91236 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/mapper/AssessmentMapper.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/mapper/AssessmentMapper.java @@ -37,6 +37,10 @@ public interface AssessmentMapper { @Mapping(target = "auditTrail", ignore = true) OpaSession toOpaSession(AssessmentDetail assessmentDetail); + @Mapping(target = "id", ignore = true) + @Mapping(target = "opaSession", ignore = true) + OpaCheckpoint toOpaCheckpoint(AssessmentCheckpointDetail assessmentCheckpointDetail); + /** * Post-processes the OpaSession after mapping from AssessmentDetail. * diff --git a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentService.java b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentService.java index 292aff3..fc2d6cc 100644 --- a/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentService.java +++ b/assessment-service/src/main/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentService.java @@ -61,6 +61,23 @@ public AssessmentDetail getAssessment(Long assessmentId) { HttpStatus.NOT_FOUND)); } + + /** + * Creates an assessment and saves it to the repository. + * + * @param assessmentDetail the details of the assessment to be created + * @return the ID of the created assessment + */ + @Transactional + public Long createAssessment( + final AssessmentDetail assessmentDetail) { + + OpaSession assessment = assessmentMapper.toOpaSession(assessmentDetail); + opaSessionRepository.save(assessment); + + return assessment.getId(); + } + /** * Deletes assessments from the repository based on specified criteria and a list of names. * @@ -102,22 +119,24 @@ public void deleteCheckpoint( } /** - * Updates the given assessment. + * Updates an assessment in the database. * - * @param assessment the assessment details to update - * @throws ApplicationException if the assessment with the specified ID is not found + * @param assessmentId The ID of the assessment to update. + * @param assessment The new details to be applied to the assessment. + * @throws ApplicationException if the assessment with the specified ID + * does not exist. */ @Transactional public void updateAssessment( + final Long assessmentId, final AssessmentDetail assessment) { - OpaSession opaSession = assessmentMapper.toOpaSession(assessment); - if (opaSessionRepository.existsById(opaSession.getId())) { - opaSessionRepository.save(opaSession); + if (opaSessionRepository.existsById(assessmentId)) { + OpaSession session = assessmentMapper.toOpaSession(assessment); + opaSessionRepository.save(session); } else { throw new ApplicationException( - String.format("Assessment with id %s not found", opaSession.getId()), - HttpStatus.NOT_FOUND); + String.format("Assessment with id %s not found", assessmentId), HttpStatus.NOT_FOUND); } } diff --git a/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentControllerTest.java b/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentControllerTest.java index a899c31..c9c7832 100644 --- a/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentControllerTest.java +++ b/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/controller/AssessmentControllerTest.java @@ -5,7 +5,9 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -37,6 +39,24 @@ class AssessmentControllerTest { @Autowired private MockMvc mockMvc; + @Test + public void createAssessment_createsAssessmentSuccessfully() throws Exception { + Long assessmentId = 1L; + AssessmentDetail assessmentDetail = new AssessmentDetail(); + + when(assessmentService.createAssessment(assessmentDetail)).thenReturn(assessmentId); + + this.mockMvc.perform(post("/assessments") + .header("caab-User-Login-Id", "TestUser") + .content(new ObjectMapper().writeValueAsString(assessmentDetail)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(header().string("Location", "http://localhost/assessments/" + assessmentId)); + + verify(assessmentService).createAssessment(assessmentDetail); + } + + @Test public void getAssessment() throws Exception { Long assessmentId = 1L; @@ -170,15 +190,16 @@ public void patchAssessment_returnsNoContent_whenPatchIsSuccessful() throws Exce @Test public void updateAssessment_returnsNoContent_whenUpdateIsSuccessful() throws Exception { + Long assessmentId = 1L; AssessmentDetail assessment = new AssessmentDetail(); - this.mockMvc.perform(put("/assessments") + this.mockMvc.perform(put("/assessments/{assessment-id}", assessmentId) .header("caab-User-Login-Id", "TestUser") .content(new ObjectMapper().writeValueAsString(assessment)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isNoContent()); - verify(assessmentService).updateAssessment(assessment); + verify(assessmentService).updateAssessment(assessmentId, assessment); } } \ No newline at end of file diff --git a/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentServiceTest.java b/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentServiceTest.java index 4b9130c..a4b291a 100644 --- a/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentServiceTest.java +++ b/assessment-service/src/test/java/uk/gov/laa/ccms/caab/assessment/service/AssessmentServiceTest.java @@ -6,16 +6,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Path; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -226,7 +220,7 @@ void updateAssessment_updatesExistingAssessment() { when(assessmentMapper.toOpaSession(assessmentDetail)).thenReturn(existingOpaSession); when(opaSessionRepository.existsById(existingAssessmentId)).thenReturn(true); - assessmentService.updateAssessment(assessmentDetail); + assessmentService.updateAssessment(existingAssessmentId, assessmentDetail); verify(opaSessionRepository).save(existingOpaSession); } @@ -239,15 +233,43 @@ void updateAssessment_throwsExceptionWhenAssessmentNotFound() { OpaSession nonExistingOpaSession = new OpaSession(); nonExistingOpaSession.setId(nonExistingAssessmentId); - when(assessmentMapper.toOpaSession(assessmentDetail)).thenReturn(nonExistingOpaSession); when(opaSessionRepository.existsById(nonExistingAssessmentId)).thenReturn(false); Exception exception = assertThrows(ApplicationException.class, () -> { - assessmentService.updateAssessment(assessmentDetail); + assessmentService.updateAssessment(nonExistingAssessmentId, assessmentDetail); }); assertEquals(String.format("Assessment with id %s not found", nonExistingAssessmentId), exception.getMessage()); verify(opaSessionRepository, never()).save(any()); } + @Test + void testCreateAssessment() { + AssessmentDetail assessmentDetail = new AssessmentDetail(); + OpaSession session = new OpaSession(); + session.setId(1L); + + when(assessmentMapper.toOpaSession(assessmentDetail)).thenReturn(session); + when(opaSessionRepository.save(session)).thenReturn(session); + + Long createdId = assessmentService.createAssessment(assessmentDetail); + + assertNotNull(createdId); + assertEquals(session.getId(), createdId); + verify(assessmentMapper).toOpaSession(assessmentDetail); + verify(opaSessionRepository).save(session); + } + + @Test + void testBuildQuerySpecification() { + OpaSession session = new OpaSession(); + Example example = Example.of(session); + List names = List.of("name1", "name2"); + + Specification specification = assessmentService.buildQuerySpecification(example, names); + + assertNotNull(specification); + } + + } \ No newline at end of file