From 48f2bb8863092db3d5b6bc0a09d77e7d8210af0b Mon Sep 17 00:00:00 2001 From: Madhur Gupta <30932899+madhurgupta10@users.noreply.github.com> Date: Fri, 14 May 2021 12:50:46 +0530 Subject: [PATCH] Add more tests for Quiz (#4411) --- .../nrw/commons/quiz/QuizActivityUnitTest.kt | 36 +++-- .../nrw/commons/quiz/QuizCheckerUnitTest.kt | 137 ++++++++++++++++++ .../quiz/QuizResultActivityUnitTest.kt | 88 +++++++++++ .../commons/quiz/RadioGroupHelperUnitTest.kt | 58 ++++++++ 4 files changed, 300 insertions(+), 19 deletions(-) create mode 100644 app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizCheckerUnitTest.kt create mode 100644 app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizResultActivityUnitTest.kt create mode 100644 app/src/test/kotlin/fr/free/nrw/commons/quiz/RadioGroupHelperUnitTest.kt diff --git a/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizActivityUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizActivityUnitTest.kt index 9f934828e..0ac5ff96e 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizActivityUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizActivityUnitTest.kt @@ -4,6 +4,8 @@ import android.content.Context import android.view.LayoutInflater import android.view.View import android.widget.RadioButton +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.soloader.SoLoader import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication import org.junit.Assert @@ -17,49 +19,40 @@ import org.powermock.api.mockito.PowerMockito.mock import org.powermock.reflect.Whitebox import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment import org.robolectric.annotation.Config -import org.robolectric.annotation.LooperMode - @RunWith(RobolectricTestRunner::class) @Config(sdk = [21], application = TestCommonsApplication::class) -@LooperMode(LooperMode.Mode.PAUSED) class QuizActivityUnitTest { + private val SAMPLE_ALERT_TITLE_VALUE = "Title" + private val SAMPLE_ALERT_MESSAGE_VALUE = "Message" + private lateinit var activity: QuizActivity private lateinit var positiveAnswer: RadioButton private lateinit var negativeAnswer: RadioButton private lateinit var view: View - - private val SAMPLE_ALERT_TITLE_VALUE = "Title" - private val SAMPLE_ALERT_MESSAGE_VALUE = "Message" + private lateinit var context: Context @Mock private lateinit var quizController: QuizController - @Mock - private lateinit var context: Context - - @Before fun setUp() { MockitoAnnotations.initMocks(this) - activity = Robolectric.buildActivity(QuizActivity::class.java).get() - + SoLoader.setInTestMode() + Fresco.initialize(RuntimeEnvironment.application.applicationContext) + activity = Robolectric.buildActivity(QuizActivity::class.java).create().get() context = mock(Context::class.java) - view = LayoutInflater.from(activity) .inflate(R.layout.answer_layout, null) as View - Mockito.`when`(context.getString(Mockito.any(Int::class.java))) .thenReturn("") quizController = QuizController() - quizController.initialize(context) - positiveAnswer = view.findViewById(R.id.quiz_positive_answer) negativeAnswer = view.findViewById(R.id.quiz_negative_answer) - activity.positiveAnswer = positiveAnswer activity.negativeAnswer = negativeAnswer } @@ -72,9 +65,16 @@ class QuizActivityUnitTest { Assert.assertNotNull(negativeAnswer) } + @Test + @Throws(Exception::class) + fun testSetNextQuestionCaseDefault() { + activity.setNextQuestion() + } + @Test @Throws(Exception::class) fun testSetNextQuestion() { + activity.negativeAnswer.isChecked = true activity.setNextQuestion() } @@ -87,10 +87,8 @@ class QuizActivityUnitTest { @Test @Throws(Exception::class) fun testEvaluateScore() { - Whitebox.setInternalState(activity, "quiz", quizController.getQuiz()) Whitebox.setInternalState(activity, "questionIndex", 0) - activity.evaluateScore() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizCheckerUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizCheckerUnitTest.kt new file mode 100644 index 000000000..21155442f --- /dev/null +++ b/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizCheckerUnitTest.kt @@ -0,0 +1,137 @@ +package fr.free.nrw.commons.quiz + +import android.app.Activity +import com.facebook.drawee.backends.pipeline.Fresco +import com.facebook.soloader.SoLoader +import com.nhaarman.mockitokotlin2.any +import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.auth.SessionManager +import fr.free.nrw.commons.kvstore.JsonKvStore +import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient +import fr.free.nrw.commons.profile.achievements.FeedbackResponse +import io.reactivex.Single +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.MockitoAnnotations +import org.powermock.reflect.Whitebox +import org.robolectric.Robolectric +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config +import java.lang.reflect.Method + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [21], application = TestCommonsApplication::class) +class QuizCheckerUnitTest { + + private lateinit var quizChecker: QuizChecker + private lateinit var activity: Activity + + @Mock + private lateinit var sessionManager: SessionManager + + @Mock + private lateinit var okHttpJsonApiClient: OkHttpJsonApiClient + + @Mock + private lateinit var jsonKvStore: JsonKvStore + + @Mock + private lateinit var feedbackResponse: FeedbackResponse + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + SoLoader.setInTestMode() + Fresco.initialize(RuntimeEnvironment.application.applicationContext) + activity = Robolectric.buildActivity(QuizActivity::class.java).create().get() + quizChecker = QuizChecker(sessionManager, okHttpJsonApiClient, jsonKvStore) + Mockito.`when`(sessionManager.userName).thenReturn("") + Mockito.`when`(okHttpJsonApiClient.getUploadCount(any())).thenReturn(Single.just(0)) + Mockito.`when`(okHttpJsonApiClient.getAchievements(any())) + .thenReturn(Single.just(feedbackResponse)) + } + + @Test + @Throws(Exception::class) + fun checkNotNull() { + Assert.assertNotNull(quizChecker) + } + + @Test + @Throws(Exception::class) + fun testInitQuizCheck() { + quizChecker.initQuizCheck(activity) + } + + @Test + @Throws(Exception::class) + fun testCleanUp() { + quizChecker.cleanup() + } + + @Test + @Throws(Exception::class) + fun testSetTotalUploadCount() { + val method: Method = QuizChecker::class.java.getDeclaredMethod( + "setTotalUploadCount", + Int::class.java + ) + method.isAccessible = true + method.invoke(quizChecker, -1) + } + + @Test + @Throws(Exception::class) + fun testSetRevertParameter() { + val method: Method = QuizChecker::class.java.getDeclaredMethod( + "setRevertParameter", + Int::class.java + ) + method.isAccessible = true + method.invoke(quizChecker, -1) + } + + @Test + @Throws(Exception::class) + fun testCalculateRevertParameterAndShowQuiz() { + Whitebox.setInternalState(quizChecker, "revertCount", -1) + val method: Method = QuizChecker::class.java.getDeclaredMethod( + "calculateRevertParameterAndShowQuiz", + Activity::class.java + ) + method.isAccessible = true + method.invoke(quizChecker, activity) + } + + @Test + @Throws(Exception::class) + fun testCalculateRevertParameterAndShowQuizCaseDefault() { + Whitebox.setInternalState(quizChecker, "isRevertCountFetched", true) + Whitebox.setInternalState(quizChecker, "isUploadCountFetched", true) + Whitebox.setInternalState(quizChecker, "totalUploadCount", 5) + Whitebox.setInternalState(quizChecker, "revertCount", 5) + val method: Method = QuizChecker::class.java.getDeclaredMethod( + "calculateRevertParameterAndShowQuiz", + Activity::class.java + ) + method.isAccessible = true + method.invoke(quizChecker, activity) + } + + @Test + @Throws(Exception::class) + fun testStartQuizActivity() { + val method: Method = QuizChecker::class.java.getDeclaredMethod( + "startQuizActivity", + Activity::class.java + ) + method.isAccessible = true + method.invoke(quizChecker, activity) + } + +} \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizResultActivityUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizResultActivityUnitTest.kt new file mode 100644 index 000000000..501452432 --- /dev/null +++ b/app/src/test/kotlin/fr/free/nrw/commons/quiz/QuizResultActivityUnitTest.kt @@ -0,0 +1,88 @@ +package fr.free.nrw.commons.quiz + +import android.content.Intent +import android.graphics.Bitmap +import fr.free.nrw.commons.TestCommonsApplication +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.MockitoAnnotations +import org.powermock.api.mockito.PowerMockito +import org.robolectric.Robolectric +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.robolectric.fakes.RoboMenu + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [21], application = TestCommonsApplication::class) +class QuizResultActivityUnitTest { + + private lateinit var activity: QuizResultActivity + private lateinit var quizResultActivity: QuizResultActivity + private lateinit var menu: RoboMenu + + @Mock + private lateinit var bitmap: Bitmap + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + val intent = Intent().putExtra("QuizResult", 0) + activity = Robolectric.buildActivity(QuizResultActivity::class.java, intent).get() + quizResultActivity = PowerMockito.mock(QuizResultActivity::class.java) + } + + @Test + @Throws(Exception::class) + fun checkActivityNotNull() { + Assert.assertNotNull(activity) + } + + @Test + @Throws(Exception::class) + fun testOnCreateCaseDefault() { + activity.onCreate(null) + } + + @Test + @Throws(Exception::class) + fun testOnCreate() { + Mockito.`when`(quizResultActivity.intent).thenReturn(null) + activity.onCreate(null) + } + + @Test + @Throws(Exception::class) + fun testLaunchContributionActivity() { + activity.launchContributionActivity() + } + + @Test + @Throws(Exception::class) + fun tesOnBackPressed() { + activity.onBackPressed() + } + + @Test + @Throws(Exception::class) + fun tesOnCreateOptionsMenu() { + menu = RoboMenu() + activity.onCreateOptionsMenu(menu) + } + + @Test + @Throws(Exception::class) + fun tesShowAlert() { + activity.showAlert(bitmap) + } + + @Test + @Throws(Exception::class) + fun tesShareScreen() { + activity.shareScreen(bitmap) + } + +} \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/quiz/RadioGroupHelperUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/quiz/RadioGroupHelperUnitTest.kt new file mode 100644 index 000000000..b6987986d --- /dev/null +++ b/app/src/test/kotlin/fr/free/nrw/commons/quiz/RadioGroupHelperUnitTest.kt @@ -0,0 +1,58 @@ +package fr.free.nrw.commons.quiz + +import android.app.Activity +import android.view.View +import android.widget.CompoundButton +import android.widget.RadioButton +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.anyInt +import org.mockito.MockitoAnnotations + +class RadioGroupHelperUnitTest { + + private lateinit var radioGroupHelper: RadioGroupHelper + + @Mock + private lateinit var radioButton: RadioButton + + @Mock + private lateinit var radioButton1: RadioButton + + @Mock + private lateinit var activity: Activity + + @Mock + private lateinit var view: View + + @Mock + private lateinit var compoundButton: CompoundButton + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + radioGroupHelper = RadioGroupHelper() + } + + @Test + @Throws(Exception::class) + fun checkNotNull() { + Assert.assertNotNull(radioGroupHelper) + } + + @Test + @Throws(Exception::class) + fun constructor1() { + radioGroupHelper = RadioGroupHelper(radioButton, radioButton1) + } + + @Test + @Throws(Exception::class) + fun constructor2() { + radioGroupHelper = RadioGroupHelper(activity) + } + +} \ No newline at end of file