Skip to content

Commit

Permalink
MAT-7689 assign case number when drafting
Browse files Browse the repository at this point in the history
  • Loading branch information
Cecilia Liu committed Oct 4, 2024
1 parent 19f3c8b commit c2a3bac
Show file tree
Hide file tree
Showing 2 changed files with 214 additions and 9 deletions.
65 changes: 58 additions & 7 deletions src/main/java/cms/gov/madie/measure/services/VersionService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cms.gov.madie.measure.services;

import cms.gov.madie.measure.dto.MadieFeatureFlag;
import cms.gov.madie.measure.exceptions.BadVersionRequestException;
import cms.gov.madie.measure.exceptions.CqlElmTranslationErrorException;
import cms.gov.madie.measure.exceptions.MeasureNotDraftableException;
Expand Down Expand Up @@ -33,6 +34,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.Comparator;
import java.util.Collections;

@Slf4j
@AllArgsConstructor
Expand All @@ -48,6 +51,8 @@ public class VersionService {
private final MeasureService measureService;
private final QdmPackageService qdmPackageService;
private final ExportService exportService;
private final TestCaseSequenceService sequenceService;
private final AppConfigService appConfigService;

public enum VersionValidationResult {
VALID,
Expand Down Expand Up @@ -198,7 +203,13 @@ public Measure createDraft(String id, String measureName, String model, String u

measureDraft.getMeasureMetaData().setDraft(true);
measureDraft.setGroups(cloneMeasureGroups(measure.getGroups()));
measureDraft.setTestCases(cloneTestCases(measure.getTestCases(), measureDraft.getGroups()));
measureDraft.setTestCases(
cloneTestCases(
measure.getTestCases(),
measureDraft.getGroups(),
id,
appConfigService.isFlagEnabled(MadieFeatureFlag.TEST_CASE_ID),
checkCaseNumberExists(measure.getTestCases(), id)));
var now = Instant.now();
measureDraft.setCreatedAt(now);
measureDraft.setLastModifiedAt(now);
Expand Down Expand Up @@ -233,9 +244,25 @@ private List<Group> cloneMeasureGroups(List<Group> groups) {
return List.of();
}

private List<TestCase> cloneTestCases(List<TestCase> testCases, List<Group> draftGroups) {
private List<TestCase> cloneTestCases(
List<TestCase> testCases,
List<Group> draftGroups,
String measureId,
boolean isFlagEnabled,
boolean caseNumberExists) {
if (!CollectionUtils.isEmpty(testCases)) {
return testCases.stream()
List<TestCase> testCasesCopy = new ArrayList<>(testCases);
Collections.sort(
testCasesCopy,
new Comparator<TestCase>() {
public int compare(TestCase o1, TestCase o2) {
if (o1.getCreatedAt() == null || o2.getCreatedAt() == null) {
return 0;
}
return o1.getCreatedAt().compareTo(o2.getCreatedAt());
}
});
return testCasesCopy.stream()
.map(
testCase -> {
List<TestCaseGroupPopulation> updatedTestCaseGroupPopulations = new ArrayList<>();
Expand All @@ -252,10 +279,21 @@ private List<TestCase> cloneTestCases(List<TestCase> testCases, List<Group> draf
.build())
.toList());
}
return testCase.toBuilder()
.id(ObjectId.get().toString())
.groupPopulations(updatedTestCaseGroupPopulations)
.build();
testCase =
testCase.toBuilder()
.id(ObjectId.get().toString())
.groupPopulations(updatedTestCaseGroupPopulations)
.build();
if (isFlagEnabled) {
if (caseNumberExists) {
testCase.setCaseNumber(testCase.getCaseNumber());
} else {
testCase.setCaseNumber(sequenceService.generateSequence(measureId));
}
} else {
testCase.setCaseNumber(null);
}
return testCase;
})
.collect(Collectors.toList());
}
Expand Down Expand Up @@ -356,4 +394,17 @@ private void savePackageData(Measure savedMeasure, byte[] packageData, String us
username,
savedExport.getId());
}

private boolean checkCaseNumberExists(List<TestCase> testCases, String measureId) {
if (!CollectionUtils.isEmpty(testCases)) {
for (TestCase testCase : testCases) {
if (testCase.getCaseNumber() == null || testCase.getCaseNumber() == 0) {
return false;
}
}
} else {
return false;
}
return true;
}
}
158 changes: 156 additions & 2 deletions src/test/java/cms/gov/madie/measure/services/VersionServiceTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cms.gov.madie.measure.services;

import cms.gov.madie.measure.dto.MadieFeatureFlag;
import cms.gov.madie.measure.dto.PackageDto;
import cms.gov.madie.measure.exceptions.BadVersionRequestException;
import cms.gov.madie.measure.exceptions.CqlElmTranslationErrorException;
Expand All @@ -18,6 +19,7 @@
import gov.cms.madie.models.measure.MeasureMetaData;
import gov.cms.madie.models.measure.TestCase;
import gov.cms.madie.models.measure.*;

import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -28,6 +30,7 @@
import org.mockito.junit.jupiter.MockitoExtension;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Optional;

Expand Down Expand Up @@ -64,6 +67,9 @@ public class VersionServiceTest {

@Mock ExportService exportService;

@Mock TestCaseSequenceService sequenceService;
@Mock AppConfigService appConfigService;

@InjectMocks VersionService versionService;

@Captor private ArgumentCaptor<Measure> measureCaptor;
Expand All @@ -75,6 +81,11 @@ public class VersionServiceTest {
"{\n" + "\"errorExceptions\" : \n" + "[ {\"error\":\"error translating cql\" } ]\n" + "}";
private final String ELMJON_NO_ERROR = "{\n" + "\"errorExceptions\" : \n" + "[]\n" + "}";

// private Instant instant =
// new
// SimpleDateFormat("yyyy-MM-ddTHH:mm:ss.SSS").parse("2024-10-02T13:16:18.000").toInstant();
private final Instant today = Instant.now();

TestCaseGroupPopulation testCaseGroupPopulation =
TestCaseGroupPopulation.builder()
.groupId("groupId1")
Expand All @@ -85,14 +96,29 @@ public class VersionServiceTest {
TestCase testCase =
TestCase.builder()
.id("testId1")
.caseNumber(2)
.name("IPPPass")
.series("BloodPressure>124")
.createdAt(today)
.createdBy("TestUser")
.lastModifiedBy("TestUser2")
.json("{\"resourceType\":\"Patient\"}")
.title("Test1")
.groupPopulations(List.of(testCaseGroupPopulation))
.build();
TestCase testCase2 =
TestCase.builder()
.id("testId2")
.caseNumber(1)
.name("IPPPass")
.series("BloodPressure>124")
.createdAt(today.minus(300, ChronoUnit.SECONDS))
.createdBy("TestUser")
.lastModifiedBy("TestUser2")
.json("{\"resourceType\":\"Patient\"}")
.title("Test2")
.groupPopulations(List.of(testCaseGroupPopulation))
.build();
Group cvGroup =
Group.builder()
.id("xyz-p12r-12ert")
Expand All @@ -119,8 +145,6 @@ public class VersionServiceTest {

MeasureSet measureSet = MeasureSet.builder().measureSetId("MS123").cmsId(144).build();

private final Instant today = Instant.now();

@Test
public void testCheckValidVersioningThrowsResourceNotFoundException() {
when(measureService.findMeasureById(anyString())).thenReturn(null);
Expand Down Expand Up @@ -624,6 +648,7 @@ public void testCreateDraftSuccessfully() {
.thenReturn(false);
when(measureRepository.save(any(Measure.class))).thenReturn(versionedCopy);
when(actionLogService.logAction(anyString(), any(), any(), anyString())).thenReturn(true);
when(appConfigService.isFlagEnabled(MadieFeatureFlag.TEST_CASE_ID)).thenReturn(false);

Measure draft =
versionService.createDraft(versionedMeasure.getId(), "Test", "QI-Core v4.1.1", "test-user");
Expand Down Expand Up @@ -680,6 +705,7 @@ public void testCreateDraftWithUpdatedModelSuccessfully() {
.thenReturn(false);
when(measureRepository.save(any(Measure.class))).thenReturn(versionedCopy);
when(actionLogService.logAction(anyString(), any(), any(), anyString())).thenReturn(true);
when(appConfigService.isFlagEnabled(MadieFeatureFlag.TEST_CASE_ID)).thenReturn(false);

versionService.createDraft(versionedMeasure.getId(), "Test", "QI-Core v6.0.0", "test-user");
verify(measureRepository, times(1)).save(measureArgumentCaptor.capture());
Expand Down Expand Up @@ -813,4 +839,132 @@ private Measure buildBasicMeasure() {
.testCases(List.of(testCase))
.build();
}

@Test
public void testCreateDraftCopyCaseNumberFromExistingTestCase() {
TestCaseGroupPopulation clonedTestCaseGroupPopulation =
TestCaseGroupPopulation.builder()
.groupId("clonedGroupId1")
.scoring("Cohort")
.populationBasis("boolean")
.build();
Measure versionedMeasure = buildBasicMeasure();
versionedMeasure.setTestCases(List.of(testCase, testCase2));

MeasureMetaData metaData = new MeasureMetaData();
metaData.setDraft(true);
Measure versionedCopy =
versionedMeasure.toBuilder()
.id("2")
.versionId("13-13-13-13")
.measureName("Test")
.measureMetaData(metaData)
.groups(List.of(cvGroup.toBuilder().id(ObjectId.get().toString()).build()))
.testCases(
List.of(
testCase.toBuilder()
.id(ObjectId.get().toString())
.groupPopulations(List.of(clonedTestCaseGroupPopulation))
.build(),
testCase2.toBuilder()
.id(ObjectId.get().toString())
.groupPopulations(List.of(clonedTestCaseGroupPopulation))
.build()))
.build();

when(measureRepository.findById(anyString())).thenReturn(Optional.of(versionedMeasure));
when(measureRepository.existsByMeasureSetIdAndActiveAndMeasureMetaDataDraft(
anyString(), anyBoolean(), anyBoolean()))
.thenReturn(false);
when(measureRepository.save(any(Measure.class))).thenReturn(versionedCopy);
when(actionLogService.logAction(anyString(), any(), any(), anyString())).thenReturn(true);
when(appConfigService.isFlagEnabled(MadieFeatureFlag.TEST_CASE_ID)).thenReturn(true);

Measure draft =
versionService.createDraft(versionedMeasure.getId(), "Test", "QI-Core v4.1.1", "test-user");

assertThat(draft.getMeasureName(), is(equalTo("Test")));
// draft flag to true
assertThat(draft.getMeasureMetaData().isDraft(), is(equalTo(true)));
// version remains same
assertThat(draft.getVersion().getMajor(), is(equalTo(2)));
assertThat(draft.getVersion().getMinor(), is(equalTo(3)));
assertThat(draft.getVersion().getRevisionNumber(), is(equalTo(1)));
assertThat(draft.getGroups().size(), is(equalTo(1)));
assertFalse(draft.getGroups().stream().anyMatch(item -> "xyz-p12r-12ert".equals(item.getId())));
assertThat(draft.getTestCases().size(), is(equalTo(2)));
assertFalse(draft.getGroups().stream().anyMatch(item -> "testId1".equals(item.getId())));
assertThat(
draft.getTestCases().get(0).getGroupPopulations().get(0).getGroupId(),
is(equalTo("clonedGroupId1")));
assertThat(draft.getTestCases().get(0).getCaseNumber(), is(equalTo(2)));
assertThat(draft.getTestCases().get(1).getCaseNumber(), is(equalTo(1)));
}

@Test
public void testCreateDraftCopyCaseNumberFromSequenceGenerator() {
TestCaseGroupPopulation clonedTestCaseGroupPopulation =
TestCaseGroupPopulation.builder()
.groupId("clonedGroupId1")
.scoring("Cohort")
.populationBasis("boolean")
.build();
Measure versionedMeasure = buildBasicMeasure();
testCase.setCaseNumber(null);
testCase.setCreatedAt(null);
testCase2.setCaseNumber(0);
versionedMeasure.setTestCases(List.of(testCase, testCase2));

MeasureMetaData metaData = new MeasureMetaData();
metaData.setDraft(true);
Measure versionedCopy =
versionedMeasure.toBuilder()
.id("2")
.versionId("13-13-13-13")
.measureName("Test")
.measureMetaData(metaData)
.groups(List.of(cvGroup.toBuilder().id(ObjectId.get().toString()).build()))
.testCases(
List.of(
testCase.toBuilder()
.id(ObjectId.get().toString())
.groupPopulations(List.of(clonedTestCaseGroupPopulation))
.caseNumber(1)
.build(),
testCase2.toBuilder()
.id(ObjectId.get().toString())
.groupPopulations(List.of(clonedTestCaseGroupPopulation))
.caseNumber(2)
.build()))
.build();

when(measureRepository.findById(anyString())).thenReturn(Optional.of(versionedMeasure));
when(measureRepository.existsByMeasureSetIdAndActiveAndMeasureMetaDataDraft(
anyString(), anyBoolean(), anyBoolean()))
.thenReturn(false);
when(measureRepository.save(any(Measure.class))).thenReturn(versionedCopy);
when(actionLogService.logAction(anyString(), any(), any(), anyString())).thenReturn(true);
when(appConfigService.isFlagEnabled(MadieFeatureFlag.TEST_CASE_ID)).thenReturn(true);
when(sequenceService.generateSequence("1")).thenReturn(1);

Measure draft =
versionService.createDraft(versionedMeasure.getId(), "Test", "QI-Core v4.1.1", "test-user");

assertThat(draft.getMeasureName(), is(equalTo("Test")));
// draft flag to true
assertThat(draft.getMeasureMetaData().isDraft(), is(equalTo(true)));
// version remains same
assertThat(draft.getVersion().getMajor(), is(equalTo(2)));
assertThat(draft.getVersion().getMinor(), is(equalTo(3)));
assertThat(draft.getVersion().getRevisionNumber(), is(equalTo(1)));
assertThat(draft.getGroups().size(), is(equalTo(1)));
assertFalse(draft.getGroups().stream().anyMatch(item -> "xyz-p12r-12ert".equals(item.getId())));
assertThat(draft.getTestCases().size(), is(equalTo(2)));
assertFalse(draft.getGroups().stream().anyMatch(item -> "testId1".equals(item.getId())));
assertThat(
draft.getTestCases().get(0).getGroupPopulations().get(0).getGroupId(),
is(equalTo("clonedGroupId1")));
assertThat(draft.getTestCases().get(0).getCaseNumber(), is(equalTo(1)));
assertThat(draft.getTestCases().get(1).getCaseNumber(), is(equalTo(2)));
}
}

0 comments on commit c2a3bac

Please sign in to comment.