Skip to content

Commit

Permalink
Fix ui tests, mock backend calls
Browse files Browse the repository at this point in the history
  • Loading branch information
gizemb committed Jun 25, 2020
1 parent 9c80bd1 commit 9e57adf
Show file tree
Hide file tree
Showing 10 changed files with 102 additions and 8 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Expand Up @@ -59,6 +59,8 @@ dependencies {
androidTestImplementation(TestLibraries.testRules)
androidTestImplementation(TestLibraries.mockitoAndroid)
androidTestImplementation(TestLibraries.uiAutomator)
androidTestImplementation(TestLibraries.koinTest)
androidTestImplementation(TestLibraries.mockito)

// Development dependencies
debugImplementation(DevLibraries.leakCanary)
Expand Down
Expand Up @@ -2,13 +2,39 @@ package com.wire.android.feature.auth.registration

import androidx.test.espresso.Espresso.onView
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.matcher.ViewMatchers.*
import com.wire.android.FunctionalTest
import com.wire.android.R
import com.wire.android.core.exception.Conflict
import com.wire.android.core.exception.Forbidden
import com.wire.android.core.functional.Either
import com.wire.android.feature.auth.activation.ActivationRepository
import com.wire.android.framework.koinMockRule
import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.koin.test.KoinTest
import org.koin.test.mock.declareMock
import org.mockito.Mockito.`when`

class CreateAccountActivityUITest : FunctionalTest(CreateAccountActivity::class.java) {
class CreateAccountActivityUITest : FunctionalTest(CreateAccountActivity::class.java), KoinTest {

@get:Rule
val mockProvider = koinMockRule()

@Before
fun setup() {
declareMock<ActivationRepository>().let {
runBlocking {
`when`(it.sendEmailActivationCode(VALID_EMAIL)).thenReturn(Either.Right(Unit))
`when`(it.sendEmailActivationCode(FORBIDDEN_EMAIL)).thenReturn(Either.Left(Forbidden))
`when`(it.sendEmailActivationCode(CONFLICT_EMAIL)).thenReturn(Either.Left(Conflict))
}
}
}

@Test
fun launch_uiElementsVisible() {
Expand All @@ -30,17 +56,56 @@ class CreateAccountActivityUITest : FunctionalTest(CreateAccountActivity::class.

@Test
fun personal_uiElementsVisible() {
onView(withId(R.id.createPersonalAccountTitleTextView)).perform(click())
onView(withId(R.id.createPersonalAccountLayoutContainer)).perform(click())

onView(withText(R.string.create_personal_account_title)).check(matches(isDisplayed()))
onView(withText(R.string.authentication_tab_layout_title_email)).check(matches(isDisplayed()))
onView(withText(R.string.authentication_tab_layout_title_phone)).check(matches(isDisplayed()))

//TODO: check whether Email entry area is visible
onView(withId(R.id.createPersonalAccountEmailTextInputLayout)).check(matches(isDisplayed()))
}

@Test
fun personal_uiElementsVisibleInLandscape() = rotateScreen {
personal_uiElementsVisible()
}

@Test
fun personalEmailScreen_validEmailFilled_opensCodeVerificationScreen() {
onView(withId(R.id.createPersonalAccountLayoutContainer)).perform(click())
onView(withId(R.id.createPersonalAccountEmailEditText)).perform(replaceText(VALID_EMAIL))

onView(withId(R.id.createPersonalAccountEmailConfirmationButton)).let {
it.check(matches(isEnabled()))
it.perform(click())
}

onView(withText(R.string.create_personal_account_email_code_title)).check(matches(isDisplayed()))
}

@Test
fun personalEmailScreen_forbiddenEmailFilled_showsError() {
onView(withId(R.id.createPersonalAccountLayoutContainer)).perform(click())
onView(withId(R.id.createPersonalAccountEmailEditText)).perform(replaceText(FORBIDDEN_EMAIL))

onView(withId(R.id.createPersonalAccountEmailConfirmationButton)).perform(click())

//TODO: validate after proper dialog is added
}

@Test
fun personalEmailScreen_conflictEmailFilled_showsError() {
onView(withId(R.id.createPersonalAccountLayoutContainer)).perform(click())
onView(withId(R.id.createPersonalAccountEmailEditText)).perform(replaceText(CONFLICT_EMAIL))

onView(withId(R.id.createPersonalAccountEmailConfirmationButton)).perform(click())

//TODO: validate after proper dialog is added
}

companion object {
private const val VALID_EMAIL = "test@wire.com"
private const val FORBIDDEN_EMAIL = "forbidden@wire.com"
private const val CONFLICT_EMAIL = "conflict@wire.com"
}
}
@@ -0,0 +1,7 @@
package com.wire.android.framework

import org.koin.test.KoinTest
import org.koin.test.mock.MockProviderRule
import org.mockito.Mockito

fun KoinTest.koinMockRule() = MockProviderRule.create { clazz -> Mockito.mock(clazz.java) }
Expand Up @@ -4,7 +4,6 @@ import com.wire.android.core.exception.Failure
import com.wire.android.core.functional.Either
import com.wire.android.feature.auth.activation.ActivationRepository
import com.wire.android.feature.auth.activation.datasource.remote.ActivationRemoteDataSource
import kotlinx.coroutines.delay

class ActivationDataSource(private val activationRemoteDataSource: ActivationRemoteDataSource) : ActivationRepository {

Expand Down
Expand Up @@ -4,6 +4,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import com.wire.android.feature.auth.registration.personal.email.CreatePersonalAccountEmailFragment
import com.wire.android.feature.auth.registration.personal.phone.CreatePersonalAccountPhoneFragment
import java.util.Locale

class CreatePersonalAccountViewPagerAdapter(
Expand All @@ -14,8 +15,8 @@ class CreatePersonalAccountViewPagerAdapter(
override fun getCount(): Int = titles.size

override fun getItem(position: Int): Fragment =
//TODO add phone fragment
CreatePersonalAccountEmailFragment.newInstance()
if (position == PHONE_TAB_POSITION) CreatePersonalAccountPhoneFragment.newInstance()
else CreatePersonalAccountEmailFragment.newInstance()

override fun getPageTitle(position: Int): CharSequence =
titles[position].toUpperCase(Locale.getDefault())
Expand Down
@@ -0,0 +1,10 @@
package com.wire.android.feature.auth.registration.personal.phone

import androidx.fragment.app.Fragment
import com.wire.android.R

class CreatePersonalAccountPhoneFragment : Fragment(R.layout.fragment_create_personal_account_phone) {
companion object {
fun newInstance() = CreatePersonalAccountPhoneFragment()
}
}
4 changes: 2 additions & 2 deletions app/src/main/res/layout/fragment_create_personal_account.xml
Expand Up @@ -14,7 +14,7 @@
app:layout_constraintGuide_percent="0.228" />

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/createPersonalAccountTitleTextView"
android:id="@+id/createPersonalAccountHeaderTextView"
style="@style/TextView.Authentication.Header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Expand All @@ -31,7 +31,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/createPersonalAccountTitleTextView"
app:layout_constraintTop_toBottomOf="@+id/createPersonalAccountHeaderTextView"
app:layout_constraintWidth_percent="@dimen/authentication_view_pager_width_percent">

<com.google.android.material.tabs.TabLayout
Expand Down
Expand Up @@ -17,6 +17,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/create_personal_account_with_email_edit_text_hint"
android:imeOptions="flagNoExtractUi"
android:inputType="textEmailAddress"
android:paddingEnd="@dimen/create_personal_account_text_input_layout_padding_end">

Expand Down
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content">

<!-- TODO inflate views -->
</androidx.constraintlayout.widget.ConstraintLayout>
2 changes: 2 additions & 0 deletions buildSrc/src/main/kotlin/Dependencies.kt
Expand Up @@ -91,6 +91,8 @@ object TestLibraries {
const val uiAutomator = "androidx.test.uiautomator:uiautomator:${Versions.uiAutomator}"
const val coroutinesTest = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${Libraries.Versions.coroutines}"
const val testCore = "androidx.arch.core:core-testing:${Versions.testCore}"
const val koinTest = "org.koin:koin-test:${Libraries.Versions.koin}"

}

object DevLibraries {
Expand Down

0 comments on commit 9e57adf

Please sign in to comment.