Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,014 changes: 538 additions & 476 deletions openapi/generated.openapi.json

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions openapi/p4pa-debt-position.openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1513,6 +1513,27 @@ paths:
description: Conflict
'500':
description: Internal server error
/spontaneous-forms/{spontaneousFormId}:
delete:
tags:
- spontaneous-form
operationId: deleteSpontaneousForm
parameters:
- name: spontaneousFormId
in: path
required: true
schema:
type: integer
format: int64
responses:
'200':
description: Ok
'404':
description: Not Found
'409':
description: Conflict
"500":
description: Internal server error
security:
- BearerAuth: [ ]
components:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,11 @@ public ResponseEntity<SpontaneousForm> createSpontaneousForm(SpontaneousForm spo
return ResponseEntity.status(HttpStatus.CREATED)
.body(spontaneousFormService.createSpontaneousForm(spontaneousForm));
}

@Override
public ResponseEntity<Void> deleteSpontaneousForm(Long spontaneousFormId) {
log.info("deleting SpontaneousForm having spontaneousFormId {}", spontaneousFormId);
spontaneousFormService.deleteSpontaneousForm(spontaneousFormId);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -157,5 +157,12 @@ Page<DebtPositionTypeOrg> findDebtPositionTypeOrgNotEnabledForOperator(
@Param("description") String description,
@Parameter(schema = @Schema(type = "integer", format = "int64")) @Param("debtPositionTypeId") Long debtPositionTypeId,
Pageable pageable);

@Query("""
SELECT COUNT(d)
FROM DebtPositionTypeOrg d
WHERE d.spontaneousFormId = :spontaneousFormId
""")
long countBySpontaneousFormId(Long spontaneousFormId);
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@

public interface SpontaneousFormService {
SpontaneousForm createSpontaneousForm(SpontaneousForm spontaneousForm);
void deleteSpontaneousForm(Long spontaneousFormId);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package it.gov.pagopa.pu.debtpositions.service;

import it.gov.pagopa.pu.debtpositions.exception.custom.ConflictErrorException;
import it.gov.pagopa.pu.debtpositions.exception.custom.NotFoundException;
import it.gov.pagopa.pu.debtpositions.model.SpontaneousForm;
import it.gov.pagopa.pu.debtpositions.repository.DebtPositionTypeOrgRepository;
import it.gov.pagopa.pu.debtpositions.repository.SpontaneousFormRepository;
import jakarta.transaction.Transactional;
import jakarta.validation.ValidationException;
Expand All @@ -11,9 +13,11 @@
@Service
public class SpontaneousFormServiceImpl implements SpontaneousFormService {
private final SpontaneousFormRepository spontaneousFormRepository;
private final DebtPositionTypeOrgRepository debtPositionTypeOrgRepository;

public SpontaneousFormServiceImpl(SpontaneousFormRepository spontaneousFormRepository) {
public SpontaneousFormServiceImpl(SpontaneousFormRepository spontaneousFormRepository, DebtPositionTypeOrgRepository debtPositionTypeOrgRepository) {
this.spontaneousFormRepository = spontaneousFormRepository;
this.debtPositionTypeOrgRepository = debtPositionTypeOrgRepository;
}

@Transactional
Expand All @@ -28,4 +32,17 @@ public SpontaneousForm createSpontaneousForm(SpontaneousForm spontaneousForm) {
}
return spontaneousFormRepository.save(spontaneousForm);
}

@Override
public void deleteSpontaneousForm(Long spontaneousFormId) {
SpontaneousForm spontaneousForm = spontaneousFormRepository.findById(
spontaneousFormId).orElseThrow(
() -> new NotFoundException("SpontaneousForm having id "+spontaneousFormId+" not found"));

long dptoCount = debtPositionTypeOrgRepository.countBySpontaneousFormId(spontaneousFormId);
if(dptoCount > 0L){
throw new ConflictErrorException("The SpontaneousForm having id "+spontaneousFormId+" is referenced by "+dptoCount+" DebtPositionTypeOrgs");
}
spontaneousFormRepository.delete(spontaneousForm);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;

import it.gov.pagopa.pu.debtpositions.model.SpontaneousForm;
Expand Down Expand Up @@ -50,4 +51,16 @@ void whenCreateSpontaneousFormThenReturnCreated() {
assertEquals(HttpStatus.CREATED, result.getStatusCode());
assertEquals(expectedResult,result.getBody());
}

@Test
void whenDeleteSpontaneousFormThenReturnOk() {
Long spontaneousFormId = 1L;

doNothing().when(spontaneousFormServiceMock).deleteSpontaneousForm(spontaneousFormId);

ResponseEntity<Void> result = controller.deleteSpontaneousForm(spontaneousFormId);

assertNotNull(result);
assertEquals(HttpStatus.OK, result.getStatusCode());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package it.gov.pagopa.pu.debtpositions.service;

import it.gov.pagopa.pu.debtpositions.exception.custom.ConflictErrorException;
import it.gov.pagopa.pu.debtpositions.exception.custom.NotFoundException;
import it.gov.pagopa.pu.debtpositions.model.SpontaneousForm;
import it.gov.pagopa.pu.debtpositions.repository.DebtPositionTypeOrgRepository;
import it.gov.pagopa.pu.debtpositions.repository.SpontaneousFormRepository;
import it.gov.pagopa.pu.debtpositions.util.TestUtils;
import jakarta.validation.ValidationException;
Expand All @@ -21,23 +23,27 @@ class SpontaneousFormServiceImplTest {
private final PodamFactory podamFactory = TestUtils.getPodamFactory();
@Mock
private SpontaneousFormRepository spontaneousFormRepositoryMock;
@Mock
private DebtPositionTypeOrgRepository debtPositionTypeOrgRepositoryMock;
private SpontaneousFormService spontaneousFormService;

@BeforeEach
void setUp() {
spontaneousFormService = new SpontaneousFormServiceImpl(
spontaneousFormRepositoryMock
spontaneousFormRepositoryMock,
debtPositionTypeOrgRepositoryMock
);
}

@AfterEach
void verifyNoMoreInteractions(){
Mockito.verifyNoMoreInteractions(
spontaneousFormRepositoryMock);
spontaneousFormRepositoryMock,
debtPositionTypeOrgRepositoryMock);
}

@Test
void whenGetReceiptThenOk() {
void whenCreateSpontaneousFormThenOk() {
SpontaneousForm spontaneousForm = podamFactory.manufacturePojo(SpontaneousForm.class);
spontaneousForm.setSpontaneousFormId(null);

Expand All @@ -51,7 +57,7 @@ void whenGetReceiptThenOk() {
}

@Test
void givenExistingSpontaneousFormWithMatchingOrganizationIdAndCodeWhenGetReceiptThenConflictErrorException() {
void givenExistingSpontaneousFormWithMatchingOrganizationIdAndCodeWhenCreateSpontaneousFormThenConflictErrorException() {
SpontaneousForm spontaneousForm = podamFactory.manufacturePojo(SpontaneousForm.class);
spontaneousForm.setSpontaneousFormId(null);

Expand All @@ -61,11 +67,45 @@ void givenExistingSpontaneousFormWithMatchingOrganizationIdAndCodeWhenGetReceipt
}

@Test
void givenSpontaneousFormIdNotNullWhenGetReceiptThenValidationException() {
void givenSpontaneousFormIdNotNullWhenCreateSpontaneousFormThenValidationException() {
SpontaneousForm spontaneousForm = podamFactory.manufacturePojo(SpontaneousForm.class);

Assertions.assertThrows(ValidationException.class,()-> spontaneousFormService.createSpontaneousForm(spontaneousForm));

Mockito.verifyNoInteractions(spontaneousFormRepositoryMock);
}

@Test
void whenDeleteSpontaneousFormThenOk() {
SpontaneousForm spontaneousForm = podamFactory.manufacturePojo(SpontaneousForm.class);
Long spontaneousFormId = spontaneousForm.getSpontaneousFormId();

Mockito.when(spontaneousFormRepositoryMock.findById(spontaneousFormId)).thenReturn(Optional.of(spontaneousForm));
Mockito.when(debtPositionTypeOrgRepositoryMock.countBySpontaneousFormId(spontaneousFormId)).thenReturn(0L);
Mockito.doNothing().when(spontaneousFormRepositoryMock).delete(spontaneousForm);

Assertions.assertDoesNotThrow(()->spontaneousFormService.deleteSpontaneousForm(spontaneousFormId));
}

@Test
void givenReferencedSpontaneousFormWhenDeleteSpontaneousFormThenConflictErrorException() {
SpontaneousForm spontaneousForm = podamFactory.manufacturePojo(SpontaneousForm.class);
Long spontaneousFormId = spontaneousForm.getSpontaneousFormId();

Mockito.when(spontaneousFormRepositoryMock.findById(spontaneousFormId)).thenReturn(Optional.of(spontaneousForm));
Mockito.when(debtPositionTypeOrgRepositoryMock.countBySpontaneousFormId(spontaneousFormId)).thenReturn(1L);

Assertions.assertThrows(ConflictErrorException.class, ()->spontaneousFormService.deleteSpontaneousForm(spontaneousFormId));
}

@Test
void givenNoSpontaneousFormWhenDeleteSpontaneousFormThenNotFoundException() {
Long spontaneousFormId = 1L;

Mockito.when(spontaneousFormRepositoryMock.findById(spontaneousFormId)).thenReturn(Optional.empty());

Assertions.assertThrows(NotFoundException.class, ()->spontaneousFormService.deleteSpontaneousForm(spontaneousFormId));

Mockito.verifyNoInteractions(debtPositionTypeOrgRepositoryMock);
}
}