Skip to content

Commit

Permalink
story(ccls-2366) add evidence patch endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilDigitalJustice committed Oct 1, 2024
1 parent f5f89dd commit e2a0e8f
Show file tree
Hide file tree
Showing 8 changed files with 191 additions and 3 deletions.
38 changes: 35 additions & 3 deletions caab-api/open-api-specification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ paths:
- applications
summary: 'Update an Application'
operationId: 'updateApplication'

requestBody:
description: Update an application
content:
Expand All @@ -135,8 +134,8 @@ paths:
- $ref: '#/components/parameters/id'
- $ref: '#/components/parameters/caabUserLoginId'
responses:
'200':
description: 'Successful operation'
'204':
description: 'Update successful'
'400':
description: 'Bad request'
'401':
Expand Down Expand Up @@ -1368,6 +1367,39 @@ paths:
description: 'Not found'
'500':
description: 'Internal server error'
patch:
tags:
- evidence
summary: 'Update Evidence Document'
operationId: 'updateEvidenceDocument'
requestBody:
description: Update Evidence Document
content:
application/json:
schema:
$ref: '#/components/schemas/evidenceDocumentDetail'
parameters:
- name: 'evidence-document-id'
in: 'path'
required: true
schema:
type: 'integer'
format: 'int64'
example: '1234567890'
- $ref: '#/components/parameters/caabUserLoginId'
responses:
'200':
description: 'Evidence updated successfully'
'400':
description: 'Bad request'
'401':
description: 'Unauthorized'
'403':
description: 'Forbidden'
'404':
description: 'Not found'
'500':
description: 'Internal server error'
delete:
tags:
- evidence
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,4 +293,51 @@ private static void compareData(EvidenceDocumentDetail retrievedEvidenceDocument
assertEquals(retrievedEvidenceDocumentDetails.getFileName(), baseEvidenceDocumentDetail.getFileName());
assertEquals(retrievedEvidenceDocumentDetails.getProviderId(), baseEvidenceDocumentDetail.getProviderId());
}

@Test
@Sql(scripts = "/sql/evidence_document_insert.sql")
public void testUpdateEvidenceDocument() throws Exception {

// Load the updated evidence document details from a JSON file
EvidenceDocumentDetail updatedEvidenceDocumentDetail = loadObjectFromJson(
"/json/evidence_document_update.json", EvidenceDocumentDetail.class);

// The registeredDocumentId for the document to be updated
Long registeredDocumentId = 3L;

String auditUser = "[email protected]";

// Retrieve the original evidence document before the update
EvidenceDocumentDetail originalEvidenceDocument = evidenceService.getEvidenceDocument(registeredDocumentId);

// Call the updateEvidenceDocument method directly
ResponseEntity<Void> responseEntity =
evidenceController.updateEvidenceDocument(registeredDocumentId, auditUser, updatedEvidenceDocumentDetail);

assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());

// Retrieve the updated evidence document and assert the changes
EvidenceDocumentDetail updatedEvidenceDocument = evidenceService.getEvidenceDocument(registeredDocumentId);

// Assert that the registeredDocumentId has changed as expected
assertEquals("345", updatedEvidenceDocument.getRegisteredDocumentId());

// Check that all other fields are unchanged
assertEquals(originalEvidenceDocument.getApplicationOrOutcomeId(), updatedEvidenceDocument.getApplicationOrOutcomeId());
assertEquals(originalEvidenceDocument.getCaseReferenceNumber(), updatedEvidenceDocument.getCaseReferenceNumber());
assertEquals(originalEvidenceDocument.getProviderId(), updatedEvidenceDocument.getProviderId());
assertEquals(originalEvidenceDocument.getDocumentType(), updatedEvidenceDocument.getDocumentType());
assertEquals(originalEvidenceDocument.getDescription(), updatedEvidenceDocument.getDescription());
assertEquals(originalEvidenceDocument.getFileName(), updatedEvidenceDocument.getFileName());
assertEquals(originalEvidenceDocument.getFileExtension(), updatedEvidenceDocument.getFileExtension());
assertEquals(originalEvidenceDocument.getEvidenceDescriptions(), updatedEvidenceDocument.getEvidenceDescriptions());
assertEquals(originalEvidenceDocument.getNotificationReference(), updatedEvidenceDocument.getNotificationReference());
assertEquals(originalEvidenceDocument.getTransferRetryCount(), updatedEvidenceDocument.getTransferRetryCount());
assertEquals(originalEvidenceDocument.getTransferResponseCode(), updatedEvidenceDocument.getTransferResponseCode());
assertEquals(originalEvidenceDocument.getTransferResponseDescription(), updatedEvidenceDocument.getTransferResponseDescription());
assertEquals(originalEvidenceDocument.getTransferStatus(), updatedEvidenceDocument.getTransferStatus());
assertEquals(originalEvidenceDocument.getDocumentSender(), updatedEvidenceDocument.getDocumentSender());
assertEquals(originalEvidenceDocument.getCcmsModule(), updatedEvidenceDocument.getCcmsModule());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"registered_document_id": "345"
}
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,14 @@ public ResponseEntity<Void> removeEvidenceDocuments(
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

@Override
public ResponseEntity<Void> updateEvidenceDocument(
final Long evidenceDocumentId,
final String caabUserLoginId,
final EvidenceDocumentDetail evidenceDocumentDetail) {

evidenceService.updateEvidence(evidenceDocumentId, evidenceDocumentDetail);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package uk.gov.laa.ccms.caab.api.mapper;


import org.mapstruct.BeanMapping;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.springframework.data.domain.Page;
import uk.gov.laa.ccms.caab.api.entity.Application;
import uk.gov.laa.ccms.caab.model.ApplicationDetail;
import uk.gov.laa.ccms.caab.model.BaseEvidenceDocumentDetail;
import uk.gov.laa.ccms.caab.model.EvidenceDocumentDetail;
import uk.gov.laa.ccms.caab.model.EvidenceDocumentDetails;
Expand Down Expand Up @@ -38,4 +44,10 @@ EvidenceDocumentDetail toEvidenceDocumentDetail(
uk.gov.laa.ccms.caab.api.entity.EvidenceDocument toEvidenceDocument(
final EvidenceDocumentDetail evidenceDocumentDetail);

@InheritConfiguration(name = "toEvidenceDocument")
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void mapIntoEvidence(
@MappingTarget uk.gov.laa.ccms.caab.api.entity.EvidenceDocument evidence,
EvidenceDocumentDetail evidenceDocumentDetail);

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import uk.gov.laa.ccms.caab.api.entity.Application;
import uk.gov.laa.ccms.caab.api.entity.EvidenceDocument;
import uk.gov.laa.ccms.caab.api.exception.CaabApiException;
import uk.gov.laa.ccms.caab.api.mapper.EvidenceMapper;
import uk.gov.laa.ccms.caab.api.repository.EvidenceDocumentRepository;
import uk.gov.laa.ccms.caab.model.ApplicationDetail;
import uk.gov.laa.ccms.caab.model.EvidenceDocumentDetail;
import uk.gov.laa.ccms.caab.model.EvidenceDocumentDetails;

Expand Down Expand Up @@ -66,6 +68,27 @@ public EvidenceDocumentDetails getEvidenceDocuments(final String applicationOrOu
pageable));
}

/**
* Updates the evidence with the provided details.
*
* @param id the ID of the evidence to update
* @param evidenceDocumentDetail the new details to update the evidence with
* @throws CaabApiException if the evidence with the given ID is not found
*/
@Transactional
public void updateEvidence(
final Long id,
final EvidenceDocumentDetail evidenceDocumentDetail) {

EvidenceDocument evidence = repository.findById(id)
.orElseThrow(() -> new CaabApiException(
String.format("Failed to find evidence with id: %s", id),
HttpStatus.NOT_FOUND));

mapper.mapIntoEvidence(evidence, evidenceDocumentDetail);
repository.save(evidence);
}

/**
* Get a single EvidenceDocumentDetail by id.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static org.mockito.Mockito.when;
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.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
Expand All @@ -16,6 +17,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand Down Expand Up @@ -151,4 +153,23 @@ public void removeEvidenceDocuments_callsServiceMethod() throws Exception {
evidenceDocumentDetail.getCcmsModule(),
Boolean.TRUE);
}

@Test
@DisplayName("updateEvidenceDocument updates the evidence document and returns no content")
public void updateEvidenceDocument_UpdatesAndReturnsNoContent() throws Exception {
Long evidenceDocumentId = 2L;
EvidenceDocumentDetail evidenceDocumentDetail = buildEvidenceDocumentDetail();

doNothing().when(evidenceService).updateEvidence(evidenceDocumentId, evidenceDocumentDetail);

this.mockMvc.perform(
patch("/evidence/{evidenceDocumentId}", evidenceDocumentId)
.header("Caab-User-Login-Id", caabUserLoginId)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(evidenceDocumentDetail)))
.andExpect(status().isNoContent());

verify(evidenceService).updateEvidence(evidenceDocumentId, evidenceDocumentDetail);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static uk.gov.laa.ccms.caab.api.util.ModelUtils.buildEvidenceDocument;
import static uk.gov.laa.ccms.caab.api.util.ModelUtils.buildEvidenceDocumentDetail;

import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand All @@ -30,6 +32,7 @@
import uk.gov.laa.ccms.caab.model.EvidenceDocumentDetail;
import uk.gov.laa.ccms.caab.model.EvidenceDocumentDetails;


@ExtendWith(MockitoExtension.class)
class EvidenceServiceTest {
@Mock
Expand Down Expand Up @@ -150,5 +153,42 @@ void removeEvidenceDocumentDetails_deletesBasedOnExample() {
verify(repository).deleteAll(evidenceDocuments);

}

@Test
@DisplayName("updateEvidence updates the evidence document when it exists")
void updateEvidence_UpdatesWhenExists() {
Long evidenceDocumentId = 1L;
EvidenceDocumentDetail evidenceDocumentDetail = buildEvidenceDocumentDetail();
EvidenceDocument existingEvidenceDocument = buildEvidenceDocument();

when(repository.findById(evidenceDocumentId)).thenReturn(Optional.of(existingEvidenceDocument));
doNothing().when(mapper).mapIntoEvidence(existingEvidenceDocument, evidenceDocumentDetail);
when(repository.save(existingEvidenceDocument)).thenReturn(existingEvidenceDocument);

evidenceService.updateEvidence(evidenceDocumentId, evidenceDocumentDetail);

verify(repository).findById(evidenceDocumentId);
verify(mapper).mapIntoEvidence(existingEvidenceDocument, evidenceDocumentDetail);
verify(repository).save(existingEvidenceDocument);
}

@Test
@DisplayName("updateEvidence throws exception when evidence document is not found")
void updateEvidence_ThrowsExceptionWhenNotFound() {
Long evidenceDocumentId = 1L;
EvidenceDocumentDetail evidenceDocumentDetail = buildEvidenceDocumentDetail();

when(repository.findById(evidenceDocumentId)).thenReturn(Optional.empty());

CaabApiException exception = assertThrows(CaabApiException.class, () ->
evidenceService.updateEvidence(evidenceDocumentId, evidenceDocumentDetail));

assertEquals(String.format("Failed to find evidence with id: %s", evidenceDocumentId), exception.getMessage());
assertEquals(HttpStatus.NOT_FOUND, exception.getHttpStatus());

verify(repository).findById(evidenceDocumentId);
verify(repository, never()).save(any(EvidenceDocument.class));
}

}

0 comments on commit e2a0e8f

Please sign in to comment.