Skip to content

Commit

Permalink
Merge pull request #42 from companieshouse/feature/psc-ceased
Browse files Browse the repository at this point in the history
Adding psc ceased validator and altering validators to only run durin…
  • Loading branch information
clewis1 authored Sep 20, 2024
2 parents a2ce5b5 + b04df67 commit 4069d45
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import uk.gov.companieshouse.logging.Logger;
import uk.gov.companieshouse.patch.model.PatchResult;
import uk.gov.companieshouse.pscverificationapi.controller.PscVerificationController;
import uk.gov.companieshouse.pscverificationapi.enumerations.PscType;
import uk.gov.companieshouse.pscverificationapi.error.RetrievalFailureReason;
import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceNotFoundException;
import uk.gov.companieshouse.pscverificationapi.exception.InvalidFilingException;
Expand All @@ -46,8 +45,6 @@
import uk.gov.companieshouse.pscverificationapi.model.mapper.PscVerificationMapper;
import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService;
import uk.gov.companieshouse.pscverificationapi.service.TransactionService;
import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService;
import uk.gov.companieshouse.pscverificationapi.validator.VerificationValidationContext;
import uk.gov.companieshouse.sdk.manager.ApiSdkManager;

@RestController
Expand All @@ -61,16 +58,14 @@ public class PscVerificationControllerImpl implements PscVerificationController

private final TransactionService transactionService;
private final PscVerificationService pscVerificationService;
private final VerificationValidationService validatorService;
private final PscVerificationMapper filingMapper;
private final Clock clock;
private final Logger logger;

public PscVerificationControllerImpl(final TransactionService transactionService,
final PscVerificationService pscVerificationService, final VerificationValidationService validatorService, PscVerificationMapper filingMapper, final Clock clock, final Logger logger) {
final PscVerificationService pscVerificationService, PscVerificationMapper filingMapper, final Clock clock, final Logger logger) {
this.transactionService = transactionService;
this.pscVerificationService = pscVerificationService;
this.validatorService = validatorService;
this.filingMapper = filingMapper;
this.clock = clock;
this.logger = logger;
Expand All @@ -90,23 +85,11 @@ public ResponseEntity<PscVerificationApi> createPscVerification(
logMap.put("method", request.getMethod());
logger.debugRequest(request, "POST", logMap);

final var validationErrors = Optional.ofNullable(result)
.map(Errors::getFieldErrors).map(ArrayList::new)
.orElseGet(ArrayList::new);

Optional.ofNullable(result).ifPresent(PscVerificationControllerImpl::checkBindingErrors);

final var requestTransaction = getTransaction(transId, transaction, logMap,
getPassthroughHeader(request));

validatorService.validate(
new VerificationValidationContext(data, validationErrors, transaction, PscType.INDIVIDUAL,
getPassthroughHeader(request)));

if (!validationErrors.isEmpty()) {
throw new InvalidFilingException(validationErrors);
}

final var entity = filingMapper.toEntity(data);
final var savedEntity = saveFilingWithLinks(entity, transId, request, logMap);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,22 @@
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import uk.gov.companieshouse.api.model.transaction.Transaction;
import uk.gov.companieshouse.api.model.validationstatus.ValidationStatusError;
import uk.gov.companieshouse.api.model.validationstatus.ValidationStatusResponse;
import uk.gov.companieshouse.logging.Logger;
import uk.gov.companieshouse.pscverificationapi.controller.ValidationStatusController;
import uk.gov.companieshouse.pscverificationapi.enumerations.PscType;
import uk.gov.companieshouse.pscverificationapi.error.ErrorType;
import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceNotFoundException;
import uk.gov.companieshouse.pscverificationapi.helper.LogMapHelper;
import uk.gov.companieshouse.pscverificationapi.mapper.ErrorMapper;
import uk.gov.companieshouse.pscverificationapi.model.entity.PscVerification;
import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService;
import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService;
import uk.gov.companieshouse.pscverificationapi.validator.VerificationValidationContext;
import uk.gov.companieshouse.sdk.manager.ApiSdkManager;

@RestController
Expand All @@ -31,15 +33,17 @@ public class ValidationStatusControllerImpl implements ValidationStatusControlle
public static final String TRANSACTION_NOT_SUPPORTED_ERROR =
"Transaction not supported: FEATURE_FLAG_TRANSACTIONS_CLOSABLE_250124=false";
private final PscVerificationService pscVerificationService;
private final VerificationValidationService validatorService;
private final ErrorMapper errorMapper;
private final Logger logger;
private final boolean isTransactionsCloseableEnabled;

public ValidationStatusControllerImpl(final PscVerificationService pscVerificationService,
public ValidationStatusControllerImpl(final PscVerificationService pscVerificationService, VerificationValidationService validatorService,
final ErrorMapper errorMapper,
@Value("#{new Boolean('${feature.flag.transactions.closable}')}")
final boolean isTransactionsClosableEnabled, final Logger logger) {
this.pscVerificationService = pscVerificationService;
this.validatorService = validatorService;
this.errorMapper = errorMapper;
this.isTransactionsCloseableEnabled = isTransactionsClosableEnabled;
this.logger = logger;
Expand All @@ -49,7 +53,6 @@ public ValidationStatusControllerImpl(final PscVerificationService pscVerificati
}

@Override
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@GetMapping(value = "/{filingResourceId}/validation_status", produces = {"application/json"})
public ValidationStatusResponse validate(@PathVariable("transactionId") final String transId,
Expand Down Expand Up @@ -80,7 +83,6 @@ private ValidationStatusResponse isValid(final PscVerification pscVerification,
validationStatus.setValidationStatusError(validationErrors);
}
else {
validationStatus.setValid(false);
validationStatus.setValidationStatusError(new ValidationStatusError[]{
new ValidationStatusError(TRANSACTION_NOT_SUPPORTED_ERROR, null, null,
ErrorType.SERVICE.getType())});
Expand All @@ -91,9 +93,12 @@ private ValidationStatusResponse isValid(final PscVerification pscVerification,
private ValidationStatusError[] calculateIsValid(final PscVerification pscVerification,
final String passthroughHeader, final Transaction transaction) {

//TODO code to be added to call some Filing Validation service
final var errors = new ArrayList<FieldError>();
return errorMapper.map(errors);
}

VerificationValidationContext context = new VerificationValidationContext(
pscVerification.getData(), errors, transaction, PscType.INDIVIDUAL, passthroughHeader);

validatorService.validate(context);
return errorMapper.map(context.errors());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@ public void validate(final VerificationValidationContext validationContext) {
try {
pscLookupService.getPsc(validationContext.transaction(), validationContext.dto(), validationContext.pscType(),
validationContext.passthroughHeader());
//TODO - handle - Validation should not continue if the PSC does not exist
super.validate(validationContext);
}
catch (FilingResourceNotFoundException e) {
validationContext.errors().add(
new FieldError("object", "psc_appointment_id", validationContext.dto().pscAppointmentId(), false,
new String[]{null, validationContext.dto().pscAppointmentId()}, null, validation.get("psc_appointment_id-not-found")));
new String[]{null, validationContext.dto().pscAppointmentId()}, null, validation.get("psc-appointment-id-not-found")));
}
super.validate(validationContext);
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package uk.gov.companieshouse.pscverificationapi.validator;

import java.util.Map;
import java.util.Optional;

import org.springframework.stereotype.Component;
import org.springframework.validation.FieldError;
import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceInvalidException;
import uk.gov.companieshouse.api.model.psc.PscApi;
import uk.gov.companieshouse.pscverificationapi.service.PscLookupService;

@Component
Expand All @@ -24,11 +26,10 @@ public PscIsActiveValidator(final Map<String, String> validation, final PscLooku
@Override
public void validate(final VerificationValidationContext validationContext) {

try {
pscLookupService.getPsc(validationContext.transaction(), validationContext.dto(), validationContext.pscType(),
validationContext.passthroughHeader());
PscApi pscApi = pscLookupService.getPsc(validationContext.transaction(), validationContext.dto(), validationContext.pscType(),
validationContext.passthroughHeader());

} catch (FilingResourceInvalidException e) {
if (Optional.ofNullable(pscApi.getCeasedOn()).isPresent()) {
validationContext.errors().add(
new FieldError("object", "psc_appointment_id", validationContext.dto().pscAppointmentId(), false,
new String[]{null, validationContext.dto().pscAppointmentId()}, null, validation.get("psc-is-ceased")));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
import uk.gov.companieshouse.pscverificationapi.model.mapper.PscVerificationMapperImpl;
import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService;
import uk.gov.companieshouse.pscverificationapi.service.TransactionService;
import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService;
import uk.gov.companieshouse.sdk.manager.ApiSdkManager;

@ExtendWith(SpringExtension.class) // JUnit 5
Expand All @@ -83,8 +82,6 @@ class PscVerificationControllerImplTest {
private TransactionService transactionService;
@Mock
private PscVerificationService pscVerificationService;
@Mock
private VerificationValidationService validationService;
@Autowired
private PscVerificationMapper filingMapper;
@Mock
Expand All @@ -110,7 +107,7 @@ public static Stream<Arguments> provideCreateParams() {
@BeforeEach
void setUp() {
testController = new PscVerificationControllerImpl(transactionService,
pscVerificationService, validationService, filingMapper, clock, logger);
pscVerificationService, filingMapper, clock, logger);
verification = VerificationDetails.newBuilder()
.uvid(UVID)
.statements(EnumSet.of(VerificationStatementConstants.INDIVIDUAL_VERIFIED))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.web.util.UriComponentsBuilder;
import uk.gov.companieshouse.api.model.common.ResourceLinks;
import uk.gov.companieshouse.api.model.transaction.Transaction;
import uk.gov.companieshouse.api.model.validationstatus.ValidationStatusError;
Expand All @@ -26,6 +25,7 @@
import uk.gov.companieshouse.pscverificationapi.mapper.ErrorMapper;
import uk.gov.companieshouse.pscverificationapi.model.entity.PscVerification;
import uk.gov.companieshouse.pscverificationapi.service.PscVerificationService;
import uk.gov.companieshouse.pscverificationapi.service.VerificationValidationService;
import uk.gov.companieshouse.sdk.manager.ApiSdkManager;

@ExtendWith(MockitoExtension.class)
Expand All @@ -40,6 +40,8 @@ class ValidationStatusControllerImplTest {
@Mock
private PscVerificationService pscVerificationService;
@Mock
private VerificationValidationService validatorService;
@Mock
private HttpServletRequest request;
@Mock
private Logger logger;
Expand All @@ -53,13 +55,13 @@ class ValidationStatusControllerImplTest {

@BeforeEach
void setUp() {
testController = new ValidationStatusControllerImpl(pscVerificationService, errorMapper, true, logger);
testController = new ValidationStatusControllerImpl(pscVerificationService, validatorService, errorMapper, true, logger);
when(request.getHeader(ApiSdkManager.getEricPassthroughTokenHeader())).thenReturn(PASSTHROUGH_HEADER);
}

@Test
void validateWhenClosableFlagFalse() {
testController = new ValidationStatusControllerImpl(pscVerificationService, errorMapper, false, logger);
testController = new ValidationStatusControllerImpl(pscVerificationService, validatorService, errorMapper, false, logger);
final var filing = PscVerification.newBuilder().build();
when(pscVerificationService.get(FILING_ID)).thenReturn(Optional.of(filing));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void validateWhenPscDoesNotExist() {
when(pscLookupService.getPsc(transaction, pscVerificationData, pscType,
passthroughHeader)).thenThrow(new FilingResourceNotFoundException(
"PSC Details not found for " + PSC_ID + ": 404 Not Found", errorResponseException));
when(validation.get("psc_appointment_id-not-found")).thenReturn("not-exists default message");
when(validation.get("psc-appointment-id-not-found")).thenReturn("not-exists default message");

testValidator.validate(
new VerificationValidationContext(pscVerificationData, errors, transaction, pscType, passthroughHeader));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.mockito.Mockito.when;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand All @@ -21,7 +22,6 @@
import uk.gov.companieshouse.api.model.pscverification.PscVerificationData;
import uk.gov.companieshouse.api.model.transaction.Transaction;
import uk.gov.companieshouse.pscverificationapi.enumerations.PscType;
import uk.gov.companieshouse.pscverificationapi.exception.FilingResourceInvalidException;
import uk.gov.companieshouse.pscverificationapi.service.PscLookupService;

@ExtendWith(MockitoExtension.class)
Expand All @@ -46,6 +46,7 @@ class PscIsActiveValidatorTest {
private String passthroughHeader;

private static final String PSC_ID = "67edfE436y35hetsie6zuAZtr";
private static final LocalDate TEST_DATE = LocalDate.of(2024, 5, 5);

@BeforeEach
void setUp() {
Expand All @@ -61,6 +62,8 @@ void setUp() {
@Test
void validateWhenPscIsActive() {

when(pscLookupService.getPsc(transaction, pscVerificationData, pscType,
passthroughHeader)).thenReturn(pscApi);
testValidator.validate(
new VerificationValidationContext(pscVerificationData, errors, transaction, pscType, passthroughHeader));

Expand All @@ -71,13 +74,13 @@ void validateWhenPscIsActive() {
void validateWhenPscIsCeased() {

when(pscVerificationData.pscAppointmentId()).thenReturn(PSC_ID);
when(pscApi.getCeasedOn()).thenReturn(TEST_DATE);

var fieldError = new FieldError("object", "psc_appointment_id", pscVerificationData.pscAppointmentId(), false,
new String[]{null, PSC_ID}, null, "is ceased default message");

when(pscLookupService.getPsc(transaction, pscVerificationData, pscType,
passthroughHeader)).thenThrow(new FilingResourceInvalidException(
"PSC is already ceased for " + PSC_ID + ": 400 Bad Request", errorResponseException));
passthroughHeader)).thenReturn(pscApi);
when(validation.get("psc-is-ceased")).thenReturn("is ceased default message");

testValidator.validate(
Expand Down

0 comments on commit 4069d45

Please sign in to comment.