diff --git a/src/main/resources/swagger.api/publications.yaml b/src/main/resources/swagger.api/publications.yaml index ab92c0cc..24a1168f 100644 --- a/src/main/resources/swagger.api/publications.yaml +++ b/src/main/resources/swagger.api/publications.yaml @@ -39,6 +39,19 @@ paths: $ref: '#/components/responses/BadRequest' '500': $ref: '#/components/responses/InternalServerError' + delete: + summary: Delete publication by Id + operationId: deletePublicationById + parameters: + - $ref: "#/components/parameters/consortiumId" + - $ref: "#/components/parameters/publicationId" + responses: + "204": + $ref: "#/components/responses/NoContent" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/InternalServerError" /publications/{publicationId}/results: get: summary: Get publication results @@ -53,19 +66,6 @@ paths: $ref: '#/components/responses/BadRequest' '500': $ref: '#/components/responses/InternalServerError' - delete: - summary: Delete publication by Id - operationId: deletePublicationById - parameters: - - $ref: "#/components/parameters/consortiumId" - - $ref: "#/components/parameters/publicationId" - responses: - "204": - $ref: "#/components/responses/NoContent" - "404": - $ref: "#/components/responses/NotFound" - "500": - $ref: "#/components/responses/InternalServerError" components: requestBodies: Publication: diff --git a/src/test/java/org/folio/consortia/controller/PublicationControllerTest.java b/src/test/java/org/folio/consortia/controller/PublicationControllerTest.java index a8370e00..65bc00a0 100644 --- a/src/test/java/org/folio/consortia/controller/PublicationControllerTest.java +++ b/src/test/java/org/folio/consortia/controller/PublicationControllerTest.java @@ -11,6 +11,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; 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.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -162,4 +163,17 @@ void getPublicationResultsSuccessful() throws Exception { ); } + @Test + void deletePublicationByIdSuccessful() throws Exception { + var headers = defaultHeaders(); + var consortiumId = UUID.randomUUID(); + var publicationId = UUID.randomUUID(); + + doNothing().when(consortiumService).checkConsortiumExistsOrThrow(any(UUID.class)); + when(publicationStatusRepository.existsById(publicationId)).thenReturn(true); + String url = String.format("/consortia/%s/publications/%s", consortiumId, publicationId); + + this.mockMvc.perform(delete(url).headers(headers)) + .andExpect(status().isNoContent()); + } } diff --git a/src/test/java/org/folio/consortia/service/impl/PublicationServiceImplTest.java b/src/test/java/org/folio/consortia/service/impl/PublicationServiceImplTest.java index d271bdef..3e50cc7c 100644 --- a/src/test/java/org/folio/consortia/service/impl/PublicationServiceImplTest.java +++ b/src/test/java/org/folio/consortia/service/impl/PublicationServiceImplTest.java @@ -1,22 +1,27 @@ package org.folio.consortia.service.impl; import static org.folio.consortia.utils.InputOutputTestUtils.getMockDataObject; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.time.LocalDateTime; +import java.util.UUID; import java.util.concurrent.CompletionException; import org.folio.consortia.domain.dto.PublicationRequest; import org.folio.consortia.domain.dto.PublicationStatus; import org.folio.consortia.domain.entity.PublicationStatusEntity; import org.folio.consortia.domain.entity.PublicationTenantRequestEntity; +import org.folio.consortia.exception.ResourceNotFoundException; import org.folio.consortia.repository.PublicationStatusRepository; import org.folio.consortia.repository.PublicationTenantRequestRepository; +import org.folio.consortia.service.ConsortiumService; import org.folio.consortia.service.HttpRequestService; import org.folio.consortia.support.BaseUnitTest; import org.junit.jupiter.api.Assertions; @@ -25,6 +30,7 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; @@ -48,6 +54,8 @@ class PublicationServiceImplTest extends BaseUnitTest { HttpRequestService httpRequestService; @Mock ObjectMapper objectMapper; + @Mock + ConsortiumService consortiumService; @Captor ArgumentCaptor ptreCaptor; @@ -151,4 +159,30 @@ void updatePublicationTenantRequestOnFailure() { Assertions.assertEquals(HttpStatus.BAD_REQUEST.value(), capturedPtre.getResponseStatusCode()); } + @Test + void deletePublicationByIdSuccessful() { + var consortiumId = UUID.randomUUID(); + var publicationId = UUID.randomUUID(); + + doNothing().when(consortiumService).checkConsortiumExistsOrThrow(consortiumId); + when(publicationStatusRepository.existsById(publicationId)).thenReturn(true); + + publicationService.deletePublicationById(consortiumId, publicationId); + + Mockito.verify(publicationStatusRepository).deleteById(publicationId); + Mockito.verify(publicationTenantRequestRepository).deleteByPcStateId(publicationId); + } + + @Test + void deletePublicationByIdThrowsExceptionIfResourceDoesNotExist() { + var consortiumId = UUID.randomUUID(); + var publicationId = UUID.randomUUID(); + + doNothing().when(consortiumService).checkConsortiumExistsOrThrow(consortiumId); + when(publicationStatusRepository.existsById(publicationId)).thenReturn(false); + + assertThrows(ResourceNotFoundException.class, () -> + publicationService.deletePublicationById(consortiumId, publicationId)); + } + }