Skip to content

Commit cad969f

Browse files
committed
Adds tests for program to plan definition transformation.
1 parent 08c5732 commit cad969f

File tree

16 files changed

+624
-73
lines changed

16 files changed

+624
-73
lines changed

app/src/main/resources/default-application.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ dhis2.fhir-adapter:
356356
# DHIS 2 resource types that will be synchronized.
357357
resource-types:
358358
- ORGANIZATION_UNIT
359+
- PROGRAM_METADATA
359360
- TRACKED_ENTITY
360361
- PROGRAM_STAGE_EVENT
361362
# The queue that is used to store distributed requests to synchronize the data from

app/src/test/java/org/dhis2/fhir/adapter/fhir/server/r4/R4ProgramMetadataFhirRestAppTest.java

Lines changed: 29 additions & 62 deletions
Large diffs are not rendered by default.

app/src/test/resources/org/dhis2/fhir/adapter/dhis/test/default-program.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"pager": { "page": 1, "pageCount": 1, "total": 0, "pageSize": 1 },
23
"programs": [
34
{
45
"name": "Child Programme",
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package org.dhis2.fhir.adapter.fhir.transform.dhis.impl.metadata.r4;
2+
3+
/*
4+
* Copyright (c) 2004-2019, University of Oslo
5+
* All rights reserved.
6+
*
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
* Redistributions of source code must retain the above copyright notice, this
10+
* list of conditions and the following disclaimer.
11+
*
12+
* Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
* Neither the name of the HISP project nor the names of its contributors may
16+
* be used to endorse or promote products derived from this software without
17+
* specific prior written permission.
18+
*
19+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23+
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26+
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+
*/
30+
31+
import org.dhis2.fhir.adapter.dhis.tracker.program.ProgramMetadataService;
32+
import org.dhis2.fhir.adapter.fhir.metadata.model.ProgramMetadataRule;
33+
import org.dhis2.fhir.adapter.fhir.metadata.model.RuleInfo;
34+
import org.dhis2.fhir.adapter.fhir.model.FhirVersion;
35+
import org.dhis2.fhir.adapter.fhir.script.ScriptExecutor;
36+
import org.dhis2.fhir.adapter.fhir.transform.dhis.search.SearchFilter;
37+
import org.dhis2.fhir.adapter.fhir.transform.dhis.search.SearchFilterCollector;
38+
import org.junit.Assert;
39+
import org.junit.Rule;
40+
import org.junit.Test;
41+
import org.mockito.InjectMocks;
42+
import org.mockito.Mock;
43+
import org.mockito.junit.MockitoJUnit;
44+
import org.mockito.junit.MockitoRule;
45+
import org.springframework.web.util.DefaultUriBuilderFactory;
46+
import org.springframework.web.util.UriBuilder;
47+
48+
import java.net.URI;
49+
import java.net.URISyntaxException;
50+
import java.util.ArrayList;
51+
import java.util.Collections;
52+
import java.util.List;
53+
54+
/**
55+
* Unit tests for {@link R4ProgramMetadataToFhirDataProvider}.
56+
*
57+
* @author volsch
58+
*/
59+
public class R4ProgramMetadataToFhirDataProviderTest
60+
{
61+
@Mock
62+
private ScriptExecutor scriptExecutor;
63+
64+
@Mock
65+
private ProgramMetadataService programMetadataService;
66+
67+
@InjectMocks
68+
private R4ProgramMetadataToFhirDataProvider provider;
69+
70+
@Rule
71+
public MockitoRule rule = MockitoJUnit.rule();
72+
73+
@Test
74+
public void getFhirVersions()
75+
{
76+
Assert.assertEquals( FhirVersion.R4_ONLY, provider.getFhirVersions() );
77+
}
78+
79+
@Test
80+
public void searchFilterName() throws URISyntaxException
81+
{
82+
final SearchFilterCollector searchFilterCollector = new SearchFilterCollector( Collections.singletonMap( "name", Collections.singletonList( "Child Programme" ) ) );
83+
final SearchFilter searchFilter = new SearchFilter( searchFilterCollector, false );
84+
85+
provider.initSearchFilter( FhirVersion.R4, new RuleInfo<>( new ProgramMetadataRule(), Collections.emptyList() ), searchFilter );
86+
87+
final List<String> variables = new ArrayList<>();
88+
UriBuilder uriBuilder = new DefaultUriBuilderFactory().builder();
89+
uriBuilder = searchFilterCollector.add( uriBuilder, variables );
90+
91+
Assert.assertEquals( new URI( "?filter=%5Bname:$ilike:Child%20Programme%5D" ), uriBuilder.build( variables ) );
92+
}
93+
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package org.dhis2.fhir.adapter.fhir.transform.dhis.impl.metadata.r4;
2+
3+
/*
4+
* Copyright (c) 2004-2019, University of Oslo
5+
* All rights reserved.
6+
*
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
* Redistributions of source code must retain the above copyright notice, this
10+
* list of conditions and the following disclaimer.
11+
*
12+
* Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
* Neither the name of the HISP project nor the names of its contributors may
16+
* be used to endorse or promote products derived from this software without
17+
* specific prior written permission.
18+
*
19+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23+
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26+
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+
*/
30+
31+
import org.dhis2.fhir.adapter.dhis.model.Reference;
32+
import org.dhis2.fhir.adapter.dhis.model.ReferenceType;
33+
import org.dhis2.fhir.adapter.dhis.orgunit.OrganizationUnitService;
34+
import org.dhis2.fhir.adapter.dhis.tracker.program.WritableProgram;
35+
import org.dhis2.fhir.adapter.dhis.tracker.program.WritableProgramStage;
36+
import org.dhis2.fhir.adapter.dhis.tracker.trackedentity.TrackedEntityMetadataService;
37+
import org.dhis2.fhir.adapter.dhis.tracker.trackedentity.WritableTrackedEntityType;
38+
import org.dhis2.fhir.adapter.fhir.data.repository.FhirDhisAssignmentRepository;
39+
import org.dhis2.fhir.adapter.fhir.metadata.model.FhirClient;
40+
import org.dhis2.fhir.adapter.fhir.metadata.model.ProgramMetadataRule;
41+
import org.dhis2.fhir.adapter.fhir.metadata.model.RuleInfo;
42+
import org.dhis2.fhir.adapter.fhir.metadata.repository.SystemRepository;
43+
import org.dhis2.fhir.adapter.fhir.metadata.repository.TrackedEntityRuleRepository;
44+
import org.dhis2.fhir.adapter.fhir.model.FhirVersion;
45+
import org.dhis2.fhir.adapter.fhir.repository.FhirResourceRepository;
46+
import org.dhis2.fhir.adapter.fhir.script.ScriptExecutionContext;
47+
import org.dhis2.fhir.adapter.fhir.script.ScriptExecutor;
48+
import org.dhis2.fhir.adapter.fhir.transform.dhis.DhisToFhirTransformerContext;
49+
import org.dhis2.fhir.adapter.fhir.transform.scripted.WritableScriptedDhisMetadata;
50+
import org.dhis2.fhir.adapter.lock.LockManager;
51+
import org.hl7.fhir.r4.model.PlanDefinition;
52+
import org.junit.Assert;
53+
import org.junit.Rule;
54+
import org.junit.Test;
55+
import org.mockito.InjectMocks;
56+
import org.mockito.Mock;
57+
import org.mockito.Mockito;
58+
import org.mockito.junit.MockitoJUnit;
59+
import org.mockito.junit.MockitoRule;
60+
61+
import java.util.ArrayList;
62+
import java.util.Arrays;
63+
import java.util.Collections;
64+
import java.util.HashMap;
65+
import java.util.HashSet;
66+
import java.util.Optional;
67+
68+
/**
69+
* Unit tests for {@link R4ProgramMetadataToFhirPlanDefinitionTransformer}.
70+
*
71+
* @author volsch
72+
*/
73+
public class R4ProgramMetadataToFhirPlanDefinitionTransformerTest
74+
{
75+
@Mock
76+
private ScriptExecutor scriptExecutor;
77+
78+
@Mock
79+
private LockManager lockManager;
80+
81+
@Mock
82+
private SystemRepository systemRepository;
83+
84+
@Mock
85+
private FhirResourceRepository fhirResourceRepository;
86+
87+
@Mock
88+
private FhirDhisAssignmentRepository fhirDhisAssignmentRepository;
89+
90+
@Mock
91+
private OrganizationUnitService organizationUnitService;
92+
93+
@Mock
94+
private TrackedEntityMetadataService trackedEntityMetadataService;
95+
96+
@Mock
97+
private TrackedEntityRuleRepository trackedEntityRuleRepository;
98+
99+
@Mock
100+
private DhisToFhirTransformerContext context;
101+
102+
@Mock
103+
private FhirClient fhirClient;
104+
105+
@Mock
106+
private ScriptExecutionContext scriptExecutionContext;
107+
108+
@InjectMocks
109+
private R4ProgramMetadataToFhirPlanDefinitionTransformer transformer;
110+
111+
@Rule
112+
public MockitoRule rule = MockitoJUnit.rule();
113+
114+
@Test
115+
public void getFhirVersions()
116+
{
117+
Assert.assertEquals( FhirVersion.R4_ONLY, transformer.getFhirVersions() );
118+
}
119+
120+
@Test
121+
public void transformInternal()
122+
{
123+
Mockito.doReturn( Optional.of( new WritableTrackedEntityType( "a1234567890", "Test", Collections.emptyList() ) ) )
124+
.when( trackedEntityMetadataService ).findTypeByReference( Mockito.eq( new Reference( "a1234567890", ReferenceType.ID ) ) );
125+
Mockito.doReturn( Collections.singletonList( new RuleInfo<>( new ProgramMetadataRule(), Collections.emptyList() ) ) )
126+
.when( trackedEntityRuleRepository ).findByTypeRefs( Mockito.eq( new HashSet<>(
127+
Arrays.asList( new Reference( "a1234567890", ReferenceType.ID ), new Reference( "Test", ReferenceType.NAME ) ) ) ) );
128+
129+
final WritableProgram program = new WritableProgram();
130+
program.setName( "Test Program" );
131+
program.setDescription( "Test Description" );
132+
program.setWithoutRegistration( false );
133+
program.setTrackedEntityTypeId( "a1234567890" );
134+
program.setStages( new ArrayList<>() );
135+
136+
WritableProgramStage programStage = new WritableProgramStage();
137+
programStage.setId( "b1234567890" );
138+
programStage.setName( "Test Stage 1" );
139+
programStage.setDescription( "Test Description 1" );
140+
programStage.setRepeatable( false );
141+
program.getStages().add( programStage );
142+
143+
programStage = new WritableProgramStage();
144+
programStage.setId( "b1234567891" );
145+
programStage.setName( "Test Stage 2" );
146+
programStage.setDescription( "Test Description 2" );
147+
programStage.setRepeatable( true );
148+
program.getStages().add( programStage );
149+
150+
final PlanDefinition fhirPlanDefinition = new PlanDefinition();
151+
152+
transformer.transformInternal( fhirClient, context, new RuleInfo<>( new ProgramMetadataRule(), Collections.emptyList() ), new HashMap<>(),
153+
new WritableScriptedDhisMetadata( program, scriptExecutionContext ), fhirPlanDefinition );
154+
155+
Assert.assertEquals( "Test Program", fhirPlanDefinition.getName() );
156+
Assert.assertEquals( "Test Description", fhirPlanDefinition.getDescription() );
157+
Assert.assertEquals( 2, fhirPlanDefinition.getAction().size() );
158+
159+
Assert.assertEquals( "b1234567890", fhirPlanDefinition.getAction().get( 0 ).getId() );
160+
Assert.assertEquals( "Test Stage 1", fhirPlanDefinition.getAction().get( 0 ).getTitle() );
161+
Assert.assertEquals( "Test Description 1", fhirPlanDefinition.getAction().get( 0 ).getDescription() );
162+
Assert.assertEquals( PlanDefinition.ActionCardinalityBehavior.SINGLE, fhirPlanDefinition.getAction().get( 0 ).getCardinalityBehavior() );
163+
Assert.assertEquals( "Questionnaire/b1234567890", fhirPlanDefinition.getAction().get( 0 ).getDefinition().primitiveValue() );
164+
165+
Assert.assertEquals( "b1234567891", fhirPlanDefinition.getAction().get( 1 ).getId() );
166+
Assert.assertEquals( "Test Stage 2", fhirPlanDefinition.getAction().get( 1 ).getTitle() );
167+
Assert.assertEquals( "Test Description 2", fhirPlanDefinition.getAction().get( 1 ).getDescription() );
168+
Assert.assertEquals( PlanDefinition.ActionCardinalityBehavior.MULTIPLE, fhirPlanDefinition.getAction().get( 1 ).getCardinalityBehavior() );
169+
Assert.assertEquals( "Questionnaire/b1234567891", fhirPlanDefinition.getAction().get( 1 ).getDefinition().primitiveValue() );
170+
}
171+
}

fhir/src/main/java/org/dhis2/fhir/adapter/fhir/transform/dhis/impl/AbstractDhisToFhirDataProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ public DhisResource findByDhisFhirIdentifierCasted( @Nonnull FhirClient fhirClie
110110
public PreparedDhisToFhirSearch prepareSearchCasted( @Nonnull FhirVersion fhirVersion, @Nonnull List<RuleInfo<? extends AbstractRule>> ruleInfos, @Nullable Map<String, List<String>> filter, @Nullable DateRangeParam lastUpdatedDateRange, int count ) throws DhisToFhirDataProviderException
111111
{
112112
final Class<R> ruleClass = getRuleClass();
113-
final List<RuleInfo<R>> castedRuleInfos =
114-
ruleInfos.stream().map( r -> new RuleInfo<>( getRuleClass().cast( r.getRule() ), r.getDhisDataReferences() ) ).collect( Collectors.toList() );
113+
final List<RuleInfo<R>> castedRuleInfos = ruleInfos.stream().map( r -> new RuleInfo<>( getRuleClass().cast( r.getRule() ), r.getDhisDataReferences() ) ).collect( Collectors.toList() );
114+
115115
return prepareSearch( fhirVersion, castedRuleInfos, filter, lastUpdatedDateRange, count );
116116
}
117117
}

fhir/src/main/java/org/dhis2/fhir/adapter/fhir/transform/dhis/impl/AbstractDhisToFhirRequestResolver.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,13 @@ public AbstractDhisToFhirRequestResolver( @Nonnull FhirClientRepository fhirClie
5858
@Nonnull
5959
public Optional<FhirClient> resolveFhirClient( @Nonnull ScriptedDhisResource scriptedDhisResource )
6060
{
61-
Optional<FhirClient> fhirClient = fhirClientRepository.findExpEnabledOnly();
61+
final Optional<FhirClient> fhirClient = fhirClientRepository.findExpEnabledOnly();
62+
6263
if ( fhirClient.isPresent() && fhirClient.get().isEnabled() && fhirClient.get().isExpEnabled() )
6364
{
6465
return fhirClient;
6566
}
67+
6668
return Optional.empty();
6769
}
6870
}

0 commit comments

Comments
 (0)