Skip to content

Commit 26ae048

Browse files
authored
Merge pull request #92 from OpenSRP/enable-replacing-vaccine-enum-configuration
Enable replacing vaccine enum configuration
2 parents 99dbec5 + 2faf90e commit 26ae048

File tree

11 files changed

+245
-16
lines changed

11 files changed

+245
-16
lines changed

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* [Pre-requisites](#pre-requisites)
1313
* [Installation Devices](#installation-devices)
1414
* [How to install](#how-to-install)
15+
* [Gotcha's when using the library](#gotchas-when-using-the-library)
16+
* Vaccine schedule not changing after changing the vaccines.json file
1517

1618
# Introduction
1719

@@ -188,4 +190,13 @@ This can be done via the setting below in your implementation's _app.properties_
188190

189191
```
190192
vaccine.relaxation.days=2
191-
```
193+
```
194+
195+
## Gotcha's when using the library
196+
197+
1. Vaccine schedule not changing after changing the `vaccines.json` file!
198+
199+
Some of the vaccine configurations are not dependent on change done to the `vaccines.json`, in this case you should check the current configuration [here](https://github.com/OpenSRP/opensrp-client-immunization/blob/67a15611b53c55e111a0b7bff4f32a02c27b2920/opensrp-immunization/src/main/java/org/smartregister/immunization/db/VaccineRepo.java#L37)
200+
and come-up with the correct configuration. Next step is to add the custom configuration to library. You should loop through the configurations array from `VaccineRepo.Vaccine[] ImmunizationLibrary.getInstance().getVaccines()` and add
201+
modify the properties of the vaccine enum to whatever you need. You should then use `ImmunizationLibrary.getInstance().setVaccines(VaccineRepo.Vaccine[])`
202+
to re-set all the vaccine configs using the configurations array you retrieved.

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION_NAME=1.4.21-SNAPSHOT
1+
VERSION_NAME=1.4.22-SNAPSHOT
22
VERSION_CODE=2
33
GROUP=org.smartregister
44
POM_SETTING_DESCRIPTION=OpenSRP Client Immunization
@@ -10,4 +10,4 @@ POM_SETTING_LICENCE_NAME=The Apache Software License, Version 2.0
1010
POM_SETTING_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
1111
POM_SETTING_LICENCE_DIST=repo
1212
POM_SETTING_DEVELOPER_ID=opensrp
13-
POM_SETTING_DEVELOPER_NAME=OpenSRP Onadev
13+
POM_SETTING_DEVELOPER_NAME=OpenSRP Onadev

opensrp-immunization/src/main/java/org/smartregister/immunization/ImmunizationLibrary.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
package org.smartregister.immunization;
22

3+
import android.support.annotation.NonNull;
4+
35
import org.smartregister.Context;
46
import org.smartregister.commonregistry.CommonFtsObject;
7+
import org.smartregister.immunization.db.VaccineRepo;
8+
import org.smartregister.immunization.domain.jsonmapping.Vaccine;
9+
import org.smartregister.immunization.domain.jsonmapping.VaccineGroup;
510
import org.smartregister.immunization.repository.RecurringServiceRecordRepository;
611
import org.smartregister.immunization.repository.RecurringServiceTypeRepository;
712
import org.smartregister.immunization.repository.VaccineNameRepository;
813
import org.smartregister.immunization.repository.VaccineRepository;
914
import org.smartregister.immunization.repository.VaccineTypeRepository;
15+
import org.smartregister.immunization.util.VaccinatorUtils;
1016
import org.smartregister.repository.EventClientRepository;
1117
import org.smartregister.repository.Repository;
1218
import org.smartregister.util.AssetHandler;
1319

1420
import java.lang.reflect.Type;
21+
import java.util.ArrayList;
1522
import java.util.HashMap;
23+
import java.util.List;
1624
import java.util.Locale;
1725
import java.util.Map;
1826
import java.util.Properties;
@@ -36,6 +44,10 @@ public class ImmunizationLibrary {
3644
private int databaseVersion;
3745
private Map<String, Object> jsonMap = new HashMap<>();
3846

47+
private VaccineRepo.Vaccine[] vaccines = VaccineRepo.Vaccine.values();
48+
49+
private HashMap<String, String> vaccineGrouping = new HashMap<>();
50+
3951
private ImmunizationLibrary(Context context, Repository repository, CommonFtsObject commonFtsObject,
4052
int applicationVersion, int databaseVersion) {
4153
this.repository = repository;
@@ -138,4 +150,34 @@ public Map<String, Object> getVaccinesConfigJsonMap() {
138150
public Properties getProperties() {
139151
return ImmunizationLibrary.getInstance().context().getAppProperties();
140152
}
153+
154+
public void setVaccines(VaccineRepo.Vaccine[] vaccines) {
155+
this.vaccines = vaccines;
156+
}
157+
158+
public VaccineRepo.Vaccine[] getVaccines() {
159+
return vaccines;
160+
}
161+
162+
@NonNull
163+
public HashMap<String, String> getVaccineGroupings(@NonNull android.content.Context context) {
164+
if (vaccineGrouping.isEmpty()) {
165+
List<VaccineGroup> vaccinesJsonMapping = VaccinatorUtils.getSupportedVaccines(context);
166+
167+
if (vaccinesJsonMapping != null && vaccinesJsonMapping.size() > 0) {
168+
for (VaccineGroup vaccineGroup: vaccinesJsonMapping) {
169+
String groupName = vaccineGroup.name;
170+
171+
for (Vaccine vaccine: vaccineGroup.vaccines) {
172+
String shortVaccineName = vaccine.getName()
173+
.trim()
174+
.replace(" ", "");
175+
vaccineGrouping.put(shortVaccineName, groupName);
176+
}
177+
}
178+
}
179+
}
180+
181+
return vaccineGrouping;
182+
}
141183
}

opensrp-immunization/src/main/java/org/smartregister/immunization/db/VaccineRepo.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package org.smartregister.immunization.db;
22

3+
import org.smartregister.immunization.ImmunizationLibrary;
4+
35
import java.util.ArrayList;
46

57
public class VaccineRepo {
8+
69
public static ArrayList<Vaccine> getVaccines(String category) {
10+
return getVaccines(category, false);
11+
}
12+
13+
public static ArrayList<Vaccine> getVaccines(String category, boolean useDefault) {
714
ArrayList<Vaccine> vl = new ArrayList<>();
8-
for (Vaccine v : Vaccine.values()) {
15+
Vaccine[] vaccines = useDefault ? Vaccine.values() : ImmunizationLibrary.getInstance().getVaccines();
16+
for (Vaccine v : vaccines) {
917
if (v.category().equalsIgnoreCase(category.trim())) {
1018
vl.add(v);
1119
}
@@ -14,7 +22,8 @@ public static ArrayList<Vaccine> getVaccines(String category) {
1422
}
1523

1624
public static Vaccine getVaccine(String name, String category) {
17-
for (Vaccine curVaccine : Vaccine.values()) {
25+
Vaccine[] vaccines = ImmunizationLibrary.getInstance().getVaccines();
26+
for (Vaccine curVaccine : vaccines) {
1827
if (curVaccine.display.equalsIgnoreCase(name)
1928
&& curVaccine.category.equalsIgnoreCase(category)) {
2029
return curVaccine;
@@ -128,5 +137,28 @@ public String category() {
128137
return category;
129138
}
130139

140+
public void setDisplay(String display) {
141+
this.display = display;
142+
}
143+
144+
public void setPrerequisite(Vaccine prerequisite) {
145+
this.prerequisite = prerequisite;
146+
}
147+
148+
public void setExpiryDays(int expiryDays) {
149+
this.expiryDays = expiryDays;
150+
}
151+
152+
public void setMilestoneGapDays(int milestoneGapDays) {
153+
this.milestoneGapDays = milestoneGapDays;
154+
}
155+
156+
public void setPrerequisiteGapDays(int prerequisiteGapDays) {
157+
this.prerequisiteGapDays = prerequisiteGapDays;
158+
}
159+
160+
public void setCategory(String category) {
161+
this.category = category;
162+
}
131163
}
132164
}

opensrp-immunization/src/test/java/org/smartregister/immunization/BaseUnitTest.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package org.smartregister.immunization;
22

33
import android.os.Build;
4+
import android.support.annotation.NonNull;
45

56
import org.junit.runner.RunWith;
7+
import org.powermock.api.mockito.PowerMockito;
68
import org.powermock.core.classloader.annotations.PowerMockIgnore;
79
import org.powermock.modules.junit4.PowerMockRunner;
810
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
911
import org.robolectric.RobolectricTestRunner;
1012
import org.robolectric.annotation.Config;
13+
import org.smartregister.Context;
1114
import org.smartregister.immunization.customshadows.FontTextViewShadow;
15+
import org.smartregister.immunization.repository.VaccineRepository;
16+
import org.smartregister.service.AlertService;
1217

1318
/**
1419
* Created by onaio on 29/08/2017.
@@ -17,7 +22,9 @@
1722
@RunWith (PowerMockRunner.class)
1823
@PowerMockRunnerDelegate (RobolectricTestRunner.class)
1924
@Config (constants = BuildConfig.class, shadows = {FontTextViewShadow.class}, sdk = Build.VERSION_CODES.O_MR1)
20-
@PowerMockIgnore ({"org.mockito.*", "org.robolectric.*", "android.*"})
25+
@PowerMockIgnore ({"org.mockito.*", "org.robolectric.*", "android.*", "javax.xml.*", "org.xml.sax.*"
26+
, "org.w3c.dom.*", "org.springframework.context.*", "org.apache.log4j.*", "com.android.internal.policy.*"
27+
, "org.xmlpull.v1.*"})
2128
public abstract class BaseUnitTest {
2229
public final static String BASEENTITYID = "baseEntityId";
2330
public final static String LOCATIONID = "locationID";
@@ -29,4 +36,14 @@ public abstract class BaseUnitTest {
2936
public static final String ANMID = "anmId";
3037
public static final String FORMSUBMISSIONID = "formSubmissionId";
3138
public static final String VALUE = "value";
39+
40+
public void mockImmunizationLibrary(@NonNull ImmunizationLibrary immunizationLibrary, @NonNull Context context, @NonNull VaccineRepository vaccineRepository, @NonNull AlertService alertService) {
41+
PowerMockito.mockStatic(ImmunizationLibrary.class);
42+
PowerMockito.when(ImmunizationLibrary.getInstance()).thenReturn(immunizationLibrary);
43+
PowerMockito.when(ImmunizationLibrary.getInstance().context()).thenReturn(context);
44+
PowerMockito.when(ImmunizationLibrary.getInstance().vaccineRepository()).thenReturn(vaccineRepository);
45+
PowerMockito.when(ImmunizationLibrary.getInstance().vaccineRepository()
46+
.findByEntityId(org.mockito.ArgumentMatchers.anyString())).thenReturn(null);
47+
PowerMockito.when(ImmunizationLibrary.getInstance().context().alertService()).thenReturn(alertService);
48+
}
3249
}

opensrp-immunization/src/test/java/org/smartregister/immunization/domain/VaccineScheduleTest.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import org.junit.Rule;
99
import org.junit.Test;
1010
import org.mockito.Mock;
11+
import org.mockito.Mockito;
1112
import org.mockito.MockitoAnnotations;
12-
import org.powermock.api.mockito.PowerMockito;
1313
import org.powermock.core.classloader.annotations.PrepareForTest;
1414
import org.powermock.modules.junit4.rule.PowerMockRule;
1515
import org.smartregister.Context;
@@ -53,6 +53,8 @@ public class VaccineScheduleTest extends BaseUnitTest {
5353
@Before
5454
public void setUp() {
5555
MockitoAnnotations.initMocks(this);
56+
57+
Mockito.doReturn(VaccineRepo.Vaccine.values()).when(immunizationLibrary).getVaccines();
5658
}
5759

5860
@Test
@@ -66,19 +68,15 @@ public void assertUpdateOfflineAlertsTestReturnsAlert() {
6668
}.getType();
6769
List<org.smartregister.immunization.domain.jsonmapping.Vaccine> specialVaccines = JsonFormUtils.gson
6870
.fromJson(VaccineData.special_vacines, listType);
71+
mockImmunizationLibrary();
6972

7073
VaccineSchedule.init(vaccines, specialVaccines, magicChild);
7174

72-
PowerMockito.mockStatic(ImmunizationLibrary.class);
73-
PowerMockito.when(ImmunizationLibrary.getInstance()).thenReturn(immunizationLibrary);
74-
PowerMockito.when(ImmunizationLibrary.getInstance().context()).thenReturn(context);
75-
PowerMockito.when(ImmunizationLibrary.getInstance().vaccineRepository()).thenReturn(vaccineRepository);
76-
PowerMockito.when(ImmunizationLibrary.getInstance().vaccineRepository()
77-
.findByEntityId(org.mockito.ArgumentMatchers.anyString())).thenReturn(null);
78-
PowerMockito.when(ImmunizationLibrary.getInstance().context().alertService()).thenReturn(alertService);
79-
8075
Assert.assertNotNull(VaccineSchedule.updateOfflineAlerts(VaccineTest.BASEENTITYID, new DateTime(), magicChild));
76+
}
8177

78+
private void mockImmunizationLibrary() {
79+
mockImmunizationLibrary(immunizationLibrary, context, vaccineRepository, alertService);
8280
}
8381

8482
@Test
@@ -98,6 +96,7 @@ public void assertInitAndInitVaccineWithTestData() {
9896
List<org.smartregister.immunization.domain.jsonmapping.Vaccine> specialVaccines = JsonFormUtils.gson
9997
.fromJson(VaccineData.special_vacines, listType);
10098

99+
mockImmunizationLibrary();
101100

102101
VaccineSchedule.init(vaccines, specialVaccines, magicChild);
103102
VaccineSchedule.init(vaccines, specialVaccines, "");

opensrp-immunization/src/test/java/org/smartregister/immunization/fragment/VaccinationDialogFragmentTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,18 @@
99
import org.junit.Test;
1010
import org.mockito.InjectMocks;
1111
import org.mockito.Mock;
12+
import org.mockito.Mockito;
1213
import org.robolectric.Robolectric;
1314
import org.robolectric.RuntimeEnvironment;
1415
import org.robolectric.android.controller.ActivityController;
1516
import org.robolectric.annotation.Config;
17+
import org.robolectric.util.ReflectionHelpers;
1618
import org.smartregister.CoreLibrary;
1719
import org.smartregister.immunization.BaseUnitTest;
20+
import org.smartregister.immunization.ImmunizationLibrary;
1821
import org.smartregister.immunization.R;
1922
import org.smartregister.immunization.customshadows.FontTextViewShadow;
23+
import org.smartregister.immunization.db.VaccineRepo;
2024
import org.smartregister.immunization.domain.VaccineWrapper;
2125
import org.smartregister.immunization.fragment.mock.DrishtiApplicationShadow;
2226
import org.smartregister.immunization.fragment.mock.VaccinationDialogFragmentTestActivity;
@@ -44,6 +48,12 @@ public void setUp() {
4448
CoreLibrary.init(context_);
4549
org.mockito.MockitoAnnotations.initMocks(this);
4650

51+
ImmunizationLibrary immunizationLibrary = Mockito.mock(ImmunizationLibrary.class);
52+
ReflectionHelpers.setStaticField(ImmunizationLibrary.class, "instance", immunizationLibrary);
53+
54+
Mockito.doReturn(VaccineRepo.Vaccine.values()).when(immunizationLibrary).getVaccines();
55+
56+
4757
activity = Robolectric.buildActivity(VaccinationDialogFragmentTestActivity.class).create().start().get();
4858
activity.setContentView(R.layout.service_dialog_view);
4959
}

opensrp-immunization/src/test/java/org/smartregister/immunization/fragment/VaccinationEditDialogFragmentTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,24 @@
77
import org.junit.After;
88
import org.junit.Assert;
99
import org.junit.Before;
10+
import org.junit.Rule;
1011
import org.junit.Test;
1112
import org.mockito.InjectMocks;
1213
import org.mockito.Mock;
14+
import org.mockito.Mockito;
15+
import org.powermock.api.mockito.PowerMockito;
16+
import org.powermock.core.classloader.annotations.PrepareForTest;
17+
import org.powermock.modules.junit4.rule.PowerMockRule;
1318
import org.robolectric.Robolectric;
1419
import org.robolectric.android.controller.ActivityController;
1520
import org.robolectric.annotation.Config;
21+
import org.smartregister.Context;
1622
import org.smartregister.CoreLibrary;
1723
import org.smartregister.immunization.BaseUnitTest;
24+
import org.smartregister.immunization.ImmunizationLibrary;
1825
import org.smartregister.immunization.R;
1926
import org.smartregister.immunization.customshadows.FontTextViewShadow;
27+
import org.smartregister.immunization.db.VaccineRepo;
2028
import org.smartregister.immunization.domain.VaccineData;
2129
import org.smartregister.immunization.domain.VaccineSchedule;
2230
import org.smartregister.immunization.domain.VaccineWrapper;
@@ -35,6 +43,7 @@
3543
* Created by onaio on 30/08/2017.
3644
*/
3745
@Config (shadows = {FontTextViewShadow.class, DrishtiApplicationShadow.class})
46+
@PrepareForTest({ImmunizationLibrary.class})
3847
public class VaccinationEditDialogFragmentTest extends BaseUnitTest {
3948

4049
private ActivityController<VaccinationEditDialogFragmentTestActivity> controller;
@@ -45,11 +54,25 @@ public class VaccinationEditDialogFragmentTest extends BaseUnitTest {
4554
@Mock
4655
private org.smartregister.Context context_;
4756

57+
@Mock
58+
private ImmunizationLibrary immunizationLibrary;
59+
@Mock
60+
private Context context;
61+
62+
@Rule
63+
public PowerMockRule rule = new PowerMockRule();
64+
4865
@Before
4966
public void setUp() {
5067
CoreLibrary.init(context_);
5168
org.mockito.MockitoAnnotations.initMocks(this);
5269

70+
PowerMockito.mockStatic(ImmunizationLibrary.class);
71+
PowerMockito.when(ImmunizationLibrary.getInstance()).thenReturn(immunizationLibrary);
72+
PowerMockito.when(ImmunizationLibrary.getInstance().context()).thenReturn(context);
73+
74+
Mockito.doReturn(VaccineRepo.Vaccine.values()).when(immunizationLibrary).getVaccines();
75+
5376
activity = Robolectric.buildActivity(VaccinationEditDialogFragmentTestActivity.class).create().start().get();
5477
activity.setContentView(R.layout.service_dialog_view);
5578

@@ -84,6 +107,7 @@ private void destroyController() {
84107

85108
@Test
86109
public void assertThatCallToNewInstanceCreatesAFragment() {
110+
87111
Assert.assertNotNull(VaccinationEditDialogFragment
88112
.newInstance(null, new Date(), Collections.EMPTY_LIST, new ArrayList<VaccineWrapper>(), null));
89113
Assert.assertNotNull(VaccinationEditDialogFragment

0 commit comments

Comments
 (0)