Skip to content

Instantly share code, notes, and snippets.

@yash10019coder
Last active April 14, 2022 10:02
Show Gist options
  • Save yash10019coder/5203c385bb133ffb495cf1959cc1a12f to your computer and use it in GitHub Desktop.
Save yash10019coder/5203c385bb133ffb495cf1959cc1a12f to your computer and use it in GitHub Desktop.
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()))
}
}
@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 = [
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)
}
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
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment