diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..f06b1c79 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +# This workflow will build a Java project with Maven +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven + +name: Java CI with Maven + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + run-unit-tests: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Run Unit tests with Maven + run: mvn -B clean test jacoco:report --file pom.xml + - name: Upload coveralls report + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_TOKEN }} + run: | + mvn -B coveralls:report --file pom.xml -DrepoToken="$COVERALLS_REPO_TOKEN" diff --git a/src/main/java/org/smartregister/converters/TaskConverter.java b/src/main/java/org/smartregister/converters/TaskConverter.java index 185b61f6..889968c8 100644 --- a/src/main/java/org/smartregister/converters/TaskConverter.java +++ b/src/main/java/org/smartregister/converters/TaskConverter.java @@ -21,6 +21,7 @@ import com.ibm.fhir.model.type.String; import com.ibm.fhir.model.type.Uri; import com.ibm.fhir.model.type.code.TaskIntent; +import com.ibm.fhir.model.type.code.TaskPriority; import com.ibm.fhir.model.type.code.TaskStatus; public class TaskConverter { @@ -39,8 +40,10 @@ public static Task convertTasktoFihrResource(org.smartregister.domain.Task domai if (StringUtils.isNotBlank(domainTask.getLocation())) { builder.location(Reference.builder().reference(String.of(domainTask.getLocation())).build()); } - // TaskPriority priority = TaskPriority.builder().id("priority").value(java.lang.String.valueOf(domainTask.getPriority())).build(); - //TODO : Need to set priority as its an enum in FIHR + + if (domainTask.getPriority() != null) { + builder.priority(TaskPriority.builder().value(StringUtils.toRootLowerCase(domainTask.getPriority().name())).build()); + } Reference focus = Reference.builder().reference(String.builder().value(domainTask.getFocus()).build()).build(); diff --git a/src/main/java/org/smartregister/domain/Task.java b/src/main/java/org/smartregister/domain/Task.java index dfe2e43b..8c7dfd1d 100644 --- a/src/main/java/org/smartregister/domain/Task.java +++ b/src/main/java/org/smartregister/domain/Task.java @@ -42,6 +42,35 @@ public static TaskStatus get(String algorithm) { return lookup.get(algorithm); } } + + + public enum TaskPriority { + + @SerializedName("routine") + ROUTINE, + @SerializedName("urgent") + URGENT, + @SerializedName("asap") + ASAP, + @SerializedName("stat") + STAT; + + public static TaskPriority get(String algorithm) { + switch (algorithm) { + case "routine": + return ROUTINE; + case "urgent": + return URGENT; + case "asap": + return ASAP; + case "stat": + return STAT; + default: + throw new IllegalArgumentException("Not a valid Task priority"); + } + + } + } public static final String[] INACTIVE_TASK_STATUS = new String[]{TaskStatus.CANCELLED.name(), TaskStatus.ARCHIVED.name()}; @@ -55,7 +84,7 @@ public static TaskStatus get(String algorithm) { private String businessStatus; - private int priority; + private TaskPriority priority; private String code; @@ -133,11 +162,11 @@ public void setBusinessStatus(String businessStatus) { this.businessStatus = businessStatus; } - public int getPriority() { + public TaskPriority getPriority() { return priority; } - public void setPriority(int priority) { + public void setPriority(TaskPriority priority) { this.priority = priority; } diff --git a/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java b/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java index 209f2471..abd86215 100644 --- a/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java +++ b/src/main/java/org/smartregister/pathevaluator/task/TaskHelper.java @@ -24,9 +24,9 @@ * @author Samuel Githengi created on 06/15/20 */ public class TaskHelper { - + private PathEvaluatorLibrary pathEvaluatorLibrary = PathEvaluatorLibrary.getInstance(); - + private static Logger logger = Logger.getLogger(TaskHelper.class.getSimpleName()); /** @@ -40,7 +40,7 @@ public class TaskHelper { public void generateTask(DomainResource resource, Action action, String planIdentifier, String jurisdiction, String username, QuestionnaireResponse questionnaireResponse) { TaskDao taskDao = PathEvaluatorLibrary.getInstance().getTaskProvider().getTaskDao(); - if (taskDao.checkIfTaskExists(resource.getId(),jurisdiction, planIdentifier,action.getCode())) { + if (taskDao.checkIfTaskExists(resource.getId(), jurisdiction, planIdentifier, action.getCode())) { logger.info("Task already exists"); } else { Task task = new Task(); @@ -48,7 +48,7 @@ public void generateTask(DomainResource resource, Action action, String planIden task.setPlanIdentifier(planIdentifier); task.setGroupIdentifier(jurisdiction); task.setStatus(Task.TaskStatus.READY); - task.setPriority(3); + task.setPriority(Task.TaskPriority.ROUTINE); task.setCode(action.getCode()); task.setDescription(action.getDescription()); task.setFocus(action.getIdentifier()); @@ -60,7 +60,7 @@ public void generateTask(DomainResource resource, Action action, String planIden if (action.getDynamicValue() != null) { for (DynamicValue dynamicValue : action.getDynamicValue()) { if (dynamicValue != null && dynamicValue.getExpression() != null - && dynamicValue.getExpression().getName().equals("defaultBusinessStatus")) { + && dynamicValue.getExpression().getName().equals("defaultBusinessStatus")) { task.setBusinessStatus(dynamicValue.getExpression().getExpression()); } } @@ -74,7 +74,7 @@ public void generateTask(DomainResource resource, Action action, String planIden logger.info("Created task " + task.toString()); } } - + public void updateTask(DomainResource resource, Action action) { TaskDao taskDao = PathEvaluatorLibrary.getInstance().getTaskProvider().getTaskDao(); Task task = taskDao.getTaskByIdentifier(resource.getId()); @@ -83,9 +83,14 @@ public void updateTask(DomainResource resource, Action action) { Field aField = task.getClass().getDeclaredField(dynamicValue.getPath()); aField.setAccessible(true); if (aField.getType().isAssignableFrom(Task.TaskStatus.class)) { - aField.set(task, Task.TaskStatus.get(pathEvaluatorLibrary.evaluateStringExpression(resource,dynamicValue.getExpression().getExpression()).string())); + aField.set(task, Task.TaskStatus.get(pathEvaluatorLibrary + .evaluateStringExpression(resource, dynamicValue.getExpression().getExpression()).string())); + } else if (aField.getType().isAssignableFrom(Task.TaskPriority.class)) { + aField.set(task, Task.TaskPriority.get(pathEvaluatorLibrary + .evaluateStringExpression(resource, dynamicValue.getExpression().getExpression()).string())); } else if (aField.getType().isAssignableFrom(String.class)) { - aField.set(task, pathEvaluatorLibrary.evaluateStringExpression(resource,dynamicValue.getExpression().getExpression()).string()); + aField.set(task, pathEvaluatorLibrary + .evaluateStringExpression(resource, dynamicValue.getExpression().getExpression()).string()); } else { throw new IllegalArgumentException(); } @@ -94,7 +99,7 @@ public void updateTask(DomainResource resource, Action action) { catch (Exception e) { logger.log(Level.SEVERE, "Exception occurred while updating properties using Reflection" + e); } - + taskDao.updateTask(task); } diff --git a/src/test/java/org/smartregister/converters/TaskConverterTest.java b/src/test/java/org/smartregister/converters/TaskConverterTest.java index da9ccf79..504c90c2 100644 --- a/src/test/java/org/smartregister/converters/TaskConverterTest.java +++ b/src/test/java/org/smartregister/converters/TaskConverterTest.java @@ -13,7 +13,7 @@ public class TaskConverterTest { - private String taskJson = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":3,\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":\"2019-11-10T2100\",\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T0700\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0,\"reasonReference\":\"reasonrefuuid\",\"location\":\"catchment1\",\"requester\":\"chw1\"}"; + private String taskJson = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":\"routine\",\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":\"2019-11-10T2100\",\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T0700\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0,\"reasonReference\":\"reasonrefuuid\",\"location\":\"catchment1\",\"requester\":\"chw1\"}"; private static Gson gson = new GsonBuilder().registerTypeAdapter(DateTime.class, new TaskDateTimeTypeConverter()) .serializeNulls().create(); diff --git a/src/test/java/org/smartregister/domain/TaskTest.java b/src/test/java/org/smartregister/domain/TaskTest.java index d2478b85..eb50fe4f 100644 --- a/src/test/java/org/smartregister/domain/TaskTest.java +++ b/src/test/java/org/smartregister/domain/TaskTest.java @@ -7,6 +7,7 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Test; +import org.smartregister.domain.Task.TaskPriority; import org.smartregister.domain.Task.TaskStatus; import org.smartregister.utils.TaskDateTimeTypeConverter; @@ -20,9 +21,9 @@ public class TaskTest { protected static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HHmm"); - private String taskJson = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":3,\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":null,\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T0700\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0,\"reasonReference\":\"reasonrefuuid\",\"location\":\"catchment1\",\"requester\":\"chw1\",\"syncStatus\":null,\"structureId\":null,\"rowid\":null}"; + private String taskJson = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":\"asap\",\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":null,\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T0700\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0,\"reasonReference\":\"reasonrefuuid\",\"location\":\"catchment1\",\"requester\":\"chw1\",\"syncStatus\":null,\"structureId\":null,\"rowid\":null}"; - private String task2Json = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":3,\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":null,\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T07:00:00\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0}"; + private String task2Json = "{\"identifier\":\"tsk11231jh22\",\"planIdentifier\":\"IRS_2018_S1\",\"groupIdentifier\":\"2018_IRS-3734{\",\"status\":\"Ready\",\"businessStatus\":\"Not Visited\",\"priority\":\"routine\",\"code\":\"IRS\",\"description\":\"Spray House\",\"focus\":\"IRS Visit\",\"for\":\"location.properties.uid:41587456-b7c8-4c4e-b433-23a786f742fc\",\"executionStartDate\":\"2018-11-10T2200\",\"executionEndDate\":null,\"authoredOn\":\"2018-10-31T0700\",\"lastModified\":\"2018-10-31T07:00:00\",\"owner\":\"demouser\",\"note\":[{\"authorString\":\"demouser\",\"time\":\"2018-01-01T0800\",\"text\":\"This should be assigned to patrick.\"}],\"serverVersion\":0}"; @Test public void testDeserialize() { @@ -31,7 +32,7 @@ public void testDeserialize() { assertEquals("2018_IRS-3734{", task.getGroupIdentifier()); assertEquals(TaskStatus.READY, task.getStatus()); assertEquals("Not Visited", task.getBusinessStatus()); - assertEquals(3, task.getPriority()); + assertEquals(TaskPriority.ASAP, task.getPriority()); assertEquals("IRS", task.getCode()); assertEquals("Spray House", task.getDescription()); assertEquals("IRS Visit", task.getFocus());