diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java index 73feac21f..ab1306bbd 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java @@ -724,10 +724,13 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } //TESTME - public ValueSetExpansionOutcome expandVS(ValueSet vs, boolean cacheOk, boolean heirarchical, boolean incompleteOk, Parameters p) { - if (p == null) { + public ValueSetExpansionOutcome expandVS(ValueSet vs, boolean cacheOk, boolean hierarchical, boolean incompleteOk, Parameters pIn) { + if (pIn == null) { throw new Error(formatMessage(I18nConstants.NO_PARAMETERS_PROVIDED_TO_EXPANDVS)); } + + Parameters p = pIn.copy(); + if (vs.hasExpansion()) { return new ValueSetExpansionOutcome(vs.copy()); } @@ -741,7 +744,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte codeSystemsUsed.add(inc.getSystem()); } - CacheToken cacheToken = txCache.generateExpandToken(vs, heirarchical); + CacheToken cacheToken = txCache.generateExpandToken(vs, hierarchical); ValueSetExpansionOutcome res; if (cacheOk) { res = txCache.getExpansion(cacheToken); @@ -750,7 +753,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte } } p.setParameter("includeDefinition", false); - p.setParameter("excludeNested", !heirarchical); + p.setParameter("excludeNested", !hierarchical); if (incompleteOk) { p.setParameter("incomplete-ok", true); } @@ -758,7 +761,7 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte List allErrors = new ArrayList<>(); // ok, first we try to expand locally - ValueSetExpanderSimple vse = new ValueSetExpanderSimple(this); + ValueSetExpanderSimple vse = constructValueSetExpanderSimple(); try { res = vse.expand(vs, p); allErrors.addAll(vse.getAllErrors()); @@ -1000,6 +1003,10 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte return res; } + protected ValueSetExpanderSimple constructValueSetExpanderSimple() { + return new ValueSetExpanderSimple(this); + } + protected ValueSetCheckerSimple constructValueSetCheckerSimple( ValidationOptions options, ValueSet vs, ValidationContextCarrier ctxt) { return new ValueSetCheckerSimple(options, vs, this, ctxt); } diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java index 72130aa55..188b32440 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/context/SimpleWorkerContextTests.java @@ -4,8 +4,10 @@ import org.hl7.fhir.r5.model.*; import org.hl7.fhir.r5.terminologies.TerminologyClient; import org.hl7.fhir.r5.terminologies.ValueSetCheckerSimple; import org.hl7.fhir.r5.terminologies.ValueSetExpander; +import org.hl7.fhir.r5.terminologies.ValueSetExpanderSimple; import org.hl7.fhir.r5.utils.validation.ValidationContextCarrier; import org.hl7.fhir.utilities.ToolingClientLogger; +import org.hl7.fhir.utilities.graphql.Value; import org.hl7.fhir.utilities.validation.ValidationOptions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,6 +28,7 @@ import static org.mockito.Mockito.times; @ExtendWith(MockitoExtension.class) public class SimpleWorkerContextTests { + private static final String DUMMY_URL = "dummyUrl"; @Spy SimpleWorkerContext context; @@ -45,11 +48,14 @@ public class SimpleWorkerContextTests { IWorkerContext.ValidationResult expectedValidationResult; @Mock - ValueSetExpander.ValueSetExpansionOutcome expectedExansionResult; + ValueSetExpander.ValueSetExpansionOutcome expectedExpansionResult; @Mock ValueSetCheckerSimple valueSetCheckerSimple; + @Mock + ValueSetExpanderSimple valueSetExpanderSimple; + @Mock Parameters pIn; @@ -79,6 +85,19 @@ public class SimpleWorkerContextTests { } } + public class ParametersMatcher implements ArgumentMatcher { + private Parameters left; + + ParametersMatcher(Parameters left) { + this.left = left; + } + + @Override + public boolean matches(Parameters right) { + return true; + } + } + @Test public void testValidateCodingWithCache() throws IOException { ValidationOptions validationOptions = new ValidationOptions().guessSystem().setVersionFlexible(false); @@ -211,11 +230,11 @@ public class SimpleWorkerContextTests { vs.getCompose().getInclude().add(inc); Mockito.doReturn(cacheToken).when(terminologyCache).generateExpandToken(argThat(new ValueSetMatcher(vs)),eq(true)); - Mockito.doReturn(expectedExansionResult).when(terminologyCache).getExpansion(cacheToken); + Mockito.doReturn(expectedExpansionResult).when(terminologyCache).getExpansion(cacheToken); ValueSetExpander.ValueSetExpansionOutcome actualExpansionResult = context.expandVS(inc, true); - assertEquals(expectedExansionResult, actualExpansionResult); + assertEquals(expectedExpansionResult, actualExpansionResult); Mockito.verify(terminologyCache).getExpansion(cacheToken); Mockito.verify(terminologyCache, times(0)).cacheExpansion(any(), any(), anyBoolean()); @@ -247,4 +266,53 @@ public class SimpleWorkerContextTests { Mockito.verify(terminologyCache).getExpansion(cacheToken); Mockito.verify(terminologyCache).cacheExpansion(cacheToken, actualExpansionResult,true); } + + @Test + public void testExpandValueSet4ArgsWithCache() throws IOException { + + ValueSet.ConceptSetComponent inc = new ValueSet.ConceptSetComponent(); + + ValueSet vs = new ValueSet(); + vs.setUrl(DUMMY_URL); + + Mockito.doReturn(cacheToken).when(terminologyCache).generateExpandToken(vs,true); + Mockito.doReturn(expectedExpansionResult).when(terminologyCache).getExpansion(cacheToken); + + Parameters pIn = new Parameters(); + + ValueSetExpander.ValueSetExpansionOutcome actualExpansionResult = context.expandVS(vs, true, true, true, pIn); + + assertEquals(expectedExpansionResult, actualExpansionResult); + + Mockito.verify(terminologyCache).getExpansion(cacheToken); + Mockito.verify(terminologyCache, times(0)).cacheExpansion(any(), any(), anyBoolean()); + Mockito.verify(terminologyClient, times(0)).expandValueset(any(), any(), any()); + } + + @Test + public void testExpandValueSet4ArgsWithValueSetExpanderSimple() throws IOException { + + ValueSet.ConceptSetComponent inc = new ValueSet.ConceptSetComponent(); + + ValueSet vs = new ValueSet(); + vs.setUrl(DUMMY_URL); + + Mockito.doReturn(cacheToken).when(terminologyCache).generateExpandToken(vs,true); + + Parameters pIn = new Parameters(); + + Mockito.doReturn(vs).when(expectedExpansionResult).getValueset(); + + Mockito.doReturn(expectedExpansionResult).when(valueSetExpanderSimple).expand(eq(vs), argThat(new ParametersMatcher(pIn))); + + Mockito.doReturn(valueSetExpanderSimple).when(context).constructValueSetExpanderSimple(); + + ValueSetExpander.ValueSetExpansionOutcome actualExpansionResult = context.expandVS(vs, true, true, true, pIn); + + assertEquals(expectedExpansionResult, actualExpansionResult); + + Mockito.verify(terminologyCache).getExpansion(cacheToken); + Mockito.verify(terminologyCache, times(0)).cacheExpansion(any(), any(), anyBoolean()); + Mockito.verify(terminologyClient, times(0)).expandValueset(any(), any(), any()); + } }