Skip to content

Commit

Permalink
PO-314: Initial coding to support Result ref-data
Browse files Browse the repository at this point in the history
  • Loading branch information
RustyHMCTS committed Jul 26, 2024
1 parent 4347738 commit 30b130e
Show file tree
Hide file tree
Showing 8 changed files with 182 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.gov.hmcts.opal.controllers.develop;
package uk.gov.hmcts.opal.controllers;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -11,6 +11,7 @@
import org.springframework.test.web.servlet.MockMvc;
import uk.gov.hmcts.opal.dto.search.ResultSearchDto;
import uk.gov.hmcts.opal.entity.ResultEntity;
import uk.gov.hmcts.opal.entity.projection.ResultReferenceData;
import uk.gov.hmcts.opal.service.opal.ResultService;

import static java.util.Collections.singletonList;
Expand Down Expand Up @@ -40,7 +41,7 @@ void testGetResultById() throws Exception {

when(resultService.getResult(1L)).thenReturn(resultEntity);

mockMvc.perform(get("/dev/result/1"))
mockMvc.perform(get("/api/result/1"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.resultId").value(1))
Expand Down Expand Up @@ -73,7 +74,7 @@ void testGetResultById() throws Exception {
void testGetResultById_WhenResultDoesNotExist() throws Exception {
when(resultService.getResult(2L)).thenReturn(null);

mockMvc.perform(get("/dev/result/2"))
mockMvc.perform(get("/api/result/2"))
.andExpect(status().isNoContent());
}

Expand All @@ -83,7 +84,7 @@ void testPostResultsSearch() throws Exception {

when(resultService.searchResults(any(ResultSearchDto.class))).thenReturn(singletonList(resultEntity));

mockMvc.perform(post("/dev/result/search")
mockMvc.perform(post("/api/result/search")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"criteria\":\"value\"}"))
.andExpect(status().isOk())
Expand Down Expand Up @@ -115,12 +116,31 @@ void testPostResultsSearch() throws Exception {

@Test
void testPostResultsSearch_WhenResultDoesNotExist() throws Exception {
mockMvc.perform(post("/dev/result/search")
mockMvc.perform(post("/api/result/search")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"criteria\":\"2\"}"))
.andExpect(status().isNoContent());
}


@Test
void testGetEnforcerRefData() throws Exception {
ResultReferenceData refData = new ResultReferenceData("result-id-001", "Result Title",
"Result Tittle Cy", "FINAL");

when(resultService.getReferenceData(any())).thenReturn(singletonList(refData));

mockMvc.perform(get("/api/result/ref-data")
.header("authorization", "Bearer some_value"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.count").value(1))
.andExpect(jsonPath("$.refData[0].resultId").value("result-id-001"))
.andExpect(jsonPath("$.refData[0].resultTitle").value("Result Title"))
.andExpect(jsonPath("$.refData[0].resultTitleCy").value("Result Tittle Cy"))
.andExpect(jsonPath("$.refData[0].resultType").value("FINAL"));
}

private ResultEntity createResultEntity() {
return ResultEntity.builder()
.resultId("1")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.gov.hmcts.opal.controllers.develop;
package uk.gov.hmcts.opal.controllers;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -12,25 +12,33 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import uk.gov.hmcts.opal.dto.reference.ResultReferenceDataResults;
import uk.gov.hmcts.opal.dto.search.ResultSearchDto;
import uk.gov.hmcts.opal.entity.ResultEntity;
import uk.gov.hmcts.opal.entity.projection.ResultReferenceData;
import uk.gov.hmcts.opal.service.ResultServiceInterface;
import uk.gov.hmcts.opal.service.opal.ResultService;

import java.util.List;
import java.util.Optional;

import static uk.gov.hmcts.opal.util.HttpUtil.buildResponse;


@RestController
@RequestMapping("/dev/result")
@RequestMapping("/api/result")
@Slf4j(topic = "ResultController")
@Tag(name = "Result Controller")
public class ResultController {

private final ResultServiceInterface resultService;

public ResultController(@Qualifier("resultServiceProxy") ResultServiceInterface resultService) {
private final ResultService opalResultService;

public ResultController(@Qualifier("resultServiceProxy") ResultServiceInterface resultService,
ResultService opalResultService) {
this.resultService = resultService;
this.opalResultService = opalResultService;
}

@GetMapping(value = "/{resultId}")
Expand All @@ -54,5 +62,15 @@ public ResponseEntity<List<ResultEntity>> postResultsSearch(@RequestBody ResultS
return buildResponse(response);
}

@GetMapping(value = {"/ref-data", "/ref-data/", "/ref-data/{filter}"})
@Operation(summary = "Returns MajorCreditors as reference data with an optional filter applied")
public ResponseEntity<ResultReferenceDataResults> getResultRefData(
@PathVariable Optional<String> filter) {
log.info(":GET:getMajorCreditorRefData: filter string: {}", filter);

List<ResultReferenceData> refData = opalResultService.getReferenceData(filter);

log.info(":GET:getMajorCreditorRefData: major creditor reference data count: {}", refData.size());
return ResponseEntity.ok(ResultReferenceDataResults.builder().refData(refData).build());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package uk.gov.hmcts.opal.dto.reference;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.opal.entity.projection.ResultReferenceData;

import java.util.List;
import java.util.Optional;

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class ResultReferenceDataResults {
private Integer count;
private List<ResultReferenceData> refData;

public static class ResultReferenceDataResultsBuilder {
public ResultReferenceDataResults.ResultReferenceDataResultsBuilder refData(
List<ResultReferenceData> refData) {
this.refData = refData;
return this.count(Optional.ofNullable(refData).map(List::size).orElse(0));
}

private ResultReferenceDataResults.ResultReferenceDataResultsBuilder count(Integer count) {
this.count = count;
return this;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package uk.gov.hmcts.opal.entity.projection;

public record ResultReferenceData(String resultId, String resultTitle, String resultTitleCy, String resultType) {

}
15 changes: 15 additions & 0 deletions src/main/java/uk/gov/hmcts/opal/repository/jpa/ResultSpecs.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import uk.gov.hmcts.opal.entity.ResultEntity;
import uk.gov.hmcts.opal.entity.ResultEntity_;

import java.util.Optional;

public class ResultSpecs extends EntitySpecs<ResultEntity> {

public Specification<ResultEntity> findBySearchCriteria(ResultSearchDto criteria) {
Expand All @@ -21,6 +23,12 @@ public Specification<ResultEntity> findBySearchCriteria(ResultSearchDto criteria
));
}

public Specification<ResultEntity> referenceDataFilter(Optional<String> filter) {
return Specification.allOf(specificationList(
filter.filter(s -> !s.isBlank()).map(this::likeAnyResult)
));
}

public static Specification<ResultEntity> equalsResultId(String resultId) {
return (root, query, builder) -> builder.equal(root.get(ResultEntity_.resultId), resultId);
}
Expand Down Expand Up @@ -79,4 +87,11 @@ public static Specification<ResultEntity> likeUserEntries(String userEntries) {
userEntries);
}

public Specification<ResultEntity> likeAnyResult(String filter) {
return Specification.anyOf(
likeResultId(filter),
likeResultTitle(filter),
likeResultTitleCy(filter)
);
}
}
30 changes: 30 additions & 0 deletions src/main/java/uk/gov/hmcts/opal/service/opal/ResultService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,21 @@

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.opal.dto.search.ResultSearchDto;
import uk.gov.hmcts.opal.entity.ResultEntity_;
import uk.gov.hmcts.opal.entity.ResultEntity;
import uk.gov.hmcts.opal.entity.projection.ResultReferenceData;
import uk.gov.hmcts.opal.repository.ResultRepository;
import uk.gov.hmcts.opal.repository.jpa.ResultSpecs;
import uk.gov.hmcts.opal.service.ResultServiceInterface;

import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
Expand All @@ -37,4 +42,29 @@ public List<ResultEntity> searchResults(ResultSearchDto criteria) {
return page.getContent();
}

@Cacheable(
cacheNames = "resultReferenceDataCache",
key = "#filter.orElse('noFilter')"
)
public List<ResultReferenceData> getReferenceData(Optional<String> filter) {

Sort nameSort = Sort.by(Sort.Direction.ASC, ResultEntity_.RESULT_TITLE);

Page<ResultEntity> page = resultRepository
.findBy(specs.referenceDataFilter(filter),
ffq -> ffq
.sortBy(nameSort)
.page(Pageable.unpaged()));

return page.getContent().stream().map(this::toRefData).toList();
}

private ResultReferenceData toRefData(ResultEntity entity) {
return new ResultReferenceData(
entity.getResultId(),
entity.getResultTitle(),
entity.getResultTitleCy(),
entity.getResultType()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package uk.gov.hmcts.opal.controllers.develop;
package uk.gov.hmcts.opal.controllers;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -7,12 +7,14 @@
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import uk.gov.hmcts.opal.controllers.develop.ResultController;
import uk.gov.hmcts.opal.dto.reference.ResultReferenceDataResults;
import uk.gov.hmcts.opal.dto.search.ResultSearchDto;
import uk.gov.hmcts.opal.entity.ResultEntity;
import uk.gov.hmcts.opal.entity.projection.ResultReferenceData;
import uk.gov.hmcts.opal.service.opal.ResultService;

import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
Expand Down Expand Up @@ -63,4 +65,25 @@ void testSearchResults_Success() {
verify(resultService, times(1)).searchResults(any());
}

@Test
void testGetResultsRefData_Success() {
// Arrange
ResultReferenceData refData = new ResultReferenceData("result-id-001", "Result Title",
"Result Tittle Cy", "FINAL");
List<ResultReferenceData> refDataList = List.of(refData);

when(resultService.getReferenceData(any())).thenReturn(refDataList);

// Act
Optional<String> filter = Optional.empty();
ResponseEntity<ResultReferenceDataResults> response = resultController
.getResultRefData(filter);

// Assert
assertEquals(HttpStatus.OK, response.getStatusCode());
ResultReferenceDataResults refDataResults = response.getBody();
assertEquals(1, refDataResults.getCount());
assertEquals(refDataList, refDataResults.getRefData());
verify(resultService, times(1)).getReferenceData(any());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
import org.springframework.data.repository.query.FluentQuery;
import uk.gov.hmcts.opal.dto.search.ResultSearchDto;
import uk.gov.hmcts.opal.entity.ResultEntity;
import uk.gov.hmcts.opal.entity.projection.ResultReferenceData;
import uk.gov.hmcts.opal.repository.ResultRepository;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;

import static org.junit.jupiter.api.Assertions.assertEquals;
Expand Down Expand Up @@ -68,5 +70,32 @@ void testSearchResults() {

}

@SuppressWarnings("unchecked")
@Test
void testResultsReferenceData() {
// Arrange
FluentQuery.FetchableFluentQuery ffq = Mockito.mock(FluentQuery.FetchableFluentQuery.class);
when(ffq.sortBy(any())).thenReturn(ffq);

ResultEntity entity = ResultEntity.builder().build();
Page<ResultEntity> mockPage = new PageImpl<>(List.of(entity), Pageable.unpaged(), 999L);
when(resultRepository.findBy(any(Specification.class), any())).thenAnswer(iom -> {
iom.getArgument(1, Function.class).apply(ffq);
return mockPage;
});

// Act
List<ResultReferenceData> result = resultService.getReferenceData(Optional.empty());

ResultReferenceData refData = new ResultReferenceData(
entity.getResultId(),
entity.getResultTitle(),
entity.getResultTitleCy(),
entity.getResultType()
);

// Assert
assertEquals(List.of(refData), result);

}
}

0 comments on commit 30b130e

Please sign in to comment.