Skip to content

Commit

Permalink
CCMSPUI-379 Implemented filters for NotificationSearchRepository
Browse files Browse the repository at this point in the history
Signed-off-by: Jamie Briggs <jamie.briggs@digital.justice.gov.uk>
  • Loading branch information
Jamie Briggs committed Feb 13, 2025
1 parent 404ece3 commit fab2af1
Show file tree
Hide file tree
Showing 8 changed files with 348 additions and 51 deletions.
2 changes: 1 addition & 1 deletion data-api/open-api-specification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1097,7 +1097,7 @@ paths:
schema:
type: 'string'
example: 'Male'
- name: 'case-reference-number'
- name: 'client-reference-number'
in: 'query'
schema:
type: 'string'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package uk.gov.laa.ccms.data.repository;

import static org.junit.Assert.assertEquals;

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

import java.time.LocalDate;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.Sql.ExecutionPhase;
import org.springframework.test.context.jdbc.SqlMergeMode;
Expand All @@ -28,21 +33,23 @@ public class ClientDetailRepositoryIntegrationTest implements OracleIntegrationT
@Autowired
private ClientDetailRepository repository;

@Test
@DisplayName("Should return two notifications")
void shouldReturnTwoNotifications() {
@ParameterizedTest
@NullAndEmptySource
@DisplayName("Should return two client details")
void shouldReturnTwoClientDetails(String emptyStringInput) {
// Given
// When
Page<ClientDetail> result = repository.findAll(null, null, null,
null, null, null, null,
Page<ClientDetail> result = repository.findAll(emptyStringInput, emptyStringInput,
null,
emptyStringInput, emptyStringInput, emptyStringInput, emptyStringInput,
PageRequest.of(0, 10));
// Then
assertEquals(2L, result.getTotalElements());
}

@Test
@DisplayName("Should return single notification")
void shouldReturnSingleNotification(){
@DisplayName("Should return single client detail")
void shouldReturnSingleClientDetail(){
// Given
// When
Page<ClientDetail> result = repository.findAll(null, null, null,
Expand All @@ -53,4 +60,222 @@ void shouldReturnSingleNotification(){
assertEquals(2, result.getTotalPages());
assertEquals(2L, result.getTotalElements());
}

@Test
@DisplayName("Should return single client filter equals first name")
void shouldReturnSingleClientFilterEqualsFirstName(){
// Given
String firstName = "john";
// When
Page<ClientDetail> result = repository.findAll(firstName,
null, null, null, null,
null, null, PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals("John", result.getContent().getFirst().getFirstName());
}

@Test
@DisplayName("Should return multiple clients filter like first name")
void shouldReturnMultipleClientFilterLikeFirstName(){
// Given
String firstName = "j";
// When
Page<ClientDetail> result = repository.findAll(firstName,
null, null, null, null,
null, null, PageRequest.of(0, 10));
// Then
assertEquals(2L, result.getContent().size());
assertEquals("John", result.getContent().getFirst().getFirstName());
assertEquals("Jane", result.getContent().get(1).getFirstName());
}

@Test
@DisplayName("Should return single client filter equals surname")
void shouldReturnSingleClientFilterEqualsSurname(){
// Given
String surname = "doe";
// When
Page<ClientDetail> result = repository.findAll(null,
surname, null, null, null,
null, null, PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals("Doe", result.getContent().getFirst().getSurname());
}

@Test
@DisplayName("Should return mulitple clients filter like surname")
void shouldReturnMultipleClientsFilterLikeSurname(){
// Given
String surname = "oe";
// When
Page<ClientDetail> result = repository.findAll(null,
surname, null, null, null,
null, null, PageRequest.of(0, 10));
// Then
assertEquals(2L, result.getContent().size());
assertEquals("Doe", result.getContent().getFirst().getSurname());
assertEquals("Roe", result.getContent().get(1).getSurname());
}

@Test
@DisplayName("Should return single client filer equals date of birth")
void shouldReturnSingleClientFilterEqualsDateOfBirth(){
// Given
LocalDate dateOfBirth = LocalDate.of(1985, 06, 15);
// When
Page<ClientDetail> result = repository.findAll(null, null, dateOfBirth,
null, null, null, null,
PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals(dateOfBirth, result.getContent().getFirst().getDateOfBirth());
}

@Test
@DisplayName("Should return single client equals gender")
void shouldReturnSingleClientFilterEqualsGender(){
// Given
String gender = "male";
// When
Page<ClientDetail> result = repository.findAll(null, null, null,
gender, null, null, null,
PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals("Male", result.getContent().getFirst().getGender());
}

@Test
@DisplayName("Should return single client filter equals gender alt")
void shouldReturnSingleClientFilterEqualsGenderAlt(){
// Given
String gender = "FEMALE";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, gender, null, null,
null, PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals("Female", result.getContent().getFirst().getGender());
}

@Test
@DisplayName("Should return single client filter equals client reference number")
void shouldReturnSingleClientFilterEqualsClientReferenceNumber(){
// Given
String clientReferenceNumber = "100000000000001";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, null, clientReferenceNumber,
null, null, PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals(100000000000001L, result.getContent().getFirst()
.getClientReferenceNumber());
}

@Test
@DisplayName("Should return multiple client filter like client reference number")
void shouldReturnMultipleClientFilterLikeClientReferenceNumber(){
// Given
String clientReferenceNumber = "10000000000";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, null, clientReferenceNumber,
null, null, PageRequest.of(0, 10));
// Then
assertEquals(2L, result.getContent().size());
assertEquals(100000000000001L, result.getContent().getFirst()
.getClientReferenceNumber());
assertEquals(100000000000002L, result.getContent().get(1)
.getClientReferenceNumber());
}

@Test
@DisplayName("Should return single client filter equals home office reference number")
void shouldReturnSingleClientFilterEqualsHomeOfficeReferenceNumber(){
// Given
String homeOfficeNumber = "HO123456";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, null, null,
homeOfficeNumber, null, PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals("HO123456", result.getContent().getFirst()
.getHomeOfficeNumber());
}

@Test
@DisplayName("Should return multiple clients filter like home office reference number")
void shouldReturnMultipleClientsFilterLikeHomeOfficeReferenceNumber(){
// Given
String homeOfficeNumber = "HO";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, null, null,
homeOfficeNumber, null, PageRequest.of(0, 10));
// Then
assertEquals(2L, result.getContent().size());
assertEquals("HO123456", result.getContent().getFirst()
.getHomeOfficeNumber());
assertEquals("HO987654", result.getContent().get(1)
.getHomeOfficeNumber());
}

@Test
@DisplayName("Should return single client filter equals national insurance number")
void shouldReturnSingleClientFilterEqualsNationalInsuranceNumber(){
// Given
String nationalInsuranceNumber = "AB123456C";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, null, null,
null, nationalInsuranceNumber,
PageRequest.of(0, 10));
// Then
assertEquals(1L, result.getContent().size());
assertEquals("AB123456C", result.getContent().getFirst()
.getNationalInsuranceNumber());
}

@Test
@DisplayName("Should return multiple clients filter like national insurance number")
void shouldReturnMultipleClientsFilterLikeNationalInsuranceNumber(){
// Given
String nationalInsuranceNumber = "123";
// When
Page<ClientDetail> result = repository.findAll(null, null,
null, null, null,
null, nationalInsuranceNumber,
PageRequest.of(0, 10));
// Then
assertEquals(2L, result.getContent().size());
assertEquals("AB123456C", result.getContent().getFirst()
.getNationalInsuranceNumber());
assertEquals("CD123654E", result.getContent().get(1)
.getNationalInsuranceNumber());
}

@Test
@DisplayName("Should sort by first name")
void shouldSortByFirstName(){
// Given
// When
PageRequest pageable = PageRequest.of(0, 10,
Sort.by(Sort.Order.asc("FIRSTNAME")));
Page<ClientDetail> result = repository.findAll(null, null,
null, null, null,
null, null,
pageable);
// Then
assertEquals(2L, result.getContent().size());
assertEquals("Jane", result.getContent().getFirst()
.getFirstName());
assertEquals("John", result.getContent().get(1)
.getFirstName());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ INSERT INTO XXCCMS.XXCCMS_GET_CLIENT_DETAILS_V (CLIENT_REFERENCE_NUMBER, TITLE,
CORRESPONDENCE_LANGUAGE,
ETHNIC_MONITORING, NO_FIX_ABODE, NI_NUMBER,
HOME_OFFICE_NUMBER)
VALUES (100000000000002, 'Ms.', 'Jane', 'Doe', 'Johnson',
VALUES (100000000000002, 'Ms.', 'Jane', 'Roe', 'Johnson',
TO_DATE('1990-03-21', 'YYYY-MM-DD'), 'Female', 'CAN', 'Married',
'Phone', 'Visual Impairment', 'French',
'Caucasian', 'No', 'CD987654E', 'HO987654');
'Caucasian', 'No', 'CD123654E', 'HO987654');
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public ResponseEntity<TransactionStatus> getClientTransactionStatus(String trans

@Override
public ResponseEntity<ClientDetails> getClients(String firstName, String surname,
LocalDate dateOfBirth, String gender, String caseReferenceNumber, String homeOfficeReference,
LocalDate dateOfBirth, String gender, String clientReferenceNumber, String homeOfficeReference,
String nationalInsuranceNumber, Pageable pageable) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package uk.gov.laa.ccms.data.repository;

import jakarta.persistence.EntityManager;
import java.util.StringJoiner;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;

@RequiredArgsConstructor
public abstract class BaseEntityManagerRepository {

protected final EntityManager entityManager;

protected static boolean stringNotEmpty(String value) {
return value != null && !value.isEmpty();
}

protected static String getSortSql(Pageable pageable) {
if (pageable.getSort().isEmpty()) {
return " ";
}

StringJoiner sortJoiner = new StringJoiner(", ", " ORDER BY ", " ");
pageable.getSort().forEach(order ->
sortJoiner.add(order.getProperty() + " " + order.getDirection().name()));
return sortJoiner.toString();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
Expand All @@ -24,17 +23,22 @@
* <p>It relies on {@link EntityManager} to execute native SQL queries and doesn't use standard
* Spring Data repositories. All queries are read-only and do not modify the database state.</p>
*
* <p>Extends {@link BaseEntityManagerRepository} which contains helper methods
* for helping build a SQL query and {@link EntityManager}.</p>
*
* @see Page
* @see CaseSearch
* @see EntityManager
* @see BaseEntityManagerRepository
*
* @author Jamie Briggs
*/
@Repository
@RequiredArgsConstructor
public class CaseSearchRepository {
public class CaseSearchRepository extends BaseEntityManagerRepository{

private final EntityManager entityManager;
public CaseSearchRepository(EntityManager entityManager) {
super(entityManager);
}

/**
* Retrieves a paginated and filtered list of case search records based on the given parameters.
Expand Down Expand Up @@ -95,19 +99,19 @@ private static String getFilterSql(long providerFirmPartyId, String caseReferenc
// Provider firm party id
sj.add("WHERE PROVIDER_FIRM_PARTY_ID = " + providerFirmPartyId);
// Case reference number
if (!Objects.isNull(caseReferenceNumber) && !caseReferenceNumber.isBlank()) {
if (stringNotEmpty(caseReferenceNumber)) {
sj.add("LSC_CASE_REFERENCE LIKE '%" + caseReferenceNumber + "%'");
}
// Provider case reference
if (!Objects.isNull(providerCaseReference) && !providerCaseReference.isBlank()) {
if (stringNotEmpty(providerCaseReference)) {
sj.add("UPPER(PROVIDER_CASE_REFERENCE) LIKE '%" + providerCaseReference.toUpperCase() + "%'");
}
// Case status
if (!Objects.isNull(caseStatus) && !caseStatus.isBlank()) {
if (stringNotEmpty(caseStatus)) {
sj.add("ACTUAL_CASE_STATUS = '" + caseStatus + "'");
}
// Surname
if (!Objects.isNull(clientSurname) && !clientSurname.isBlank()) {
if (stringNotEmpty(clientSurname)) {
sj.add("UPPER(PERSON_LAST_NAME) LIKE '%" + clientSurname.toUpperCase() + "%'");
}
// Fee earner party ID
Expand Down
Loading

0 comments on commit fab2af1

Please sign in to comment.