Skip to content

Commit ffe8b1e

Browse files
committed
Unit tests for MapItems class
1 parent 7a383c0 commit ffe8b1e

9 files changed

Lines changed: 324 additions & 9 deletions

File tree

claimManagement/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ android {
184184
testOptions {
185185
unitTests {
186186
includeAndroidResources = true
187+
returnDefaultValues = true
187188
}
188189
}
189190
}

claimManagement/fakedatabase

12 KB
Binary file not shown.

claimManagement/fakemapping

12 KB
Binary file not shown.

claimManagement/src/main/java/org/openimis/imisclaims/Global.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ public class Global extends Application {
7777
private Token JWTToken;
7878
private String[] permissions;
7979

80+
public static boolean isRunningTest() {
81+
try {
82+
Class.forName("org.robolectric.RobolectricTestRunner");
83+
return true;
84+
} catch (ClassNotFoundException e) {
85+
return false;
86+
}
87+
}
88+
8089
@Override
8190
public void onCreate() {
8291
super.onCreate();
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package org.openimis.imisclaims;
2+
3+
import android.content.ContentValues;
4+
import android.database.Cursor;
5+
6+
import androidx.annotation.NonNull;
7+
import androidx.annotation.Nullable;
8+
9+
import org.json.JSONArray;
10+
import org.json.JSONObject;
11+
12+
import java.util.Locale;
13+
14+
public interface ISQLHandler {
15+
16+
// --- Mapping & References ---
17+
@Nullable Cursor getMapping(String type);
18+
boolean InsertMapping(String code, String name, String type);
19+
void InsertReferences(String code, String name, String type, String price);
20+
void ClearMapping(String type);
21+
void ClearReferencesSI();
22+
String getPrice(String code, String type);
23+
String getItemPrice(String code);
24+
String getServicePrice(String code);
25+
String getReferenceName(@NonNull String referenceCode);
26+
27+
// --- Controls ---
28+
void InsertControls(String fieldName, String adjustability);
29+
String getAdjustability(String fieldName);
30+
31+
// --- Claim admins ---
32+
void InsertClaimAdmins(String code, String hfCode, String name);
33+
String getClaimAdminInfo(String code, String column);
34+
35+
// --- Tables ---
36+
void createTables();
37+
void createMappingTables();
38+
boolean checkTableExists(String table);
39+
boolean checkIfAny(String table);
40+
boolean checkIfExists(String table, String whereClause, String... whereArgs);
41+
void ClearAll(String tableName);
42+
43+
// --- Claims ---
44+
void saveClaim(@NonNull ContentValues claimDetails,
45+
@NonNull Iterable<ContentValues> claimItems,
46+
@NonNull Iterable<ContentValues> claimServices);
47+
48+
void insertClaim(ContentValues claimDetails,
49+
Iterable<ContentValues> claimItems,
50+
Iterable<ContentValues> claimServices);
51+
52+
void updateClaim(ContentValues claimDetails,
53+
Iterable<ContentValues> claimItems,
54+
Iterable<ContentValues> claimServices);
55+
56+
void deleteClaim(String claimUUID);
57+
58+
@Nullable JSONObject getClaim(String claimUUID);
59+
@NonNull JSONArray getAllPendingClaims();
60+
@NonNull JSONArray getClaimItems(String claimUUID);
61+
@NonNull JSONArray getClaimServices(String claimUUID);
62+
63+
void insertClaimUploadStatus(@NonNull String claimUUID,
64+
@NonNull String uploadDate,
65+
@NonNull String uploadStatus,
66+
String uploadMessage);
67+
68+
String getClaimUUIDForCode(@NonNull String claimCode);
69+
@NonNull JSONObject getClaimCounts();
70+
71+
// --- Query helpers ---
72+
@NonNull JSONArray getQueryResultAsJsonArray(@NonNull String rawQuery, String[] selectionArgs);
73+
@NonNull JSONArray getQueryResultAsJsonArray(@NonNull String tableName,
74+
String[] columns,
75+
String selection,
76+
String[] selectionArgs);
77+
78+
// --- Claim infos ---
79+
@NonNull JSONArray getClaimInfo(String selection, String[] selectionArgs);
80+
@NonNull JSONArray getEnteredClaimInfo();
81+
@NonNull JSONArray getAcceptedClaimInfo();
82+
@NonNull JSONArray getRejectedClaimInfo();
83+
84+
// --- Services & Items ---
85+
String getServiceName(String code);
86+
String getPackageType(String code);
87+
String getServiceId(String code);
88+
String getManualPrice(String code);
89+
90+
void InsertService(String id, String code, String name, String type,
91+
String price, String packageType, int manualPrice);
92+
93+
void InsertItem(String id, String code, String name, String type, String price);
94+
void InsertSubServices(String serviceId, String serviceLinked, String qty, String price);
95+
void InsertSubItems(String itemId, String serviceId, String qty, String price);
96+
97+
JSONArray getSubServicesIds(String id);
98+
JSONArray getSubItemsId(String id);
99+
JSONObject getService(String serviceId);
100+
JSONObject getItem(String itemId);
101+
102+
// --- Search ---
103+
Cursor SearchDisease(String inputText);
104+
Cursor searchItems(String filter);
105+
Cursor searchServices(String filter);
106+
Cursor SearchHF(String inputText);
107+
108+
// --- Health facilities ---
109+
void InsertHealthFacilities(String id, String code, String name);
110+
111+
// --- Lifecycle ---
112+
void closeDatabases();
113+
}

claimManagement/src/main/java/org/openimis/imisclaims/MapItems.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public class MapItems extends ImisActivity {
3939
ListView lvMapItems;
4040
CheckBox chkAll, chk;
4141
EditText etSearchItems;
42-
4342
ArrayList<HashMap<String, Object>> ItemsList = new ArrayList<HashMap<String, Object>>();
4443

4544
HashMap<String, Object> oItem;
@@ -118,12 +117,10 @@ public void BindItemList() {
118117
//String[] Items = {"Item1","Item2","Item3","Item4","Item5"};
119118

120119
//SQLHandler sql = new SQLHandler(null, null, null, 3);
121-
SQLHandler sql = new SQLHandler(this);
122120

123-
Cursor c = sql.getMapping("I");
121+
Cursor c = sqlHandler.getMapping("I");
124122
boolean isMapped = false;
125123

126-
127124
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
128125
HashMap<String, Object> item = new HashMap<String, Object>();
129126
item.put("Code", c.getString(0));
@@ -154,7 +151,7 @@ public void BindItemList() {
154151
}
155152
}
156153

157-
private void CheckUncheckAll(boolean isChecked) {
154+
protected void CheckUncheckAll(boolean isChecked) {
158155
for (int i = 0; i < ItemsList.size(); i++) {
159156
oItem = (HashMap<String, Object>) ItemsList.get(i);
160157
oItem.put("isMapped", isChecked);
@@ -224,7 +221,7 @@ public void run() {
224221
}
225222
}
226223

227-
private int Save() {
224+
protected int Save() {
228225
int count = 0;
229226
sqlHandler.ClearMapping("I");
230227
for (int i = 0; i < ItemsList.size(); i++) {
@@ -258,7 +255,7 @@ public void onClick(DialogInterface dialog, int which) {
258255
}
259256

260257

261-
private class ItemAdapter extends SimpleAdapter {
258+
protected class ItemAdapter extends SimpleAdapter {
262259

263260
private ArrayList<HashMap<String, Object>> OriginalList, FilteredList;
264261
private ArrayList<HashMap<String, Object>> ItemList;

claimManagement/src/main/java/org/openimis/imisclaims/SQLHandler.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public class SQLHandler extends SQLiteOpenHelper {
3232
public static final String CLAIM_UPLOAD_STATUS_ENTERED = "Entered";
3333
public static final String CLAIM_UPLOAD_STATUS_ARCHIVED = "Archived";
3434

35-
public static final String DB_NAME_MAPPING = Global.getGlobal().getSubdirectory("Databases") + "/" + "Mapping.db3";
36-
public static final String DB_NAME_DATA = Global.getGlobal().getSubdirectory("Databases") + "/" + "ImisData.db3";
35+
public static final String DB_NAME_MAPPING = isRunningTest() ? "fakemapping" : Global.getGlobal().getSubdirectory("Databases") + "/" + "Mapping.db3";
36+
public static final String DB_NAME_DATA = isRunningTest() ? "fakedatabase" : Global.getGlobal().getSubdirectory("Databases") + "/" + "ImisData.db3";
3737

3838
private static final String CreateTableMapping = "CREATE TABLE IF NOT EXISTS tblMapping(Code TEXT,Name TEXT,Type TEXT);";
3939
private static final String createTablePolicyInquiry = "CREATE TABLE IF NOT EXISTS tblPolicyInquiry(InsureeNumber text,Photo BLOB, InsureeName Text, DOB Text, Gender Text, ProductCode Text, ProductName Text, ExpiryDate Text, Status Text, DedType Int, Ded1 Int, Ded2 Int, Ceiling1 Int, Ceiling2 Int);";
@@ -79,6 +79,15 @@ public void onCreate(SQLiteDatabase db) {
7979
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
8080
}
8181

82+
public static boolean isRunningTest() {
83+
try {
84+
Class.forName("org.robolectric.RobolectricTestRunner");
85+
return true;
86+
} catch (ClassNotFoundException e) {
87+
return false;
88+
}
89+
}
90+
8291
@Nullable
8392
public Cursor getMapping(String Type) {
8493
try {
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
package org.openimis.imisclaims;
2+
3+
import static org.junit.Assert.*;
4+
import static org.mockito.Mockito.*;
5+
6+
import android.app.AlertDialog;
7+
import android.app.Application;
8+
import androidx.test.core.app.ApplicationProvider;
9+
import android.database.Cursor;
10+
import android.database.MatrixCursor;
11+
12+
import org.junit.Before;
13+
import org.junit.Test;
14+
import org.junit.runner.RunWith;
15+
import org.robolectric.Robolectric;
16+
import org.robolectric.RobolectricTestRunner;
17+
import org.robolectric.annotation.Config;
18+
19+
import java.util.HashMap;
20+
21+
@RunWith(RobolectricTestRunner.class)
22+
@Config(sdk = {28}, application = Global.class)
23+
public class MapItemsTest {
24+
25+
SQLHandler mockSqlHandler;
26+
Cursor mockCursor;
27+
MapItems activity;
28+
29+
@Before
30+
public void setup() {
31+
// Création des mocks avec la syntaxe moderne
32+
mockSqlHandler = mock(SQLHandler.class);
33+
mockCursor = mock(Cursor.class);
34+
35+
activity = Robolectric.buildActivity(MapItems.class).create().get();
36+
activity.sqlHandler = mockSqlHandler;
37+
}
38+
39+
@Test
40+
public void bindItemList_loadsItemsCorrectly() {
41+
doReturn(mockCursor).when(activity.sqlHandler).getMapping("I");
42+
when(mockCursor.moveToFirst()).thenReturn(true);
43+
when(mockCursor.isAfterLast()).thenReturn(false, true);
44+
when(mockCursor.getString(0)).thenReturn("ITEM001");
45+
when(mockCursor.getString(1)).thenReturn("Paracetamol");
46+
when(mockCursor.getString(2)).thenReturn(null);
47+
48+
activity.BindItemList();
49+
50+
assertEquals(1, activity.ItemsList.size());
51+
HashMap<String, Object> item = activity.ItemsList.get(0);
52+
assertEquals("ITEM001", item.get("Code"));
53+
assertEquals("Paracetamol", item.get("Name"));
54+
assertFalse((Boolean) item.get("isMapped"));
55+
verify(mockCursor).close();
56+
}
57+
58+
@Test
59+
public void clickingItem_togglesIsMapped() {
60+
HashMap<String, Object> item = new HashMap<>();
61+
item.put("Code", "ITEM001");
62+
item.put("Name", "Test");
63+
item.put("isMapped", false);
64+
activity.ItemsList.add(item);
65+
66+
activity.alAdapter = activity.new ItemAdapter(activity, activity.ItemsList,
67+
R.layout.mappinglist,
68+
new String[]{"Code", "Name", "isMapped"},
69+
new int[]{R.id.tvMapCode,R.id.tvMapName,R.id.chkMap});
70+
71+
activity.lvMapItems.setAdapter(activity.alAdapter);
72+
73+
activity.lvMapItems.performItemClick(null, 0, 0);
74+
75+
assertTrue((Boolean) activity.ItemsList.get(0).get("isMapped"));
76+
}
77+
78+
@Test
79+
public void checkAll_setsAllItemsMapped() {
80+
for (int i = 0; i < 3; i++) {
81+
HashMap<String, Object> item = new HashMap<>();
82+
item.put("Code", "ITEM00" + i);
83+
item.put("Name", "Item " + i);
84+
item.put("isMapped", false);
85+
activity.ItemsList.add(item);
86+
}
87+
88+
activity.alAdapter = activity.new ItemAdapter(activity, activity.ItemsList,
89+
R.layout.mappinglist,
90+
new String[]{"Code", "Name", "isMapped"},
91+
new int[]{R.id.tvMapCode,R.id.tvMapName,R.id.chkMap});
92+
93+
activity.CheckUncheckAll(true);
94+
95+
for (HashMap<String, Object> item : activity.ItemsList) {
96+
assertTrue((Boolean)item.get("isMapped"));
97+
}
98+
}
99+
100+
@Test
101+
public void save_returnsCorrectCodes() {
102+
HashMap<String,Object> item = new HashMap<>();
103+
item.put("Code","ITEM001");
104+
item.put("Name","Test");
105+
item.put("isMapped",false);
106+
activity.ItemsList.add(item);
107+
108+
when(mockSqlHandler.InsertMapping(anyString(), anyString(), anyString())).thenReturn(true);
109+
110+
int result = activity.Save();
111+
assertEquals(1, result);
112+
113+
item.put("isMapped", true);
114+
result = activity.Save();
115+
assertEquals(0, result);
116+
}
117+
118+
@Test
119+
public void save_returns2_whenInsertFails() {
120+
HashMap<String,Object> item = new HashMap<>();
121+
item.put("Code","ITEM001");
122+
item.put("Name","Test");
123+
item.put("isMapped", true);
124+
activity.ItemsList.add(item);
125+
126+
when(mockSqlHandler.InsertMapping(anyString(), anyString(), anyString())).thenReturn(false);
127+
doNothing().when(mockSqlHandler).ClearMapping(anyString());
128+
129+
130+
int result = activity.Save();
131+
assertEquals(2, result);
132+
}
133+
134+
@Test
135+
public void filter_searchWorksCorrectly() {
136+
HashMap<String,Object> item1 = new HashMap<>();
137+
item1.put("Code","ITEM001");
138+
item1.put("Name","Paracetamol");
139+
item1.put("isMapped", false);
140+
activity.ItemsList.add(item1);
141+
142+
HashMap<String,Object> item2 = new HashMap<>();
143+
item2.put("Code","ITEM002");
144+
item2.put("Name","Aspirin");
145+
item2.put("isMapped", false);
146+
activity.ItemsList.add(item2);
147+
148+
activity.alAdapter = activity.new ItemAdapter(activity, activity.ItemsList,
149+
R.layout.mappinglist,
150+
new String[]{"Code","Name","isMapped"},
151+
new int[]{R.id.tvMapCode,R.id.tvMapName,R.id.chkMap});
152+
153+
activity.alAdapter.getFilter().filter("para");
154+
155+
assertEquals(1, activity.ItemsList.size());
156+
assertEquals("Paracetamol", activity.ItemsList.get(0).get("Name"));
157+
}
158+
159+
@Test
160+
public void adapter_getView_setsCorrectValues() {
161+
HashMap<String,Object> item = new HashMap<>();
162+
item.put("Code","ITEM001");
163+
item.put("Name","Test");
164+
item.put("isMapped", true);
165+
activity.ItemsList.add(item);
166+
167+
MapItems.ItemAdapter adapter = activity.new ItemAdapter(activity, activity.ItemsList,
168+
R.layout.mappinglist,
169+
new String[]{"Code","Name","isMapped"},
170+
new int[]{R.id.tvMapCode,R.id.tvMapName,R.id.chkMap});
171+
172+
assertNotNull(adapter.getView(0, null, null));
173+
}
174+
175+
@Test
176+
public void showDialog_createsAlertDialog() {
177+
AlertDialog dialog = activity.ShowDialog("Test message");
178+
assertNotNull(dialog);
179+
}
180+
}

0 commit comments

Comments
 (0)