Skip to content

Commit

Permalink
Merge pull request #731 from MeasureAuthoringTool/MAT-6398
Browse files Browse the repository at this point in the history
MAT-6398: add findAllyByCqlLibraryName for better error handling
  • Loading branch information
ethankaplan authored Oct 3, 2024
2 parents 19f3c8b + 1d89ba9 commit a6b09fd
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public interface MeasureRepository
MeasureAclRepository,
MeasureCmsIdRepository {
@Query("{cqlLibraryName : ?0, active : true}")
Optional<Measure> findByCqlLibraryName(String cqlLibraryName);
List<Measure> findAllByCqlLibraryName(String cqlLibraryName);

Optional<Measure> findByIdAndActive(String id, Boolean active);

Expand Down
14 changes: 2 additions & 12 deletions src/main/java/cms/gov/madie/measure/services/MeasureService.java
Original file line number Diff line number Diff line change
Expand Up @@ -315,19 +315,9 @@ public Page<MeasureListDTO> getMeasures(
}

public void checkDuplicateCqlLibraryName(String cqlLibraryName) {
if (StringUtils.isNotEmpty(cqlLibraryName)
&& measureRepository.findByCqlLibraryName(cqlLibraryName).isPresent()) {
throw new DuplicateKeyException(
"cqlLibraryName", "CQL library with given name already exists.");
}
}

public void checkDuplicateCqlLibraryName(String cqlLibraryName, String measureSetId) {
if (StringUtils.isNotEmpty(cqlLibraryName)) {
Optional<Measure> anyMatchingMeasure = measureRepository.findByCqlLibraryName(cqlLibraryName);
Optional<Measure> matchingMeasureInMeasureSet =
anyMatchingMeasure.filter(measure -> measure.getMeasureSetId().equals((measureSetId)));
if (anyMatchingMeasure.isPresent() && matchingMeasureInMeasureSet.isEmpty()) {
List<Measure> measureList = measureRepository.findAllByCqlLibraryName(cqlLibraryName);
if (!measureList.isEmpty()) {
throw new DuplicateKeyException(
"cqlLibraryName", "CQL library with given name already exists.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ public void testCreateMeasureSuccessfullyWithDefaultCqlQDM() throws Exception {
doNothing()
.when(measureSetService)
.createMeasureSet(anyString(), anyString(), anyString(), any());
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());
when(elmTranslatorClient.getElmJson(anyString(), anyString(), anyString()))
.thenReturn(ElmJson.builder().json("{\"library\": {}}").xml("<library></library>").build());
when(elmTranslatorClient.hasErrors(any(ElmJson.class))).thenReturn(false);
Expand Down Expand Up @@ -466,7 +466,7 @@ public void testCreateMeasureSuccessfullyWithNoCqlQDM() throws Exception {
doNothing()
.when(measureSetService)
.createMeasureSet(anyString(), anyString(), anyString(), any());
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());

when(measureRepository.save(any(Measure.class))).thenReturn(measureToSave);
when(actionLogService.logAction(any(), any(), any(), any())).thenReturn(true);
Expand Down Expand Up @@ -503,7 +503,7 @@ public void testCreateMeasureSuccessfullyWithDefaultCqlQICore() throws Exception
doNothing()
.when(measureSetService)
.createMeasureSet(anyString(), anyString(), anyString(), any());
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());
when(elmTranslatorClient.getElmJson(anyString(), anyString(), anyString()))
.thenReturn(ElmJson.builder().json("{\"library\": {}}").xml("<library></library>").build());
when(elmTranslatorClient.hasErrors(any(ElmJson.class))).thenReturn(false);
Expand Down Expand Up @@ -539,7 +539,7 @@ public void testCreateMeasureSuccessfullyWithNoCqlQICore() throws Exception {
doNothing()
.when(measureSetService)
.createMeasureSet(anyString(), anyString(), anyString(), any());
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());

when(measureRepository.save(any(Measure.class))).thenReturn(measureToSave);
when(actionLogService.logAction(any(), any(), any(), any())).thenReturn(true);
Expand All @@ -564,7 +564,7 @@ public void testCreateMeasureSuccessfullyWithValidCql() {
.cqlLibraryName("VTE")
.build();

when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());
when(elmTranslatorClient.getElmJson(anyString(), anyString(), anyString()))
.thenReturn(ElmJson.builder().json(elmJson).build());
when(elmTranslatorClient.hasErrors(any(ElmJson.class))).thenReturn(false);
Expand Down Expand Up @@ -598,7 +598,7 @@ public void testCreateMeasureSuccessfullyWithInvalidCqlAndTerminology() {
.createdBy(usr)
.build();

when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());
when(elmTranslatorClient.getElmJson(anyString(), anyString(), anyString()))
.thenReturn(ElmJson.builder().json(elmJson).build());
when(elmTranslatorClient.hasErrors(any(ElmJson.class))).thenReturn(true);
Expand Down Expand Up @@ -627,11 +627,13 @@ public void testCreateMeasureWhenLibraryNameDuplicate() {
measure1.toBuilder()
.measurementPeriodStart(Date.from(Instant.now().minus(38, ChronoUnit.DAYS)))
.measurementPeriodEnd(Date.from(Instant.now().minus(11, ChronoUnit.DAYS)))
.active(true)
.cqlLibraryName("VTE")
.cql("")
.elmJson(null)
.build();
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.of(measure1));
List<Measure> measureList = Collections.singletonList(measure1);
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(measureList);

assertThrows(
DuplicateKeyException.class,
Expand All @@ -650,7 +652,7 @@ public void testCreateMeasureToHaveUpdatedMeasurementPeriods() {
.cqlLibraryName("VTE")
.build();

when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());
when(elmTranslatorClient.getElmJson(anyString(), anyString(), anyString()))
.thenReturn(ElmJson.builder().json(elmJson).build());
when(elmTranslatorClient.hasErrors(any(ElmJson.class))).thenReturn(false);
Expand All @@ -676,14 +678,19 @@ public void testCreateMeasureToHaveUpdatedMeasurementPeriods() {
@Test
public void testUpdateMeasureThrowsExceptionForDuplicateLibraryName() {
Measure original =
Measure.builder().cqlLibraryName("OriginalLibName").measureName("Measure1").build();
Measure.builder()
.cqlLibraryName("OriginalLibName")
.measureName("Measure1")
.active(true)
.build();

Measure updated = original.toBuilder().cqlLibraryName("Changed_Name").build();
Measure updated = original.toBuilder().cqlLibraryName("Changed_Name").active(true).build();

List<Measure> measureList = Collections.singletonList(Measure.builder().build());

when(measureUtil.isCqlLibraryNameChanged(any(Measure.class), any(Measure.class)))
.thenReturn(true);
when(measureRepository.findByCqlLibraryName(anyString()))
.thenReturn(Optional.of(Measure.builder().build()));
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(measureList);

assertThrows(
DuplicateKeyException.class,
Expand Down Expand Up @@ -752,7 +759,7 @@ public void testUpdateMeasureSavesMeasure() {
.build();
when(measureUtil.isCqlLibraryNameChanged(any(Measure.class), any(Measure.class)))
.thenReturn(true);
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(Optional.empty());
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(new ArrayList<>());
when(measureUtil.isMeasurementPeriodChanged(any(Measure.class), any(Measure.class)))
.thenReturn(true);
when(measureUtil.isMeasureCqlChanged(any(Measure.class), any(Measure.class))).thenReturn(false);
Expand Down Expand Up @@ -1158,17 +1165,19 @@ public void testValidateMeasureMeasurementPeriod() {

@Test
public void testCheckDuplicateCqlLibraryNameDoesNotThrowException() {
Optional<Measure> measureOpt = Optional.empty();
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(measureOpt);
List<Measure> measureOpt = new ArrayList<>();
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(measureOpt);
measureService.checkDuplicateCqlLibraryName("testCQLLibraryName");
verify(measureRepository, times(1)).findByCqlLibraryName(eq("testCQLLibraryName"));
verify(measureRepository, times(1)).findAllByCqlLibraryName(eq("testCQLLibraryName"));
}

@Test
public void testCheckDuplicateCqlLibraryNameThrowsExceptionForExistingName() {
final Measure measure = Measure.builder().cqlLibraryName("testCQLLibraryName").build();
Optional<Measure> measureOpt = Optional.of(measure);
when(measureRepository.findByCqlLibraryName(anyString())).thenReturn(measureOpt);
final Measure measure =
Measure.builder().cqlLibraryName("testCQLLibraryName").active(true).build();
final List<Measure> measureOpt = Collections.singletonList(measure);
// Optional<Measure> measureOpt = Optional.of(measure);
when(measureRepository.findAllByCqlLibraryName(anyString())).thenReturn(measureOpt);
assertThrows(
DuplicateKeyException.class,
() -> measureService.checkDuplicateCqlLibraryName("testCQLLibraryName"));
Expand Down

0 comments on commit a6b09fd

Please sign in to comment.