Skip to content

Commit

Permalink
Merge branch 'main' into feature-dev/feature-test
Browse files Browse the repository at this point in the history
  • Loading branch information
farrell-m authored Jan 28, 2025
2 parents 2ccd93b + 7b49499 commit d0df954
Show file tree
Hide file tree
Showing 19 changed files with 1,192 additions and 101 deletions.
69 changes: 69 additions & 0 deletions data-api/open-api-specification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,36 @@ paths:
description: 'Not found'
'500':
description: 'Internal server error'
/cases/status/{transaction-request-id}:
get:
tags:
- cases
summary: 'Get Case transaction status'
operationId: 'getCaseTransactionStatus'
parameters:
- name: 'transaction-request-id'
in: 'path'
required: true
schema:
type: 'string'
example: 'abc123'
responses:
'200':
description: 'Successful operation'
content:
application/json:
schema:
$ref: "#/components/schemas/transactionStatus"
'400':
description: 'Bad request'
'401':
description: 'Unauthorized'
'403':
description: 'Forbidden'
'404':
description: 'Not found'
'500':
description: 'Internal server error'
/lookup/case-status:
get:
tags:
Expand Down Expand Up @@ -1038,6 +1068,36 @@ paths:
description: 'Forbidden'
'500':
description: 'Internal server error'
/clients/status/{transaction-request-id}:
get:
tags:
- clients
summary: 'Get Client transaction status'
operationId: 'getClientTransactionStatus'
parameters:
- name: 'transaction-request-id'
in: 'path'
required: true
schema:
type: 'string'
example: 'abc123'
responses:
'200':
description: 'Successful operation'
content:
application/json:
schema:
$ref: "#/components/schemas/transactionStatus"
'400':
description: 'Bad request'
'401':
description: 'Unauthorized'
'403':
description: 'Forbidden'
'404':
description: 'Not found'
'500':
description: 'Internal server error'
/notifications:
get:
tags:
Expand Down Expand Up @@ -1118,6 +1178,15 @@ components:
in: header
name: Authorization
schemas:
transactionStatus:
type: 'object'
properties:
submission_status:
type: 'string'
example: 'success'
reference_number:
type: 'string'
example: 'abc123'
baseOffice:
type: 'object'
properties:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
package uk.gov.laa.ccms.data.repository;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ActiveProfiles;
import uk.gov.laa.ccms.data.entity.TransactionStatus;

@DataJpaTest
@ActiveProfiles("h2-test")
@DisplayName("Transaction Status Repository Integration Test")
public class TransactionStatusRepositoryIntegrationTest {

@Autowired
private TransactionStatusRepository transactionStatusRepository;

@PersistenceContext
private EntityManager entityManager;

private TransactionStatus createClientTransactionStatus;
private TransactionStatus updateClientTransactionStatus;
private TransactionStatus createCaseApplicationTransactionStatus;
private TransactionStatus updateCaseApplicationTransactionStatus;
private TransactionStatus userFuncOne;
private TransactionStatus userFuncTwo;
private TransactionStatus userFuncErr;

@BeforeEach
void setUp() {
// Insert test data into the in-memory database
createClientTransactionStatus = TransactionStatus.builder()
.requestId("1")
.processName("CreateClient")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Success")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 1))
.build();
updateClientTransactionStatus = TransactionStatus.builder()
.requestId("2")
.processName("UpdateClient")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Success")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 2))
.build();
createCaseApplicationTransactionStatus = TransactionStatus.builder()
.requestId("3")
.processName("CreateCaseApplication")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Success")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 3))
.build();
updateCaseApplicationTransactionStatus = TransactionStatus.builder()
.requestId("4")
.processName("UpdateCaseApplication")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Success")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 4))
.build();

// Both with same request ID, this happens in EBS
userFuncOne = TransactionStatus.builder()
.requestId("1")
.processName("XXCCMS_COMMON_UTIL.USER_FUNC_AUTH")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Success")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 3))
.build();
userFuncTwo = TransactionStatus.builder()
.requestId("1")
.processName("XXCCMS_COMMON_UTIL.USER_FUNC_AUTH")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Success")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 4))
.build();
userFuncErr = TransactionStatus.builder()
.requestId("500")
.processName("USER_FUNC_AUTH")
.recordRefKey("CLIENT_REF_NUMBER")
.recordRefValue("6505")
.status("Error")
.errorDescription("Party Successfully Created")
.transactionOccurrenceDate(LocalDateTime.of(2024, 1, 1, 1, 5))
.build();

// Use entityManager as NotificationRepository extends ReadOnlyRepository.
entityManager.persist(createClientTransactionStatus);
entityManager.persist(updateClientTransactionStatus);
entityManager.persist(createCaseApplicationTransactionStatus);
entityManager.persist(updateCaseApplicationTransactionStatus);
entityManager.persist(userFuncOne);
entityManager.persist(userFuncTwo);
entityManager.persist(userFuncErr);
}

@Nested
@DisplayName("findClientTransactionByTransactionId() Tests")
class FindClientTransactionByTransactionIdTests {

@Test
@DisplayName("Should not return client transaction status")
void shouldNotReturnClientTransactionStatus() {
// Given
String requestId = "404";
// When
Optional<TransactionStatus> result =
transactionStatusRepository.findClientTransactionByTransactionId(
requestId);
// Then
assertTrue(result.isEmpty());
}

@Test
@DisplayName("Should get only create client transaction status")
void shouldGetOnlyCreateClientTransactionStatus() {
// Given
String requestId = "1";
// When
Optional<TransactionStatus> result =
transactionStatusRepository.findClientTransactionByTransactionId(
requestId);
// Then
assertFalse(result.isEmpty());
assertEquals(createClientTransactionStatus, result.get());
}

@Test
@DisplayName("Should get only update client transaction status")
void shouldGetOnlyUpdateClientTransactionStatus() {
// Given
String requestId = "2";
// When
Optional<TransactionStatus> result =
transactionStatusRepository.findClientTransactionByTransactionId(
requestId);
// Then
assertFalse(result.isEmpty());
assertEquals(updateClientTransactionStatus, result.get());
}
}

@Nested
@DisplayName("findCaseApplicationTransactionByTransactionId() Tests")
class FindCaseApplicationTransactionByTransactionIdTests {

@Test
@DisplayName("Should not return case transaction status")
void shouldNotReturnCaseTransactionStatus() {
// Given
String requestId = "404";
// When
Optional<TransactionStatus> result =
transactionStatusRepository.findCaseApplicationTransactionByTransactionId(
requestId);
// Then
assertTrue(result.isEmpty());
}

@Test
@DisplayName("Should get only create case transaction status")
void shouldGetOnlyCreateCaseTransactionStatus() {
// Given
String requestId = "3";
// When
Optional<TransactionStatus> result =
transactionStatusRepository.findCaseApplicationTransactionByTransactionId(
requestId);
// Then
assertFalse(result.isEmpty());
assertEquals(createCaseApplicationTransactionStatus, result.get());
}

@Test
@DisplayName("Should get only update case transaction status")
void shouldGetOnlyUpdateCaseTransactionStatus() {
// Given
String requestId = "4";
// When
Optional<TransactionStatus> result =
transactionStatusRepository.findCaseApplicationTransactionByTransactionId(
requestId);
// Then
assertFalse(result.isEmpty());
assertEquals(updateCaseApplicationTransactionStatus, result.get());
}
}

@Nested
@DisplayName("findUserFunctionTransactionsByTransactionId() Tests")
class FindUserFunctionTransactionsByTransactionIdTests {

@Test
@DisplayName("Should get multiple user function transactions")
void shouldGetMultipleUserFunctionTransactions() {
// Given
String requestId = "1";
// When
List<TransactionStatus> result =
transactionStatusRepository.findAllUserFunctionTransactionsByTransactionId(
requestId);
// Then
assertEquals(2, result.size());
assertTrue(result.contains(userFuncOne));
assertTrue(result.contains(userFuncTwo));
}

@Test
@DisplayName("Should get error user function transactions")
void shouldGetErrorUserFunctionTransactions() {
// Given
String requestId = "500";
// When
List<TransactionStatus> result =
transactionStatusRepository.findAllUserFunctionTransactionsByTransactionId(
requestId);
// Then
assertEquals(1, result.size());
assertTrue(result.contains(userFuncErr));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,30 @@
import org.springframework.web.bind.annotation.RestController;
import uk.gov.laa.ccms.data.api.CasesApi;
import uk.gov.laa.ccms.data.model.CaseDetails;
import uk.gov.laa.ccms.data.model.TransactionStatus;
import uk.gov.laa.ccms.data.service.CaseSearchService;
import uk.gov.laa.ccms.data.service.CaseService;
import uk.gov.laa.ccms.data.service.ClientServiceException;

/**
* Controller class responsible for handling case search operations.
* Controller class responsible for handling case related operations.
*
* <p>This controller serves as an interface to return requested case information. It
* delegates the business logic to the {@link CaseSearchService}.</p>
* delegates the business logic to the {@link CaseSearchService} and {@link CaseService}.</p>
*
* <p>This class implemented the {@CasesApi} interface and provides endpoints for retrieving
* case information.</p>
*
* @see CaseDetails
* @see CaseService
* @see CaseSearchService
* @author Jamie Briggs
*/
@RestController
@RequiredArgsConstructor
public class CaseSearchController implements CasesApi {
public class CaseController implements CasesApi {

private final CaseService caseService;
private final CaseSearchService caseSearchService;

/**
Expand Down Expand Up @@ -53,4 +58,14 @@ public ResponseEntity<CaseDetails> getCases(Long providerFirmPartyId, String cas
return cases.map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());

}

@Override
public ResponseEntity<TransactionStatus> getCaseTransactionStatus(String transactionRequestId) {
try {
return caseService.getTransactionStatus(transactionRequestId).map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
} catch (ClientServiceException e) {
return ResponseEntity.internalServerError().build();
}
}
}
Loading

0 comments on commit d0df954

Please sign in to comment.