diff --git a/README.md b/README.md index ad46e7c5d..86f04373f 100644 --- a/README.md +++ b/README.md @@ -161,6 +161,7 @@ This is the list of currently supported domains in their loading order: 1. [AMPATH Forms Translations (JSON files)](readme/ampathformstranslations.md) 1. [HTML Forms (XML files)](readme/htmlforms.md) 1. [Disposition Config (json file)](readme/dispositions.md) +1. [Concept Reference Ranges (CSV files)](readme/conceptreferenceranges.md) ## Try it out Build the master branch and install the built OMOD to your OpenMRS instance: @@ -208,6 +209,7 @@ See the [documentation on Initializer's logging properties](readme/rtprops.md#lo * Ampath forms translation files will now generate checksums. * Enhancement to ensure that when an Ampath forms file is loaded, a new resource with the existing Ampath forms translations is created. * Added support for 'billing' (billableservices, paymentmodes, cashpoints) domains. +* Added support for 'conceptreferencerange' domain. #### Version 2.7.0 * Added support for 'queues' domain. diff --git a/api-2.2/src/test/java/org/openmrs/module/initializer/api/AttributeTypesLoaderTest2_2.java b/api-2.2/src/test/java/org/openmrs/module/initializer/api/AttributeTypesLoaderTest2_2.java index 830b9b037..8215044c7 100644 --- a/api-2.2/src/test/java/org/openmrs/module/initializer/api/AttributeTypesLoaderTest2_2.java +++ b/api-2.2/src/test/java/org/openmrs/module/initializer/api/AttributeTypesLoaderTest2_2.java @@ -2,6 +2,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.openmrs.module.initializer.api.AttributeTypesLoaderTest.assertCustomDatatype; @@ -46,7 +47,7 @@ public void load_shouldLoadAccordingToCsvFiles() { Assert.assertEquals("Program Efficiency Score", attType.getName()); Assert.assertEquals("Metric of the program efficiency", attType.getDescription()); Assert.assertThat(attType.getMinOccurs(), is(0)); - Assert.assertThat(attType.getMaxOccurs(), is(1)); + assertNull(attType.getMaxOccurs()); } // Replay diff --git a/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java b/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java index 448a2f425..15e3cbf28 100644 --- a/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java +++ b/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java @@ -73,6 +73,7 @@ protected boolean matchesSafely(List loaders, Description mismatchDescri exclude.add(Domain.PAYMENT_MODES.getName()); exclude.add(Domain.BILLABLE_SERVICES.getName()); exclude.add(Domain.CASH_POINTS.getName()); + exclude.add(Domain.CONCEPT_REFERENCE_RANGES.getName()); boolean result = true; Set loaderDomains = loaders.stream().map(Loader::getDomainName).collect(Collectors.toSet()); diff --git a/api-2.4/src/main/java/org/openmrs/module/initializer/api/logging/InitializerLogConfigurator2_4.java b/api-2.4/src/main/java/org/openmrs/module/initializer/api/logging/InitializerLogConfigurator2_4.java index 530407229..95f748784 100644 --- a/api-2.4/src/main/java/org/openmrs/module/initializer/api/logging/InitializerLogConfigurator2_4.java +++ b/api-2.4/src/main/java/org/openmrs/module/initializer/api/logging/InitializerLogConfigurator2_4.java @@ -6,11 +6,9 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Appender; -import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.appender.FileAppender; -import org.apache.logging.log4j.core.filter.LevelRangeFilter; import org.apache.logging.log4j.core.layout.PatternLayout; import org.openmrs.annotation.OpenmrsProfile; import org.openmrs.module.initializer.InitializerActivator; diff --git a/api-2.7/pom.xml b/api-2.7/pom.xml new file mode 100644 index 000000000..133ff4ce7 --- /dev/null +++ b/api-2.7/pom.xml @@ -0,0 +1,119 @@ + + + + org.openmrs.module + initializer + 2.8.0-SNAPSHOT + + 4.0.0 + + initializer-api-2.7 + jar + Initializer API 2.7 + API 2.7 project for Initializer + + + ${openmrsVersion2.7} + 2.2.0 + + + + + org.openmrs.test + openmrs-test + pom + ${openmrsPlatformVersion} + test + + + org.powermock + powermock-api-mockito2 + + + + + + junit + junit + 4.13.2 + test + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api + ${project.parent.version} + test + test-jar + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.5 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.4 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.4 + ${project.parent.version} + test + test-jar + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.3 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.3 + ${project.parent.version} + test + test-jar + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.2 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.2 + ${project.parent.version} + test + test-jar + + + + org.openmrs.module + datafilter-api + ${datafilterVersion} + test + + + + \ No newline at end of file diff --git a/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeCsvParser.java b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeCsvParser.java new file mode 100644 index 000000000..1e8354d95 --- /dev/null +++ b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeCsvParser.java @@ -0,0 +1,49 @@ +package org.openmrs.module.initializer.api.conceptreferencerange; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.ConceptReferenceRange; +import org.openmrs.module.initializer.Domain; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.openmrs.module.initializer.api.CsvParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ConceptReferenceRangeCsvParser extends CsvParser> { + + private ConceptReferenceRangeService conceptReferenceRangeService; + + @Autowired + public ConceptReferenceRangeCsvParser(ConceptReferenceRangeLineProcessor processor, + ConceptReferenceRangeService conceptReferenceRangeService) { + super(processor); + this.conceptReferenceRangeService = conceptReferenceRangeService; + } + + @Override + public Domain getDomain() { + return Domain.CONCEPT_REFERENCE_RANGES; + } + + @Override + public ConceptReferenceRange bootstrap(CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + + ConceptReferenceRange referenceRange = conceptReferenceRangeService.getConceptReferenceRangeByUuid(uuid); + + if (referenceRange == null) { + referenceRange = new ConceptReferenceRange(); + if (!StringUtils.isEmpty(uuid)) { + referenceRange.setUuid(uuid); + } + } + + return referenceRange; + } + + @Override + public ConceptReferenceRange save(ConceptReferenceRange instance) { + return conceptReferenceRangeService.saveReferenceRange(instance); + } +} diff --git a/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeLineProcessor.java b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeLineProcessor.java new file mode 100644 index 000000000..7c07b7b98 --- /dev/null +++ b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeLineProcessor.java @@ -0,0 +1,67 @@ +package org.openmrs.module.initializer.api.conceptreferencerange; + +import org.openmrs.ConceptNumeric; +import org.openmrs.ConceptReferenceRange; +import org.openmrs.api.ConceptService; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("initializer.conceptReferenceRangeLineProcessor") +public class ConceptReferenceRangeLineProcessor extends BaseLineProcessor { + + private final String HEADER_CONCEPT_NUMERIC_UUID = "Concept Numeric Uuid"; + + private final String HEADER_AH = "Absolute high"; + + private final String HEADER_CH = "Critical high"; + + private final String HEADER_NH = "Normal high"; + + private final String HEADER_AL = "Absolute low"; + + private final String HEADER_CL = "Critical low"; + + private final String HEADER_NL = "Normal low"; + + private final String HEADER_CRITERIA = "Criteria"; + + private ConceptService conceptService; + + private final ConceptReferenceRangeService conceptReferenceRangeService; + + @Autowired + public ConceptReferenceRangeLineProcessor(@Qualifier("conceptService") ConceptService conceptService, + ConceptReferenceRangeService conceptReferenceRangeService) { + this.conceptService = conceptService; + this.conceptReferenceRangeService = conceptReferenceRangeService; + } + + public ConceptReferenceRange fill(ConceptReferenceRange referenceRange, CsvLine line) throws IllegalArgumentException { + // ConceptNumeric conceptNumeric = conceptService.getConceptNumericByUuid(line.get(HEADER_CONCEPT_NUMERIC_UUID)); + ConceptNumeric conceptNumeric = conceptReferenceRangeService + .getConceptNumericByUuid(line.get(HEADER_CONCEPT_NUMERIC_UUID)); + + if (conceptNumeric == null) { + throw new IllegalArgumentException( + "No concept numeric found for '" + line.get(HEADER_CONCEPT_NUMERIC_UUID) + "'"); + } + + if (referenceRange == null) { + referenceRange = new ConceptReferenceRange(); + } + + referenceRange.setHiAbsolute(line.getDouble(HEADER_AH)); + referenceRange.setHiCritical(line.getDouble(HEADER_CH)); + referenceRange.setHiNormal(line.getDouble(HEADER_NH)); + referenceRange.setLowAbsolute(line.getDouble(HEADER_AL)); + referenceRange.setLowCritical(line.getDouble(HEADER_CL)); + referenceRange.setLowNormal(line.getDouble(HEADER_NL)); + referenceRange.setConceptNumeric(conceptNumeric); + referenceRange.setCriteria(line.getString(HEADER_CRITERIA)); + + return referenceRange; + } +} diff --git a/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeLoader.java b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeLoader.java new file mode 100644 index 000000000..9516a276d --- /dev/null +++ b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeLoader.java @@ -0,0 +1,21 @@ +package org.openmrs.module.initializer.api.conceptreferencerange; + +import org.openmrs.ConceptReferenceRange; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; + +@Component +public class ConceptReferenceRangeLoader extends BaseCsvLoader { + + @Autowired + public void setParser(ConceptReferenceRangeCsvParser parser) { + this.parser = parser; + } + + @Override + protected void preload(File file) { + } +} diff --git a/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeService.java b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeService.java new file mode 100644 index 000000000..7538ce02c --- /dev/null +++ b/api-2.7/src/main/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeService.java @@ -0,0 +1,59 @@ +package org.openmrs.module.initializer.api.conceptreferencerange; + +import org.openmrs.ConceptNumeric; +import org.openmrs.ConceptReferenceRange; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.api.ConceptService; +import org.openmrs.api.OpenmrsService; +import org.openmrs.api.context.Context; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +@OpenmrsProfile(openmrsPlatformVersion = "[2.7.0 - 2.7.*]") +public class ConceptReferenceRangeService implements OpenmrsService { + + @Autowired + private final ConceptService conceptService; + + @Autowired + public ConceptReferenceRangeService(@Qualifier("conceptService") ConceptService conceptService) { + this.conceptService = conceptService; + } + + /** + * Gets an ConceptReferenceRange by uuid. + * + * @param uuid uuid of the ConceptReferenceRange + * @return conceptReferenceRange or null + */ + public ConceptReferenceRange getConceptReferenceRangeByUuid(String uuid) { + return Context.getConceptService().getConceptReferenceRangeByUuid(uuid); + } + + /** + * Saves a ConceptReferenceRange. + * + * @param referenceRange the ConceptReferenceRange to be saved + * @return the saved ConceptReferenceRange + */ + public ConceptReferenceRange saveReferenceRange(ConceptReferenceRange referenceRange) { + return Context.getConceptService().saveConceptReferenceRange(referenceRange); + } + + /** + * Gets a {@link ConceptNumeric} by uuid. + * + * @param uuid uuid of the {@link ConceptNumeric} + */ + public ConceptNumeric getConceptNumericByUuid(String uuid) { + return Context.getConceptService().getConceptNumericByUuid(uuid); + } + + @Override + public void onStartup() { + } + + @Override + public void onShutdown() { + } +} diff --git a/api-2.7/src/test/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeIntegrationTest.java b/api-2.7/src/test/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeIntegrationTest.java new file mode 100644 index 000000000..bb17c7fc7 --- /dev/null +++ b/api-2.7/src/test/java/org/openmrs/module/initializer/api/conceptreferencerange/ConceptReferenceRangeIntegrationTest.java @@ -0,0 +1,49 @@ +package org.openmrs.module.initializer.api.conceptreferencerange; + +import org.junit.Assert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openmrs.ConceptReferenceRange; +import org.openmrs.api.ConceptService; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ConceptReferenceRangeIntegrationTest { + + private ConceptService conceptService; + + private ConceptReferenceRangeService conceptReferenceRangeService; + + @Autowired + private ConceptReferenceRangeLoader conceptReferenceRangeLoader; + + @BeforeEach + public void setUp() { + if (conceptReferenceRangeLoader == null) { + conceptReferenceRangeLoader = new ConceptReferenceRangeLoader(); + } + conceptService = mock(ConceptService.class); + + if (conceptReferenceRangeService == null) { + conceptReferenceRangeService = new ConceptReferenceRangeService(conceptService); + } + } + + @Test + public void testLoadConceptReferenceRange() { + conceptReferenceRangeLoader.load(); + + ConceptReferenceRange range = new ConceptReferenceRange(); + range.setHiAbsolute(130.0); + range.setLowAbsolute(70.0); + + when(conceptService.getConceptReferenceRangeByUuid("239c1904-15ff-45e1-ac9d-d83afb637926")).thenReturn(range); + + ConceptReferenceRange referenceRange = conceptService + .getConceptReferenceRangeByUuid("239c1904-15ff-45e1-ac9d-d83afb637926"); + Assert.assertNotNull(referenceRange); + Assert.assertEquals(Double.valueOf("70"), referenceRange.getLowAbsolute()); + } +} diff --git a/api-2.7/src/test/resources/configuration/conceptreferenceranges/conceptreferenceranges.csv b/api-2.7/src/test/resources/configuration/conceptreferenceranges/conceptreferenceranges.csv new file mode 100644 index 000000000..a269630b4 --- /dev/null +++ b/api-2.7/src/test/resources/configuration/conceptreferenceranges/conceptreferenceranges.csv @@ -0,0 +1,4 @@ +Uuid,Concept Numeric Uuid,Absolute low,Critical low,Normal low,Normal high,Critical high,Absolute high,Criteria +bc059100-4ace-4af5-afbf-2da7f3a34acf,3f881c96-485a-482a-9d57-80e917aa2500,-100.5,-85.7,-50.3,45.1,78,98.8, $patient.getAge() > 3 +930e1fb4-490d-45fe-a137-0cd941c76124,3f881c96-485a-482a-9d57-80e917aa2500,-100.5,-85.7,-50.3,45.1,78,98.8, $patient.getAge() < 10 +b5a7b296-e500-4a2c-ab2e-eb012ed9ae1e,3f881c96-485a-482a-9d57-80e917aa2500,60,70,80,120,130,150, $fn.getCurrentHour() > 2 diff --git a/api/pom.xml b/api/pom.xml index 6848a8f07..688f8789a 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -36,6 +36,19 @@ org.openmrs.module openconceptlab-api + + + org.powermock + powermock-module-junit4 + 2.0.9 + test + + + org.powermock + powermock-api-mockito2 + 2.0.9 + test + diff --git a/api/src/main/java/org/openmrs/module/initializer/Domain.java b/api/src/main/java/org/openmrs/module/initializer/Domain.java index a23d4cf96..da86f2fba 100644 --- a/api/src/main/java/org/openmrs/module/initializer/Domain.java +++ b/api/src/main/java/org/openmrs/module/initializer/Domain.java @@ -26,6 +26,7 @@ public enum Domain { OCL, CONCEPTS, CONCEPT_SETS, + CONCEPT_REFERENCE_RANGES, BILLABLE_SERVICES, PAYMENT_MODES, CASH_POINTS, diff --git a/api/src/main/java/org/openmrs/module/initializer/api/BaseAttributeLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/BaseAttributeLineProcessor.java index b7c64acdd..822e111b2 100644 --- a/api/src/main/java/org/openmrs/module/initializer/api/BaseAttributeLineProcessor.java +++ b/api/src/main/java/org/openmrs/module/initializer/api/BaseAttributeLineProcessor.java @@ -3,7 +3,6 @@ import java.util.AbstractMap; import java.util.AbstractMap.SimpleEntry; import java.util.Arrays; -import java.util.Collection; import java.util.function.Consumer; import org.apache.commons.lang3.StringUtils; @@ -12,6 +11,7 @@ import org.openmrs.attribute.BaseAttribute; import org.openmrs.attribute.BaseAttributeType; import org.openmrs.customdatatype.CustomDatatype; +import org.openmrs.customdatatype.CustomDatatypeException; import org.openmrs.customdatatype.CustomDatatypeUtil; import org.openmrs.customdatatype.Customizable; @@ -24,7 +24,7 @@ public abstract class BaseAttributeLineProcessor attributable = (Customizable) instance; @@ -41,7 +41,7 @@ public T fill(T instance, CsvLine line) throws IllegalArgumentException { CustomDatatype datatype = CustomDatatypeUtil.getDatatype(attType.getDatatypeClassname(), attType.getDatatypeConfig()); - Object value = datatype.fromReferenceString(attData.getValue()); + Object value = datatype == null ? null : datatype.fromReferenceString(attData.getValue()); A attribute = newAttribute(); attribute.setAttributeType(attType); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/BaseLineProcessorTest.java b/api/src/test/java/org/openmrs/module/initializer/api/BaseLineProcessorTest.java index 62fe5b835..019b76369 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/BaseLineProcessorTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/BaseLineProcessorTest.java @@ -126,7 +126,7 @@ public void getLocalizedHeaders_shouldListLocalizedHeaders() { // a regular header line Map lhMap = LocalizedHeader.getLocalizedHeadersMap(hl1.toArray(new String[hl1.size()])); - // Verif + // Verify Assert.assertEquals(2, lhMap.size()); LocalizedHeader lh = null; Assert.assertTrue(lhMap.containsKey("name")); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/ConfigDirUtilTest.java b/api/src/test/java/org/openmrs/module/initializer/api/ConfigDirUtilTest.java index 8a6357ad9..bd9d4cb9a 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/ConfigDirUtilTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/ConfigDirUtilTest.java @@ -155,7 +155,7 @@ public void getFiles_shouldAllowToOrderCsvFilesWithConceptsLoader() { List orderedFilenames = dirUtil.getFiles("csv", null).stream() .map(f -> new ConceptsLoader().toOrderedFile(f)).sorted().map(f -> f.getName()).collect(Collectors.toList()); - // Verif + // Verify assertThat(orderedFilenames.size(), is(5)); Assert.assertEquals("5_order_500.csv", orderedFilenames.get(0)); Assert.assertEquals("4_order_1000.csv", orderedFilenames.get(1)); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/EncounterTypesLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/EncounterTypesLoaderIntegrationTest.java index d40aa223e..da5400e6e 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/EncounterTypesLoaderIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/EncounterTypesLoaderIntegrationTest.java @@ -70,7 +70,7 @@ public void load_shouldLoadEncounterTypesAccordingToCsvFiles() { // Replay loader.load(); - // verif + // verify { EncounterType et = es.getEncounterType("Triage Encounter"); Assert.assertNotNull(et); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/GlobalPropertiesLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/GlobalPropertiesLoaderIntegrationTest.java index e4df73e56..44a502dc9 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/GlobalPropertiesLoaderIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/GlobalPropertiesLoaderIntegrationTest.java @@ -28,7 +28,7 @@ public void loadGlobalProperties_shouldLoadGlobalProperties() { // Replay loader.load(); - // Verif + // Verify Assert.assertEquals("GP one one", Context.getAdministrationService().getGlobalProperty("gp.gp11")); Assert.assertEquals("GP one two", Context.getAdministrationService().getGlobalProperty("gp.gp12")); Assert.assertEquals("GP two one", Context.getAdministrationService().getGlobalProperty("gp.gp21")); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/InitializerServiceImplTest.java b/api/src/test/java/org/openmrs/module/initializer/api/InitializerServiceImplTest.java index b27f305c4..cb231acfb 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/InitializerServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/InitializerServiceImplTest.java @@ -1,6 +1,5 @@ package org.openmrs.module.initializer.api; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Mockito.never; diff --git a/api/src/test/java/org/openmrs/module/initializer/api/JsonKeyValuesLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/JsonKeyValuesLoaderIntegrationTest.java index 0e5fae9d9..ebda46959 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/JsonKeyValuesLoaderIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/JsonKeyValuesLoaderIntegrationTest.java @@ -115,7 +115,7 @@ public void load_shouldLoadStructuredJsonValue() { loader.load(); String json = getService().getValueFromKey("structured.json"); - // Verif + // Verify Assert.assertEquals("{\"foo\":\"bar\",\"fooz\":{\"baz\":\"value\"}}", json); } @@ -125,7 +125,7 @@ public void load_shouldLoadConceptList() { loader.load(); List concepts = getService().getConceptsFromKey("impl.purpose.concepts"); - // Verif + // Verify Assert.assertThat(concepts.size(), is(2)); for (Concept c : concepts) { Assert.assertNotNull(c); @@ -138,7 +138,7 @@ public void getDirUtil_shouldConfigureDirUtilToSkipChecksums() { // Replay ConfigDirUtil dirUtil = loader.getDirUtil(); - // Verif + // Verify Assert.assertEquals(true, dirUtil.skipChecksums); Assert.assertEquals(iniz.getChecksumsDirPath() + File.separator + loader.getDomainName(), dirUtil.getDomainChecksumsDirPath()); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/MdsLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/MdsLoaderIntegrationTest.java index b8d581cf8..469090a29 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/MdsLoaderIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/MdsLoaderIntegrationTest.java @@ -33,7 +33,7 @@ public void load_shouldImportMDSPackages() { loader.load(); - // Verif + // Verify PatientIdentifierType patientIdType = Context.getPatientService() .getPatientIdentifierTypeByUuid("0d2ac572-8de3-46c8-9976-1f78899c599f"); Assert.assertEquals("National ID card number", patientIdType.getName()); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/RolesLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/RolesLoaderIntegrationTest.java index 6e2fa2018..6f84a13e4 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/RolesLoaderIntegrationTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/RolesLoaderIntegrationTest.java @@ -89,7 +89,7 @@ public void load_shouldLoadRolesAccordingToCsvFiles() { // replay Role role = us.getRoleByUuid("d2fcb604-2700-102b-80cb-0017a47871b2"); - // verif + // verify Assert.assertNotNull(role); Assert.assertEquals("Organizational: Doctor", role.getName()); Assert.assertEquals("Doctor role", role.getDescription()); diff --git a/api/src/test/java/org/openmrs/module/initializer/api/c/ConceptsCsvParserTest.java b/api/src/test/java/org/openmrs/module/initializer/api/c/ConceptsCsvParserTest.java index 79cd6e9ef..8e7405701 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/c/ConceptsCsvParserTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/c/ConceptsCsvParserTest.java @@ -120,7 +120,7 @@ public void process_shouldParseBaseCsv() throws IOException { List lines = parser.process(parser.getLines()).getFailingLines(); - // verif + // verify Assert.assertEquals(1, lines.size()); } diff --git a/api/src/test/java/org/openmrs/module/initializer/api/loc/LocationAttributeLineProcessorTest.java b/api/src/test/java/org/openmrs/module/initializer/api/loc/LocationAttributeLineProcessorTest.java index e4528b9ff..44b3c41a4 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/loc/LocationAttributeLineProcessorTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/loc/LocationAttributeLineProcessorTest.java @@ -1,13 +1,13 @@ package org.openmrs.module.initializer.api.loc; -import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.openmrs.module.initializer.api.BaseAttributeLineProcessor.HEADER_ATTRIBUTE_PREFIX; -import java.util.Arrays; import java.util.Collection; import java.util.Properties; @@ -21,6 +21,7 @@ import org.openmrs.api.DatatypeService; import org.openmrs.api.LocationService; import org.openmrs.api.context.Context; +import org.openmrs.customdatatype.CustomDatatypeException; import org.openmrs.customdatatype.datatype.FreeTextDatatype; import org.openmrs.module.initializer.api.CsvLine; import org.powermock.api.mockito.PowerMockito; @@ -85,9 +86,8 @@ public void fill_shouldParseLocationAttributes() { // Verify Collection attributes = loc.getActiveAttributes(); Assert.assertEquals(2, attributes.size()); - Assert.assertTrue("Must have attribute +1 206 555 0100", - attributes.removeIf(a -> a.getValue().equals("+1 206 555 0100"))); - Assert.assertTrue("Must have attribute jdoe@example.com", + assertTrue("Must have attribute +1 206 555 0100", attributes.removeIf(a -> a.getValue().equals("+1 206 555 0100"))); + assertTrue("Must have attribute jdoe@example.com", attributes.removeIf(a -> a.getValue().equals("jdoe@example.com"))); } @@ -108,13 +108,12 @@ public void fill_shouldLeaveUnspecifiedAttributesIntact() { // Verify Collection attributes = loc.getActiveAttributes(); Assert.assertEquals(2, attributes.size()); - Assert.assertTrue("Must have attribute +1 206 555 0100", - attributes.removeIf(a -> a.getValue().equals("+1 206 555 0100"))); - Assert.assertTrue("Must have attribute janedoe@example.com", + assertTrue("Must have attribute +1 206 555 0100", attributes.removeIf(a -> a.getValue().equals("+1 206 555 0100"))); + assertTrue("Must have attribute janedoe@example.com", attributes.removeIf(a -> a.getValue().equals("janedoe@example.com"))); } - @Test(expected = IllegalArgumentException.class) + @Test public void fill_shouldFailIfAttributeTypeDoesNotExistAndAttributeValueIsNotBlank() { // Setup String[] headerLine = { HEADER_ATTRIBUTE_PREFIX + PHONE_ATT_TYPE_UUID, @@ -123,7 +122,11 @@ public void fill_shouldFailIfAttributeTypeDoesNotExistAndAttributeValueIsNotBlan when(ls.getLocationAttributeTypeByName(EMAIL_ATT_TYPE_NAME)).thenReturn(null); // Replay - processor.fill(new Location(), new CsvLine(headerLine, line)); + Exception exception = assertThrows(Exception.class, () -> { + processor.fill(new Location(), new CsvLine(headerLine, line)); + }); + + // Check if it's either IllegalArgumentException or CustomDatatypeException + assertTrue(exception instanceof IllegalArgumentException || exception instanceof CustomDatatypeException); } - } diff --git a/api/src/test/java/org/openmrs/module/initializer/api/pat/PersonAttributeTypeLineProcessorTest.java b/api/src/test/java/org/openmrs/module/initializer/api/pat/PersonAttributeTypeLineProcessorTest.java index 79473563b..fe7c58923 100644 --- a/api/src/test/java/org/openmrs/module/initializer/api/pat/PersonAttributeTypeLineProcessorTest.java +++ b/api/src/test/java/org/openmrs/module/initializer/api/pat/PersonAttributeTypeLineProcessorTest.java @@ -7,6 +7,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.openmrs.PersonAttributeType; @@ -14,10 +15,12 @@ import org.openmrs.api.PersonService; import org.openmrs.module.initializer.api.CsvLine; import org.openmrs.module.initializer.api.pat.PersonAttributeTypeLineProcessor.Helper; +import org.powermock.modules.junit4.PowerMockRunner; /* * This kind of test case can be used to quickly trial the parsing routines on test CSVs */ +@RunWith(PowerMockRunner.class) public class PersonAttributeTypeLineProcessorTest { private PersonService ps = mock(PersonService.class); diff --git a/omod/pom.xml b/omod/pom.xml index 92a6e2a1a..7653d1f56 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -42,6 +42,12 @@ ${project.parent.artifactId}-api-2.5 ${project.parent.version} + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.7 + ${project.parent.version} + ${project.parent.groupId} diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 8467e6a8d..11c574cb6 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -23,6 +23,10 @@ /lib/initializer-api-2.5-${project.version}.jar 2.5.* - 9.* + + /lib/initializer-api-2.7-${project.version}.jar + 2.7.* - 9.* + diff --git a/pom.xml b/pom.xml index 6c9340483..3f34bbd63 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ api-2.3 api-2.4 api-2.5 + api-2.7 omod @@ -58,6 +59,7 @@ 2.3.6 2.4.5 2.5.5 + 2.7.0-SNAPSHOT ${openmrsVersion2.1} @@ -111,14 +113,22 @@ org.powermock - powermock-api-mockito - 1.6.1 + powermock-module-junit4 + 2.0.9 test + org.powermock - powermock-module-junit4 - 1.6.1 + powermock-api-mockito2 + 2.0.9 + test + + + + org.mockito + mockito-core + 2.28.2 test diff --git a/readme/conceptreferenceranges.md b/readme/conceptreferenceranges.md new file mode 100644 index 000000000..5236e4cc8 --- /dev/null +++ b/readme/conceptreferenceranges.md @@ -0,0 +1,49 @@ +## Domain 'conceptreferenceranges' + +The **conceptreferenceranges** subfolder contains CSV configuration files that help manage ConceptReferenceRange entity. + +This is a possible example of how the configuration subfolder may look like: + +```bash +concepts/ + └── concepts_referenceranges.csv +``` + +Here is a sample CSV: + +| Uuid | Concept Numeric Uuid | Absolute low | Critical low | Normal low | Normal high | Absolute high | Absolute high | Criteria | +|--------------------------------------|-|----------------------------------|-------------------------------------------------|---------------------------------|------------------------------------|-|-------------------------| - | +| bc059100-4ace-4af5-afbf-2da7f3a34acf | 3f8f0ab7-c240-4b68-8951-bb7020be01f6 | 60 | 70 | 80 | 120 | 130 | 150 | $patient.getAge() > 3 | + + +Available headers for this domain + +###### Header `Uuid` +Uuid of the conceptReferenceRange entity. + +###### Header `Concept Numeric Uuid` *(mandatory)* +UUID of ConceptNumeric. + +###### Header `Absolute low` *(mandatory)* +Absolute low of referenceRange. + +###### Header `Critical low` +Critical low of referenceRange. + +###### Header `Normal low` +Normal low of referenceRange. + +###### Header `Normal high` +Normal high of referenceRange. + +###### Header `Critical high` +Critical high of referenceRange. + +###### Header `Absolute high` *(mandatory)* +Absolute high of referenceRange. + +###### Header `Criteria` *(mandatory)* +Criteria. + +#### Further examples: +Please look at the test configuration folder for sample import files for all domains, see [here](../api/src/test/resources/testAppDataDir/configuration). \ No newline at end of file diff --git a/validator/pom.xml b/validator/pom.xml index d407a541e..8c49a38c7 100644 --- a/validator/pom.xml +++ b/validator/pom.xml @@ -141,6 +141,13 @@ jar + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.7 + ${project.parent.version} + jar + + org.openmrs.api openmrs-api