Skip to content

Commit

Permalink
feat: P4ADEV-2168-getDebtPositionDetail (#82)
Browse files Browse the repository at this point in the history
Co-authored-by: mscarsel <[email protected]>
  • Loading branch information
MScarsella and mscarsel authored Feb 26, 2025
1 parent 9c628c4 commit 0cb01a4
Show file tree
Hide file tree
Showing 10 changed files with 527 additions and 352 deletions.
699 changes: 380 additions & 319 deletions openapi/generated.openapi.json

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions openapi/p4pa-debt-position.openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,44 @@ paths:
$ref: "#/components/schemas/DebtPositionErrorDTO"
"500":
description: Internal server error
/debt-positions/{debtPositionId}:
get:
tags:
- debt-position
operationId: getDebtPosition
parameters:
- name: debtPositionId
in: path
required: true
schema:
type: integer
format: int64
description: The ID of the debt position
responses:
"200":
description: Ok
content:
application/json:
schema:
$ref: "#/components/schemas/DebtPositionDTO"
"400":
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/DebtPositionErrorDTO'
"404":
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/DebtPositionErrorDTO'
'500':
description: Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/DebtPositionErrorDTO'
/installments/{organizationId}/{nav}:
get:
tags:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,27 @@
import it.gov.pagopa.pu.debtpositions.controller.generated.DebtPositionApi;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.IupdSyncStatusUpdateDTO;
import it.gov.pagopa.pu.debtpositions.service.DebtPositionService;
import it.gov.pagopa.pu.debtpositions.service.create.debtposition.CreateDebtPositionService;
import it.gov.pagopa.pu.debtpositions.service.statusalign.DebtPositionHierarchyStatusAlignerService;
import it.gov.pagopa.pu.debtpositions.util.SecurityUtils;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class DebtPositionControllerImpl implements DebtPositionApi {

private final DebtPositionHierarchyStatusAlignerService debtPositionHierarchyStatusAlignerService;
private final CreateDebtPositionService createDebtPositionService;
private final DebtPositionService debtPositionService;

public DebtPositionControllerImpl(DebtPositionHierarchyStatusAlignerService debtPositionHierarchyStatusAlignerService, CreateDebtPositionService createDebtPositionService) {
public DebtPositionControllerImpl(DebtPositionHierarchyStatusAlignerService debtPositionHierarchyStatusAlignerService, CreateDebtPositionService createDebtPositionService,
DebtPositionService debtPositionService) {
this.debtPositionHierarchyStatusAlignerService = debtPositionHierarchyStatusAlignerService;
this.createDebtPositionService = createDebtPositionService;
this.debtPositionService = debtPositionService;
}

@Override
Expand All @@ -43,5 +46,11 @@ public ResponseEntity<DebtPositionDTO> checkAndUpdateInstallmentExpiration(Long
DebtPositionDTO body = debtPositionHierarchyStatusAlignerService.checkAndUpdateInstallmentExpiration(debtPositionId);
return new ResponseEntity<>(body, HttpStatus.OK);
}

@Override
public ResponseEntity<DebtPositionDTO> getDebtPosition(
Long debtPositionId) {
return ResponseEntity.ok(debtPositionService.getDebtPosition(debtPositionId));
}
}

Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package it.gov.pagopa.pu.debtpositions.mapper;

import static it.gov.pagopa.pu.debtpositions.util.Utilities.localDatetimeToOffsetDateTime;

import it.gov.pagopa.pu.debtpositions.dto.Installment;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO;
import it.gov.pagopa.pu.debtpositions.model.DebtPosition;
import it.gov.pagopa.pu.debtpositions.model.InstallmentNoPII;
import it.gov.pagopa.pu.debtpositions.model.PaymentOption;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.stream.Collector;
import java.util.stream.Collectors;

import static it.gov.pagopa.pu.debtpositions.util.Utilities.localDatetimeToOffsetDateTime;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;

@Service
public class DebtPositionMapper {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,4 @@ WHERE EXISTS (
""")
@EntityGraph(value = "completeDebtPosition")
DebtPosition findByInstallmentId(@Param("installmentId") Long installmentId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
public interface DebtPositionService {

DebtPositionDTO saveDebtPosition(DebtPositionDTO debtPositionDTO, Organization org);
DebtPositionDTO getDebtPosition(Long debtPositionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.micrometer.common.util.StringUtils;
import it.gov.pagopa.pu.debtpositions.dto.Installment;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO;
import it.gov.pagopa.pu.debtpositions.exception.custom.NotFoundException;
import it.gov.pagopa.pu.debtpositions.mapper.DebtPositionMapper;
import it.gov.pagopa.pu.debtpositions.model.DebtPosition;
import it.gov.pagopa.pu.debtpositions.model.InstallmentNoPII;
Expand All @@ -14,11 +15,10 @@
import it.gov.pagopa.pu.debtpositions.util.Utilities;
import it.gov.pagopa.pu.organization.dto.generated.Organization;
import jakarta.transaction.Transactional;
import java.util.Map;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class DebtPositionServiceImpl implements DebtPositionService {

Expand Down Expand Up @@ -75,5 +75,14 @@ public DebtPositionDTO saveDebtPosition(DebtPositionDTO debtPositionDTO, Organiz

return debtPositionMapper.mapToDto(savedDebtPosition);
}

@Override
public DebtPositionDTO getDebtPosition(Long debtPositionId) {
DebtPosition debtPosition = debtPositionRepository.findOneWithAllDataByDebtPositionId(debtPositionId);
if(debtPosition==null) {
throw new NotFoundException("DebtPosition having debtPositionId %d not found".formatted(debtPositionId));
}
return debtPositionMapper.mapToDto(debtPosition);
}
}

Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
package it.gov.pagopa.pu.debtpositions.controller;

import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPositionDTO;
import static org.junit.jupiter.api.Assertions.assertEquals;
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.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.fasterxml.jackson.databind.ObjectMapper;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.InstallmentStatus;
import it.gov.pagopa.pu.debtpositions.dto.generated.IupdSyncStatusUpdateDTO;
import it.gov.pagopa.pu.debtpositions.service.DebtPositionService;
import it.gov.pagopa.pu.debtpositions.service.create.debtposition.CreateDebtPositionService;
import it.gov.pagopa.pu.debtpositions.service.statusalign.DebtPositionHierarchyStatusAlignerService;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -16,15 +26,6 @@
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;

import java.util.HashMap;
import java.util.Map;

import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPositionDTO;
import static org.junit.jupiter.api.Assertions.assertEquals;
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.status;

@WebMvcTest(DebtPositionControllerImpl.class)
@AutoConfigureMockMvc(addFilters = false)
class DebtPositionControllerTest {
Expand All @@ -41,6 +42,9 @@ class DebtPositionControllerTest {
@MockitoBean
private CreateDebtPositionService createDebtPositionService;

@MockitoBean
private DebtPositionService debtPositionService;

@Test
void whenFinalizeSyncStatusThenOk() throws Exception {
Long id = 1L;
Expand Down Expand Up @@ -102,4 +106,21 @@ void whenCheckAndUpdateInstallmentExpirationThenOk() throws Exception {
DebtPositionDTO resultResponse = objectMapper.readValue(result.getResponse().getContentAsString(), DebtPositionDTO.class);
assertEquals(buildDebtPositionDTO(), resultResponse);
}

@Test
void whenGetDebtPositionThenOk() throws Exception {
Long debtPositionId = 1L;

DebtPositionDTO expectedResult = new DebtPositionDTO();
Mockito.when(debtPositionService.getDebtPosition(debtPositionId)).thenReturn(expectedResult);

MvcResult result = mockMvc.perform(
get("/debt-positions/"+debtPositionId)
.contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(status().isOk())
.andReturn();

DebtPositionDTO resultResponse = objectMapper.readValue(result.getResponse().getContentAsString(), DebtPositionDTO.class);
assertEquals(expectedResult, resultResponse);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
package it.gov.pagopa.pu.debtpositions.mapper;

import static it.gov.pagopa.pu.debtpositions.util.TestUtils.checkNotNullFields;
import static it.gov.pagopa.pu.debtpositions.util.TestUtils.reflectionEqualsByName;
import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPosition;
import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPositionDTO;
import static it.gov.pagopa.pu.debtpositions.util.faker.InstallmentFaker.buildInstallment;
import static it.gov.pagopa.pu.debtpositions.util.faker.InstallmentFaker.buildInstallmentNoPII;
import static it.gov.pagopa.pu.debtpositions.util.faker.PaymentOptionFaker.buildPaymentOption;
import static it.gov.pagopa.pu.debtpositions.util.faker.PaymentOptionFaker.buildPaymentOptionDTO;

import it.gov.pagopa.pu.debtpositions.dto.Installment;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionStatus;
import it.gov.pagopa.pu.debtpositions.model.DebtPosition;
import it.gov.pagopa.pu.debtpositions.model.InstallmentNoPII;
import it.gov.pagopa.pu.debtpositions.model.PaymentOption;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -14,18 +25,6 @@
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.util.Pair;

import java.util.HashMap;
import java.util.Map;

import static it.gov.pagopa.pu.debtpositions.util.TestUtils.checkNotNullFields;
import static it.gov.pagopa.pu.debtpositions.util.TestUtils.reflectionEqualsByName;
import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPosition;
import static it.gov.pagopa.pu.debtpositions.util.faker.DebtPositionFaker.buildDebtPositionDTO;
import static it.gov.pagopa.pu.debtpositions.util.faker.InstallmentFaker.buildInstallment;
import static it.gov.pagopa.pu.debtpositions.util.faker.InstallmentFaker.buildInstallmentNoPII;
import static it.gov.pagopa.pu.debtpositions.util.faker.PaymentOptionFaker.buildPaymentOption;
import static it.gov.pagopa.pu.debtpositions.util.faker.PaymentOptionFaker.buildPaymentOptionDTO;

@ExtendWith(MockitoExtension.class)
class DebtPositionMapperTest {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import it.gov.pagopa.pu.debtpositions.dto.Installment;
import it.gov.pagopa.pu.debtpositions.dto.generated.DebtPositionDTO;
import it.gov.pagopa.pu.debtpositions.exception.custom.NotFoundException;
import it.gov.pagopa.pu.debtpositions.mapper.DebtPositionMapper;
import it.gov.pagopa.pu.debtpositions.model.DebtPosition;
import it.gov.pagopa.pu.debtpositions.model.InstallmentNoPII;
Expand All @@ -19,11 +20,13 @@
import it.gov.pagopa.pu.debtpositions.repository.InstallmentPIIRepository;
import it.gov.pagopa.pu.debtpositions.repository.PaymentOptionRepository;
import it.gov.pagopa.pu.debtpositions.repository.TransferRepository;
import it.gov.pagopa.pu.debtpositions.util.TestUtils;
import it.gov.pagopa.pu.debtpositions.util.Utilities;
import it.gov.pagopa.pu.organization.dto.generated.Organization;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -32,6 +35,7 @@
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.util.Pair;
import uk.co.jemos.podam.api.PodamFactory;

@ExtendWith(MockitoExtension.class)
class DebtPositionServiceImplTest {
Expand All @@ -53,6 +57,8 @@ class DebtPositionServiceImplTest {

private DebtPositionServiceImpl debtPositionService;

private final PodamFactory podamFactory = TestUtils.getPodamFactory();

@BeforeEach
void setUp() {
debtPositionService = new DebtPositionServiceImpl(
Expand Down Expand Up @@ -184,5 +190,35 @@ void givenValidDebtPositionDTONoOrg_WhenSaveDebtPosition_ThenSaveAllEntities() {
Mockito.verify(transferRepository, Mockito.times(2)).save(transfer);
}
}

@Test
void givenExistingDebtPositionWhenGetDebtPositionThenOk(){
Long debtPositionId = 1L;
DebtPositionDTO expectedResult = podamFactory.manufacturePojo(DebtPositionDTO.class);
DebtPosition debtPosition = podamFactory.manufacturePojo(DebtPosition.class);

Mockito.when(debtPositionRepository.findOneWithAllDataByDebtPositionId(debtPositionId)).thenReturn(debtPosition);
Mockito.when(debtPositionMapper.mapToDto(debtPosition)).thenReturn(expectedResult);

DebtPositionDTO result = debtPositionService.getDebtPosition(
debtPositionId);

Assertions.assertNotNull(result);
Assertions.assertSame(expectedResult,result);
Mockito.verifyNoMoreInteractions(debtPositionRepository,debtPositionMapper);
}

@Test
void givenNonExistingDebtPositionDetailWhenGetDebtPositionThenThrowNotFoundException(){
Long debtPositionId = 1L;

Mockito.when(debtPositionRepository.findOneWithAllDataByDebtPositionId(debtPositionId)).thenReturn(null);

Assertions.assertThrows(NotFoundException.class, ()->debtPositionService.getDebtPosition(
debtPositionId));

Mockito.verifyNoMoreInteractions(debtPositionRepository);
Mockito.verifyNoInteractions(debtPositionMapper);
}
}

0 comments on commit 0cb01a4

Please sign in to comment.