Skip to content

Commit 7ce80aa

Browse files
Add DepictsFragment Unit Tests and update tests dependencies (commons-app#4688)
* Add DepictsFragment Unit Tests and update tests dependencies * Attempt to fix CI
1 parent 3dcd271 commit 7ce80aa

File tree

6 files changed

+229
-20
lines changed

6 files changed

+229
-20
lines changed

app/build.gradle

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,15 @@ dependencies {
8484

8585
// Unit testing
8686
testImplementation 'junit:junit:4.13.2'
87-
testImplementation 'org.robolectric:robolectric:4.5.1'
88-
testImplementation 'androidx.test:core:1.3.0'
87+
testImplementation 'org.robolectric:robolectric:4.6-alpha-1'
88+
testImplementation 'androidx.test:core:1.4.0'
8989
testImplementation "com.squareup.okhttp3:mockwebserver:$OKHTTP_VERSION"
9090
testImplementation "com.jraska.livedata:testing-ktx:1.1.2"
9191
testImplementation "androidx.arch.core:core-testing:2.1.0"
92-
testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1"
93-
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1"
94-
testImplementation 'com.facebook.soloader:soloader:0.9.0'
95-
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2"
92+
testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.0"
93+
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.7.0"
94+
testImplementation 'com.facebook.soloader:soloader:0.10.1'
95+
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0"
9696

9797
// Android testing
9898
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION"
@@ -142,6 +142,7 @@ dependencies {
142142
def work_version = "2.4.0"
143143
// Kotlin + coroutines
144144
implementation "androidx.work:work-runtime-ktx:$work_version"
145+
testImplementation "androidx.work:work-testing:$work_version"
145146

146147
//Glide
147148
implementation 'com.github.bumptech.glide:glide:4.12.0'

app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import android.os.Bundle;
55
import android.view.LayoutInflater;
66
import android.view.View;
7-
import android.view.View.OnClickListener;
87
import android.view.ViewGroup;
98
import android.widget.ImageView;
109
import android.widget.ProgressBar;
@@ -23,12 +22,10 @@
2322
import fr.free.nrw.commons.R;
2423
import fr.free.nrw.commons.upload.UploadActivity;
2524
import fr.free.nrw.commons.upload.UploadBaseFragment;
26-
import fr.free.nrw.commons.upload.UploadModel;
2725
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
2826
import fr.free.nrw.commons.utils.DialogUtil;
2927
import io.reactivex.android.schedulers.AndroidSchedulers;
3028
import io.reactivex.disposables.Disposable;
31-
import java.util.ArrayList;
3229
import java.util.List;
3330
import java.util.concurrent.TimeUnit;
3431
import javax.inject.Inject;
@@ -82,12 +79,9 @@ private void init() {
8279
depictsTitle.setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1,
8380
callback.getTotalNumberOfSteps(), getString(R.string.depicts_step_title)));
8481
setDepictsSubTitle();
85-
tooltip.setOnClickListener(new OnClickListener() {
86-
@Override
87-
public void onClick(View v) {
88-
DialogUtil.showAlertDialog(getActivity(), getString(R.string.depicts_step_title), getString(R.string.depicts_tooltip), getString(android.R.string.ok), null, true);
89-
}
90-
});
82+
tooltip.setOnClickListener(v -> DialogUtil
83+
.showAlertDialog(getActivity(), getString(R.string.depicts_step_title),
84+
getString(R.string.depicts_tooltip), getString(android.R.string.ok), null, true));
9185
presenter.onAttachView(this);
9286
initRecyclerView();
9387
addTextChangeListenerToSearchBox();

app/src/test/kotlin/fr/free/nrw/commons/contributions/MainActivityUnitTests.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import android.os.Bundle
66
import android.os.Looper
77
import androidx.fragment.app.Fragment
88
import androidx.work.Configuration
9-
import androidx.work.WorkManager
9+
import androidx.work.testing.WorkManagerTestInitHelper
1010
import fr.free.nrw.commons.CommonsApplication
1111
import fr.free.nrw.commons.R
1212
import fr.free.nrw.commons.TestAppAdapter
@@ -105,6 +105,9 @@ class MainActivityUnitTests {
105105
MainActivity::class.java.getDeclaredField("contributionsFragment")
106106
fieldContributionsFragment.isAccessible = true
107107
fieldContributionsFragment.set(activity, contributionsFragment)
108+
109+
val config: Configuration = Configuration.Builder().build()
110+
WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
108111
}
109112

110113
@Test
@@ -199,8 +202,6 @@ class MainActivityUnitTests {
199202
@Throws(Exception::class)
200203
fun testToggleLimitedConnectionMode() {
201204
Shadows.shadowOf(Looper.getMainLooper()).idle()
202-
val config: Configuration = Configuration.Builder().build()
203-
WorkManager.initialize(context, config)
204205
`when`(
205206
defaultKvStore.getBoolean(
206207
CommonsApplication.IS_LIMITED_CONNECTION_MODE_ENABLED, false

app/src/test/kotlin/fr/free/nrw/commons/upload/UploadActivityUnitTests.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package fr.free.nrw.commons.upload
22

33
import android.content.Context
44
import android.content.Intent
5+
import androidx.work.Configuration
6+
import androidx.work.testing.WorkManagerTestInitHelper
57
import fr.free.nrw.commons.CommonsApplication
68
import fr.free.nrw.commons.R
79
import fr.free.nrw.commons.TestAppAdapter
@@ -62,6 +64,9 @@ class UploadActivityUnitTests {
6264
Whitebox.setInternalState(activity, "fragments", mutableListOf(uploadBaseFragment))
6365
Whitebox.setInternalState(activity, "presenter", presenter)
6466
Whitebox.setInternalState(activity, "contributionController", contributionController)
67+
68+
val config: Configuration = Configuration.Builder().build()
69+
WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
6570
}
6671

6772
@Test
@@ -158,7 +163,6 @@ class UploadActivityUnitTests {
158163
}
159164

160165
@Test
161-
@Ignore()
162166
@Throws(Exception::class)
163167
fun testMakeUploadRequest() {
164168
activity.makeUploadRequest()

app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ class UploadCategoriesFragmentUnitTests {
168168
@Test
169169
@Throws(Exception::class)
170170
fun testSetCategoriesCaseNonNull() {
171-
Shadows.shadowOf(Looper.getMainLooper()).idle()
172171
fragment.setCategories(listOf())
173172
}
174173

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package fr.free.nrw.commons.upload.depicts
2+
3+
import android.content.Context
4+
import android.os.Bundle
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.widget.ImageView
8+
import android.widget.ProgressBar
9+
import android.widget.TextView
10+
import androidx.fragment.app.FragmentManager
11+
import androidx.fragment.app.FragmentTransaction
12+
import androidx.recyclerview.widget.RecyclerView
13+
import com.google.android.material.textfield.TextInputEditText
14+
import com.google.android.material.textfield.TextInputLayout
15+
import fr.free.nrw.commons.R
16+
import fr.free.nrw.commons.TestAppAdapter
17+
import fr.free.nrw.commons.TestCommonsApplication
18+
import fr.free.nrw.commons.upload.UploadActivity
19+
import fr.free.nrw.commons.upload.UploadBaseFragment
20+
import io.reactivex.disposables.Disposable
21+
import org.junit.Assert
22+
import org.junit.Before
23+
import org.junit.Test
24+
import org.junit.runner.RunWith
25+
import org.mockito.Mock
26+
import org.mockito.MockitoAnnotations
27+
import org.powermock.reflect.Whitebox
28+
import org.robolectric.Robolectric
29+
import org.robolectric.RobolectricTestRunner
30+
import org.robolectric.RuntimeEnvironment
31+
import org.robolectric.annotation.Config
32+
import org.robolectric.annotation.LooperMode
33+
import org.wikipedia.AppAdapter
34+
import java.lang.reflect.Method
35+
36+
@RunWith(RobolectricTestRunner::class)
37+
@Config(sdk = [21], application = TestCommonsApplication::class)
38+
@LooperMode(LooperMode.Mode.PAUSED)
39+
class DepictsFragmentUnitTests {
40+
41+
private lateinit var fragment: DepictsFragment
42+
private lateinit var fragmentManager: FragmentManager
43+
private lateinit var layoutInflater: LayoutInflater
44+
private lateinit var view: View
45+
private lateinit var context: Context
46+
47+
@Mock
48+
private lateinit var savedInstanceState: Bundle
49+
50+
@Mock
51+
private lateinit var textView: TextView
52+
53+
@Mock
54+
private lateinit var imageView: ImageView
55+
56+
@Mock
57+
private lateinit var recyclerView: RecyclerView
58+
59+
@Mock
60+
private lateinit var textInputEditText: TextInputEditText
61+
62+
@Mock
63+
private lateinit var progressBar: ProgressBar
64+
65+
@Mock
66+
private lateinit var textInputLayout: TextInputLayout
67+
68+
@Mock
69+
private lateinit var callback: UploadBaseFragment.Callback
70+
71+
@Mock
72+
private lateinit var disposable: Disposable
73+
74+
@Mock
75+
private lateinit var adapter: UploadDepictsAdapter
76+
77+
@Before
78+
fun setUp() {
79+
MockitoAnnotations.initMocks(this)
80+
context = RuntimeEnvironment.application.applicationContext
81+
AppAdapter.set(TestAppAdapter())
82+
83+
val activity = Robolectric.buildActivity(UploadActivity::class.java).create().get()
84+
fragment = DepictsFragment()
85+
fragmentManager = activity.supportFragmentManager
86+
val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
87+
fragmentTransaction.add(fragment, null)
88+
fragmentTransaction.commitNowAllowingStateLoss()
89+
90+
layoutInflater = LayoutInflater.from(activity)
91+
92+
view = LayoutInflater.from(activity)
93+
.inflate(R.layout.upload_depicts_fragment, null) as View
94+
95+
Whitebox.setInternalState(fragment, "depictsTitle", textView)
96+
Whitebox.setInternalState(fragment, "callback", callback)
97+
Whitebox.setInternalState(fragment, "tooltip", imageView)
98+
Whitebox.setInternalState(fragment, "depictsSubTitle", textView)
99+
Whitebox.setInternalState(fragment, "depictsRecyclerView", recyclerView)
100+
Whitebox.setInternalState(fragment, "depictsSearch", textInputEditText)
101+
Whitebox.setInternalState(fragment, "depictsSearchContainer", textInputLayout)
102+
Whitebox.setInternalState(fragment, "depictsSearchInProgress", progressBar)
103+
Whitebox.setInternalState(fragment, "subscribe", disposable)
104+
Whitebox.setInternalState(fragment, "adapter", adapter)
105+
}
106+
107+
@Test
108+
@Throws(Exception::class)
109+
fun checkFragmentNotNull() {
110+
Assert.assertNotNull(fragment)
111+
}
112+
113+
@Test
114+
@Throws(Exception::class)
115+
fun testOnCreateView() {
116+
fragment.onCreateView(layoutInflater, null, savedInstanceState)
117+
}
118+
119+
@Test
120+
@Throws(Exception::class)
121+
fun testInit() {
122+
val method: Method = DepictsFragment::class.java.getDeclaredMethod(
123+
"init"
124+
)
125+
method.isAccessible = true
126+
method.invoke(fragment)
127+
}
128+
129+
@Test
130+
@Throws(Exception::class)
131+
fun testOnBecameVisible() {
132+
val method: Method = DepictsFragment::class.java.getDeclaredMethod(
133+
"onBecameVisible"
134+
)
135+
method.isAccessible = true
136+
method.invoke(fragment)
137+
}
138+
139+
@Test
140+
@Throws(Exception::class)
141+
fun testGoToNextScreen() {
142+
fragment.goToNextScreen()
143+
}
144+
145+
@Test
146+
@Throws(Exception::class)
147+
fun testGoToPreviousScreen() {
148+
fragment.goToPreviousScreen()
149+
}
150+
151+
@Test
152+
@Throws(Exception::class)
153+
fun testNoDepictionSelected() {
154+
fragment.noDepictionSelected()
155+
}
156+
157+
@Test
158+
@Throws(Exception::class)
159+
fun testOnDestroyView() {
160+
fragment.onDestroyView()
161+
}
162+
163+
@Test
164+
@Throws(Exception::class)
165+
fun testShowProgress() {
166+
fragment.showProgress(true)
167+
}
168+
169+
@Test
170+
@Throws(Exception::class)
171+
fun testShowErrorCaseTrue() {
172+
fragment.showError(true)
173+
}
174+
175+
@Test
176+
@Throws(Exception::class)
177+
fun testShowErrorCaseFalse() {
178+
fragment.showError(false)
179+
}
180+
181+
@Test
182+
@Throws(Exception::class)
183+
fun testSetDepictsList() {
184+
fragment.setDepictsList(listOf())
185+
}
186+
187+
@Test
188+
@Throws(Exception::class)
189+
fun testOnNextButtonClicked() {
190+
fragment.onNextButtonClicked()
191+
}
192+
193+
@Test
194+
@Throws(Exception::class)
195+
fun testOnPreviousButtonClicked() {
196+
fragment.onPreviousButtonClicked()
197+
}
198+
199+
@Test
200+
@Throws(Exception::class)
201+
fun testSearchForDepictions() {
202+
val method: Method = DepictsFragment::class.java.getDeclaredMethod(
203+
"searchForDepictions",
204+
String::class.java
205+
)
206+
method.isAccessible = true
207+
method.invoke(fragment, "")
208+
}
209+
210+
}

0 commit comments

Comments
 (0)