@@ -8,6 +8,9 @@ import org.mockito.*
8
8
import org.wikipedia.dataclient.mwapi.MwQueryPage
9
9
import org.wikipedia.dataclient.mwapi.MwQueryResponse
10
10
import org.wikipedia.dataclient.mwapi.MwQueryResult
11
+ import android.content.Context
12
+ import com.google.gson.Gson
13
+ import fr.free.nrw.commons.kvstore.JsonKvStore
11
14
12
15
// class for testing CategoriesModel class
13
16
class CategoriesModelTest {
@@ -17,12 +20,26 @@ class CategoriesModelTest {
17
20
@Mock
18
21
internal var categoryItem: CategoryItem ? = null
19
22
23
+ @Spy
24
+ internal lateinit var gson: Gson
25
+
26
+ @Spy
27
+ internal lateinit var categoryItemForSubstringSearch: CategoryItem
28
+
29
+ @Mock
30
+ internal var categoryDao: CategoryDao ? = null
31
+
32
+ @Mock
33
+ internal var context: Context ? = null
34
+
20
35
@InjectMocks
21
36
var categoryClient: CategoryClient ? = null
22
37
23
38
@Before
24
39
@Throws(Exception ::class )
25
40
fun setUp () {
41
+ gson = Gson ()
42
+ categoryItemForSubstringSearch = CategoryItem (" " ,false )
26
43
MockitoAnnotations .initMocks(this )
27
44
}
28
45
@@ -47,4 +64,42 @@ class CategoriesModelTest {
47
64
val actualCategoryNameCaps = categoriesModel!! .searchAll(" Tes" ,null ).blockingFirst()
48
65
assertEquals(" Test" , actualCategoryNameCaps.getName())
49
66
}
67
+
68
+ /* *
69
+ * For testing the substring search algorithm for Categories search
70
+ * To be more precise it tests the In Between substring( ex: searching `atte`
71
+ * will give search suggestions: `Latte`, `Iced latte` e.t.c) which has been described
72
+ * on github repo wiki:
73
+ * https://github.com/commons-app/apps-android-commons/wiki/Category-suggestions-(readme)#user-content-3-category-search-when-typing-in-the-search-field-has-been-made-more-flexible
74
+ */
75
+ @Test
76
+ fun searchAllFoundCaseTestForSubstringSearch () {
77
+ val mockDaoList = mutableListOf<String >(" " )
78
+ val mwQueryPage = Mockito .mock(MwQueryPage ::class .java)
79
+ Mockito .`when `(mwQueryPage.title()).thenReturn(" Category:Test" )
80
+ val mwQueryResult = Mockito .mock(MwQueryResult ::class .java)
81
+ Mockito .`when `(mwQueryResult.pages()).thenReturn(listOf (mwQueryPage))
82
+ val mockResponse = Mockito .mock(MwQueryResponse ::class .java)
83
+ Mockito .`when `(mockResponse.query()).thenReturn(mwQueryResult)
84
+ Mockito .`when `(context!! .getSharedPreferences(" " ,0 ))
85
+ .thenReturn(null )
86
+ val directKvStore = Mockito .spy(JsonKvStore (context," " ,gson))
87
+ val categoriesModelForSubstringSearch = Mockito .spy(CategoriesModel (categoryClient,categoryDao,directKvStore))
88
+ Mockito .doReturn(Observable .just(categoryItemForSubstringSearch)).`when `(categoriesModelForSubstringSearch).gpsCategories()
89
+ Mockito .`when `(context!! .getSharedPreferences(" " ,0 ))
90
+ .thenReturn(null )
91
+ Mockito .`when `(categoryInterface!! .searchCategories(ArgumentMatchers .anyString(), ArgumentMatchers .anyInt(), ArgumentMatchers .anyInt()))
92
+ .thenReturn(Observable .just(mockResponse))
93
+ Mockito .doReturn(mockDaoList).`when `(categoryDao)?.recentCategories(25 )
94
+ Mockito .doReturn(" Random Value" ).`when `(directKvStore).getString(" Category" ," " )
95
+ Mockito .`when `(categoryInterface!! .searchCategories(ArgumentMatchers .anyString(), ArgumentMatchers .anyInt(), ArgumentMatchers .anyInt()))
96
+ .thenReturn(Observable .just(mockResponse))
97
+
98
+ // Checking if both return "Test"
99
+ val actualCategoryName = categoriesModelForSubstringSearch!! .searchAll(null , listOf<String >(" tes" )).blockingLast()
100
+ assertEquals(" Test" ,actualCategoryName.getName())
101
+
102
+ val actualCategoryNameCaps = categoriesModelForSubstringSearch!! .searchAll(null , listOf<String >(" Tes" )).blockingLast()
103
+ assertEquals(" Test" ,actualCategoryNameCaps.getName())
104
+ }
50
105
}
0 commit comments