proton-mail-android/app/src/androidTest/java/ch/protonmail/android/compose/presentation/ui/SetMessagePasswordActivityT...

175 lines
5.7 KiB
Kotlin

/*
* Copyright (c) 2022 Proton AG
*
* This file is part of Proton Mail.
*
* Proton Mail is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Proton Mail is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Proton Mail. If not, see https://www.gnu.org/licenses/.
*/
package ch.protonmail.android.compose.presentation.ui
import android.content.Intent
import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.ViewInteraction
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.replaceText
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra
import androidx.test.espresso.intent.matcher.IntentMatchers.hasExtraWithKey
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.isEnabled
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
import ch.protonmail.android.R
import ch.protonmail.android.util.withProtonInputEditTextId
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.hamcrest.Matchers.anyOf
import org.hamcrest.Matchers.not
import org.hamcrest.core.AllOf.allOf
import org.junit.Rule
import org.junit.runner.RunWith
import kotlin.test.BeforeTest
import kotlin.test.Test
@HiltAndroidTest
@RunWith(AndroidJUnit4ClassRunner::class)
@Suppress("SameParameterValue")
class SetMessagePasswordActivityTest {
@get:Rule
val hiltRule = HiltAndroidRule(this)
private val baseIntent =
Intent(ApplicationProvider.getApplicationContext(), SetMessagePasswordActivity::class.java)
@BeforeTest
fun setup() {
Intents.init()
}
@Test
fun inputIsSetCorrectly() {
// given
val expectedPassword = "12345"
val expectedHint = "hint"
// when
val intent = baseIntent
.putExtra(ARG_SET_MESSAGE_PASSWORD_PASSWORD, expectedPassword)
.putExtra(ARG_SET_MESSAGE_PASSWORD_HINT, expectedHint)
ActivityScenario.launch<SetMessagePasswordActivity>(intent)
// then
onPasswordView().check(matches(withText(expectedPassword)))
onRepeatView().check(matches(withText(expectedPassword)))
onHintView().check(matches(withText(expectedHint)))
}
@Test
fun resultIsSetCorrectly() {
// given
val expectedPassword = "12345"
val expectedHint = "hint"
// when
val scenario = ActivityScenario.launch<SetMessagePasswordActivity>(baseIntent)
setPassword(expectedPassword)
setHint(expectedHint)
performApplyClick()
// then
assertResult(scenario, expectedPassword, expectedHint)
}
@Test
fun passwordIsRemovedCorrectly() {
// given
val expectedPassword: String? = null
val expectedHint: String? = null
// when
val intent = baseIntent
.putExtra(ARG_SET_MESSAGE_PASSWORD_PASSWORD, "old password")
.putExtra(ARG_SET_MESSAGE_PASSWORD_HINT, "old hint")
val scenario = ActivityScenario.launch<SetMessagePasswordActivity>(intent)
performRemovePasswordClick()
// then
assertResult(scenario, expectedPassword, expectedHint)
}
private fun onPasswordView(): ViewInteraction =
onView(withProtonInputEditTextId(R.id.set_msg_password_msg_password_input))
private fun onRepeatView(): ViewInteraction =
onView(withProtonInputEditTextId(R.id.set_msg_password_repeat_password_input))
private fun onHintView(): ViewInteraction =
onView(withProtonInputEditTextId(R.id.set_msg_password_hint_input))
private fun setPassword(password: String) {
onPasswordView().perform(replaceText(password))
onRepeatView().perform(replaceText(password))
}
private fun setHint(hint: String) {
onHintView().perform(replaceText(hint))
}
private fun performApplyClick() {
onView(withId(R.id.set_msg_password_apply_button)).perform(click())
}
private fun performRemovePasswordClick() {
onView(withId(R.id.set_msg_password_remove_button))
.check(matches(isEnabled()))
.perform(click())
}
private fun assertResult(
scenario: ActivityScenario<SetMessagePasswordActivity>,
expectedPassword: String?,
expectedHint: String?
) {
val resultIntent = scenario.result.resultData
val withExtrasMatcher = allOf(
hasExtra(ARG_SET_MESSAGE_PASSWORD_PASSWORD, expectedPassword),
hasExtra(ARG_SET_MESSAGE_PASSWORD_HINT, expectedHint)
)
val matcher = if (expectedPassword == null && expectedHint == null) {
anyOf(
allOf(
not(hasExtraWithKey(ARG_SET_MESSAGE_PASSWORD_PASSWORD)),
not(hasExtraWithKey(ARG_SET_MESSAGE_PASSWORD_HINT))
),
withExtrasMatcher
)
} else {
withExtrasMatcher
}
ViewMatchers.assertThat(resultIntent, matcher)
}
}