Last active
April 14, 2022 10:02
Revisions
-
yash10019coder renamed this gist
Apr 14, 2022 . 1 changed file with 13 additions and 13 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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) } class TestApplication : Application(), ActivityComponentFactory, ApplicationInjectorProvider { private val component: TestApplicationComponent by lazy { DaggerProfileEditFragmentTest_TestApplicationComponent.builder() -
yash10019coder created this gist
Apr 12, 2022 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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 } }