Skip to content

Instantly share code, notes, and snippets.

@yash10019coder
Last active April 14, 2022 10:02

Revisions

  1. yash10019coder renamed this gist Apr 14, 2022. 1 changed file with 13 additions and 13 deletions.
    26 changes: 13 additions & 13 deletions ProfileEditFragmentTest → ProfileEditFragmentTest.kt
    Original file line number Diff line number Diff line change
    @@ -309,6 +309,19 @@ class ProfileEditFragmentTest {
    }
    }

    @Test
    fun testProfileEdit_startWithUserDoesNotHaveDownloadAccess_switchContainerIsNotDisplayed() {
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 0
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_container)).check(matches(not(isDisplayed())))
    }
    }

    @Singleton
    @Component(
    modules = [
    @@ -341,19 +354,6 @@ class ProfileEditFragmentTest {
    fun inject(profileEditFragmentTest: ProfileEditFragmentTest)
    }

    @Test
    fun testProfileEdit_startWithUserDoesNotHaveDownloadAccess_switchContainerIsNotDisplayed() {
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 0
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_container)).check(matches(not(isDisplayed())))
    }
    }

    class TestApplication : Application(), ActivityComponentFactory, ApplicationInjectorProvider {
    private val component: TestApplicationComponent by lazy {
    DaggerProfileEditFragmentTest_TestApplicationComponent.builder()
  2. yash10019coder created this gist Apr 12, 2022.
    373 changes: 373 additions & 0 deletions ProfileEditFragmentTest
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,373 @@
    package org.oppia.android.app.settings.profile

    import android.app.Application
    import android.content.Context
    import androidx.appcompat.app.AppCompatActivity
    import androidx.test.core.app.ActivityScenario.launch
    import androidx.test.core.app.ApplicationProvider
    import androidx.test.espresso.Espresso.onView
    import androidx.test.espresso.action.ViewActions.click
    import androidx.test.espresso.action.ViewActions.scrollTo
    import androidx.test.espresso.assertion.ViewAssertions.matches
    import androidx.test.espresso.intent.Intents
    import androidx.test.espresso.matcher.RootMatchers.isDialog
    import androidx.test.espresso.matcher.ViewMatchers.isChecked
    import androidx.test.espresso.matcher.ViewMatchers.isClickable
    import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
    import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
    import androidx.test.espresso.matcher.ViewMatchers.isFocusable
    import androidx.test.espresso.matcher.ViewMatchers.isRoot
    import androidx.test.espresso.matcher.ViewMatchers.withId
    import androidx.test.espresso.matcher.ViewMatchers.withText
    import androidx.test.ext.junit.runners.AndroidJUnit4
    import dagger.Component
    import org.hamcrest.Matchers.not
    import org.junit.After
    import org.junit.Before
    import org.junit.Rule
    import org.junit.Test
    import org.junit.runner.RunWith
    import org.oppia.android.R
    import org.oppia.android.app.activity.ActivityComponent
    import org.oppia.android.app.activity.ActivityComponentFactory
    import org.oppia.android.app.application.ApplicationComponent
    import org.oppia.android.app.application.ApplicationInjector
    import org.oppia.android.app.application.ApplicationInjectorProvider
    import org.oppia.android.app.application.ApplicationModule
    import org.oppia.android.app.application.ApplicationStartupListenerModule
    import org.oppia.android.app.devoptions.DeveloperOptionsModule
    import org.oppia.android.app.devoptions.DeveloperOptionsStarterModule
    import org.oppia.android.app.shim.ViewBindingShimModule
    import org.oppia.android.app.testing.ProfileEditFragmentTestActivity
    import org.oppia.android.app.topic.PracticeTabModule
    import org.oppia.android.app.translation.testing.ActivityRecreatorTestModule
    import org.oppia.android.app.utility.OrientationChangeAction.Companion.orientationLandscape
    import org.oppia.android.data.backends.gae.NetworkConfigProdModule
    import org.oppia.android.data.backends.gae.NetworkModule
    import org.oppia.android.domain.classify.InteractionsModule
    import org.oppia.android.domain.classify.rules.continueinteraction.ContinueModule
    import org.oppia.android.domain.classify.rules.dragAndDropSortInput.DragDropSortInputModule
    import org.oppia.android.domain.classify.rules.fractioninput.FractionInputModule
    import org.oppia.android.domain.classify.rules.imageClickInput.ImageClickInputModule
    import org.oppia.android.domain.classify.rules.itemselectioninput.ItemSelectionInputModule
    import org.oppia.android.domain.classify.rules.multiplechoiceinput.MultipleChoiceInputModule
    import org.oppia.android.domain.classify.rules.numberwithunits.NumberWithUnitsRuleModule
    import org.oppia.android.domain.classify.rules.numericinput.NumericInputRuleModule
    import org.oppia.android.domain.classify.rules.ratioinput.RatioInputModule
    import org.oppia.android.domain.classify.rules.textinput.TextInputRuleModule
    import org.oppia.android.domain.exploration.lightweightcheckpointing.ExplorationStorageModule
    import org.oppia.android.domain.hintsandsolution.HintsAndSolutionConfigModule
    import org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModule
    import org.oppia.android.domain.onboarding.ExpirationMetaDataRetrieverModule
    import org.oppia.android.domain.oppialogger.LogStorageModule
    import org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerModule
    import org.oppia.android.domain.platformparameter.PlatformParameterModule
    import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule
    import org.oppia.android.domain.profile.ProfileManagementController
    import org.oppia.android.domain.question.QuestionModule
    import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule
    import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule
    import org.oppia.android.testing.OppiaTestRule
    import org.oppia.android.testing.TestLogReportingModule
    import org.oppia.android.testing.junit.InitializeDefaultLocaleRule
    import org.oppia.android.testing.profile.ProfileTestHelper
    import org.oppia.android.testing.robolectric.RobolectricModule
    import org.oppia.android.testing.threading.TestCoroutineDispatchers
    import org.oppia.android.testing.threading.TestDispatcherModule
    import org.oppia.android.testing.time.FakeOppiaClockModule
    import org.oppia.android.util.accessibility.AccessibilityTestModule
    import org.oppia.android.util.caching.AssetModule
    import org.oppia.android.util.caching.testing.CachingTestModule
    import org.oppia.android.util.data.DataProviders.Companion.toLiveData
    import org.oppia.android.util.gcsresource.GcsResourceModule
    import org.oppia.android.util.locale.LocaleProdModule
    import org.oppia.android.util.logging.LoggerModule
    import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule
    import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule
    import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule
    import org.oppia.android.util.parser.html.HtmlParserEntityTypeModule
    import org.oppia.android.util.parser.image.GlideImageLoaderModule
    import org.oppia.android.util.parser.image.ImageParsingModule
    import org.robolectric.annotation.Config
    import org.robolectric.annotation.LooperMode
    import javax.inject.Inject
    import javax.inject.Singleton

    @RunWith(AndroidJUnit4::class)
    @LooperMode(LooperMode.Mode.PAUSED)
    @Config(application = ProfileEditFragmentTest.TestApplication::class, qualifiers = "port-xxhdpi")
    class ProfileEditFragmentTest {

    @get:Rule
    val initializeDefaultLocaleRule = InitializeDefaultLocaleRule()

    @get:Rule
    val oppiaTestRule = OppiaTestRule()

    @Inject
    lateinit var context: Context

    @Inject
    lateinit var profileTestHelper: ProfileTestHelper

    @Inject
    lateinit var profileManagementController: ProfileManagementController

    @Inject
    lateinit var testCoroutineDispatchers: TestCoroutineDispatchers

    @Before
    fun setUp() {
    Intents.init()
    setUpTestApplicationComponent()
    testCoroutineDispatchers.registerIdlingResource()
    profileTestHelper.initializeProfiles()
    }

    @After
    fun tearDown() {
    testCoroutineDispatchers.unregisterIdlingResource()
    Intents.release()
    }

    private fun setUpTestApplicationComponent() {
    ApplicationProvider.getApplicationContext<TestApplication>().inject(this)
    }

    @Test
    fun testProfileEdit_startWithUserProfile_clickProfileDeletionButton_checkOpensDeletionDialog() {
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 1
    )
    ).use {
    onView(withId(R.id.profile_delete_button)).perform(click())
    onView(withText(R.string.profile_edit_delete_dialog_message))
    .inRoot(isDialog()).check(matches(isDisplayed()))
    }
    }

    @Test
    fun testProfileEdit_configChange_startWithUserProfile_clickDelete_checkOpensDeletionDialog() {
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 1
    )
    ).use {
    onView(isRoot()).perform(orientationLandscape())
    onView(withId(R.id.profile_delete_button)).perform(scrollTo()).perform(click())
    testCoroutineDispatchers.runCurrent()
    onView(withText(R.string.profile_edit_delete_dialog_message))
    .inRoot(isDialog()).check(matches(isDisplayed()))
    }
    }

    @Test
    fun testProfileEdit_startWithUserProfile_clickDelete_configChange_checkDeletionDialogIsVisible() {
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context,
    profileId = 1
    )
    ).use {
    onView(withId(R.id.profile_delete_button)).perform(scrollTo()).perform(click())
    onView(isRoot()).perform(orientationLandscape())
    testCoroutineDispatchers.runCurrent()
    onView(withText(R.string.profile_edit_delete_dialog_message))
    .inRoot(isDialog()).check(matches(isCompletelyDisplayed()))
    }
    }

    @Test
    fun testProfileEdit_startWithUserHasDownloadAccess_checkSwitchIsChecked() {
    profileManagementController.addProfile(
    name = "James",
    pin = "123",
    avatarImagePath = null,
    allowDownloadAccess = true,
    colorRgb = -10710042,
    isAdmin = false
    ).toLiveData()
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 4
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(isChecked()))
    }
    }

    @Test
    fun testProfileEdit_configChange_startWithUserHasDownloadAccess_checkSwitchIsChecked() {
    profileManagementController.addProfile(
    name = "James",
    pin = "123",
    avatarImagePath = null,
    allowDownloadAccess = true,
    colorRgb = -10710042,
    isAdmin = false
    ).toLiveData()
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 4
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(isRoot()).perform(orientationLandscape())
    onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(isChecked()))
    }
    }

    @Test
    fun testProfileEdit_startWithUserHasDownloadAccess_clickAllowDownloadContainer_checkChanged() {
    profileManagementController.addProfile(
    name = "James",
    pin = "123",
    avatarImagePath = null,
    allowDownloadAccess = true,
    colorRgb = -10710042,
    isAdmin = false
    ).toLiveData()
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 4
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(isChecked()))
    onView(withId(R.id.profile_edit_allow_download_container)).perform(click())
    onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(not(isChecked())))
    }
    }

    @Test
    fun testProfileEdit_startWithUserDoesNotHaveDownloadAccess_switchIsNotClickable() {
    profileManagementController.addProfile(
    name = "James",
    pin = "123",
    avatarImagePath = null,
    allowDownloadAccess = false,
    colorRgb = -10710042,
    isAdmin = false
    ).toLiveData()
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 4
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_switch)).check(matches(not(isClickable())))
    }
    }

    @Test
    fun testProfileEdit_startWithUserHasDownloadAccess_switchContainerIsFocusable() {
    profileManagementController.addProfile(
    name = "James",
    pin = "123",
    avatarImagePath = null,
    allowDownloadAccess = true,
    colorRgb = -10710042,
    isAdmin = false
    ).toLiveData()
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 4
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_container)).check(matches(isFocusable()))
    }
    }

    @Test
    fun testProfileEdit_startWithUserHasDownloadAccess_switchContainerIsDisplayed() {
    profileManagementController.addProfile(
    name = "James",
    pin = "123",
    avatarImagePath = null,
    allowDownloadAccess = true,
    colorRgb = -10710042,
    isAdmin = false
    ).toLiveData()
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 4
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_container)).check(matches(isDisplayed()))
    }
    }

    @Singleton
    @Component(
    modules = [
    RobolectricModule::class,
    PlatformParameterModule::class, PlatformParameterSingletonModule::class,
    TestDispatcherModule::class, ApplicationModule::class,
    LoggerModule::class, ContinueModule::class, FractionInputModule::class,
    ItemSelectionInputModule::class, MultipleChoiceInputModule::class,
    NumberWithUnitsRuleModule::class, NumericInputRuleModule::class, TextInputRuleModule::class,
    DragDropSortInputModule::class, ImageClickInputModule::class, InteractionsModule::class,
    GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class,
    HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class,
    AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class,
    PrimeTopicAssetsControllerModule::class, ExpirationMetaDataRetrieverModule::class,
    ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class,
    ApplicationStartupListenerModule::class, LogUploadWorkerModule::class,
    HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class,
    FirebaseLogUploaderModule::class, FakeOppiaClockModule::class, PracticeTabModule::class,
    DeveloperOptionsStarterModule::class, DeveloperOptionsModule::class,
    ExplorationStorageModule::class, NetworkModule::class, NetworkConfigProdModule::class,
    NetworkConnectionUtilDebugModule::class, NetworkConnectionDebugUtilModule::class,
    AssetModule::class, LocaleProdModule::class, ActivityRecreatorTestModule::class
    ]
    )

    interface TestApplicationComponent : ApplicationComponent {
    @Component.Builder
    interface Builder : ApplicationComponent.Builder

    fun inject(profileEditFragmentTest: ProfileEditFragmentTest)
    }

    @Test
    fun testProfileEdit_startWithUserDoesNotHaveDownloadAccess_switchContainerIsNotDisplayed() {
    launch<ProfileEditFragmentTestActivity>(
    ProfileEditFragmentTestActivity.createProfileEditFragmentTestActivity(
    context = context,
    profileId = 0
    )
    ).use {
    testCoroutineDispatchers.runCurrent()
    onView(withId(R.id.profile_edit_allow_download_container)).check(matches(not(isDisplayed())))
    }
    }

    class TestApplication : Application(), ActivityComponentFactory, ApplicationInjectorProvider {
    private val component: TestApplicationComponent by lazy {
    DaggerProfileEditFragmentTest_TestApplicationComponent.builder()
    .setApplication(this)
    .build() as TestApplicationComponent
    }

    fun inject(profileEditFragmentTest: ProfileEditFragmentTest) =
    component.inject(profileEditFragmentTest)

    override fun createActivityComponent(activity: AppCompatActivity): ActivityComponent {
    return component.getActivityComponentBuilderProvider().get().setActivity(activity).build()
    }

    override fun getApplicationInjector(): ApplicationInjector = component
    }
    }