Skip to content

Commit

Permalink
4 - add a navigation dsl and a settings activity to expand on the fir…
Browse files Browse the repository at this point in the history
…st test
  • Loading branch information
plusmobileapps committed Oct 31, 2021
1 parent 34f6d0d commit a6bd764
Show file tree
Hide file tree
Showing 14 changed files with 136 additions and 166 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.plusmobileapps.kotlinopenespresso.extensions

import androidx.test.espresso.ViewInteraction
import com.plusmobileapps.kotlinopenespresso.page.BasePage

/**
* Generic lambda with a receiver for navigation functions that are providing a scoped block
* to the next [com.plusmobileapps.kotlinopenespresso.pages.BasePage]
*/
typealias PageScope <T> = T.() -> Unit

/**
* Will navigate to the selected screen by clicking on the provided [viewInteraction],
* then create a new instance of the screen being navigated to asserting that screen and applying the [block]
*/
inline fun <reified T : BasePage> BasePage.navigateToPageWithClick(
viewInteraction: ViewInteraction,
block: PageScope<T>
): T {
viewInteraction.click()
return T::class.java.newInstance().apply {
assertScreen()
block()
}
}

/**
* Use at the start of a test to create a [PageScope] of the object and assert the screen
*/
inline fun <reified T : BasePage> startOnPage(block: PageScope<T> = {}): T =
T::class.java.newInstance().apply {
assertScreen()
block()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.plusmobileapps.kotlinopenespresso.page

import androidx.test.espresso.ViewInteraction
import com.plusmobileapps.kotlinopenespresso.R
import com.plusmobileapps.kotlinopenespresso.extensions.PageScope
import com.plusmobileapps.kotlinopenespresso.extensions.navigateToPageWithClick
import com.plusmobileapps.kotlinopenespresso.extensions.verifyVisible

class LoggedInPage : BasePage {
Expand All @@ -12,5 +14,9 @@ class LoggedInPage : BasePage {

fun onWelcomeGreeting(): ViewInteraction = R.id.logged_in_greeting.toViewInteraction()
fun onProfileImage(): ViewInteraction = R.id.user_profile_image.toViewInteraction()
fun onSettingsButton(): ViewInteraction = R.id.settings_button.toViewInteraction()

fun goToSettings(block: PageScope<SettingsPage> = {}): SettingsPage =
navigateToPageWithClick(onSettingsButton(), block)

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.plusmobileapps.kotlinopenespresso.page

import androidx.test.espresso.ViewInteraction
import com.plusmobileapps.kotlinopenespresso.R
import com.plusmobileapps.kotlinopenespresso.extensions.PageScope
import com.plusmobileapps.kotlinopenespresso.extensions.navigateToPageWithClick
import com.plusmobileapps.kotlinopenespresso.extensions.verifyVisible

class LoginPage : BasePage {
Expand All @@ -17,4 +19,7 @@ class LoginPage : BasePage {
fun onSignInOrRegisterButton(): ViewInteraction = R.id.login.toViewInteraction()
fun onErrorMessage(): ViewInteraction = R.id.error_message.toViewInteraction()

fun goToLoggedInPage(block: PageScope<LoggedInPage>): LoggedInPage =
navigateToPageWithClick(onSignInOrRegisterButton(), block)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.plusmobileapps.kotlinopenespresso.page

import androidx.test.espresso.ViewInteraction
import com.plusmobileapps.kotlinopenespresso.R
import com.plusmobileapps.kotlinopenespresso.extensions.verifyVisible

class SettingsPage : BasePage {

override fun assertScreen() {
onTitle().verifyVisible()
}

fun onTitle(): ViewInteraction = R.id.settings_title.toViewInteraction()
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package com.plusmobileapps.kotlinopenespresso.test

import androidx.test.core.app.launchActivity
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.plusmobileapps.kotlinopenespresso.R
import com.plusmobileapps.kotlinopenespresso.extensions.click
import com.plusmobileapps.kotlinopenespresso.extensions.startOnPage
import com.plusmobileapps.kotlinopenespresso.extensions.typeText
import com.plusmobileapps.kotlinopenespresso.extensions.verifyText
import com.plusmobileapps.kotlinopenespresso.extensions.verifyTextFieldError
import com.plusmobileapps.kotlinopenespresso.page.LoggedInPage
import com.plusmobileapps.kotlinopenespresso.page.LoginPage
import com.plusmobileapps.kotlinopenespresso.ui.login.LoginActivity
import org.junit.Test
Expand All @@ -21,26 +18,22 @@ class LoginTest {
fun successfulLogin() {
val scenario = launchActivity<LoginActivity>()

LoginPage().apply {
assertScreen()
startOnPage<LoginPage> {
onEmail().typeText("andrew@test.com")
onPassword().typeText("password123")
onSignInOrRegisterButton().click()
}

LoggedInPage().apply {
assertScreen()
}.goToLoggedInPage {
onWelcomeGreeting().verifyText("Welcome Andrew!")
}
}.goToSettings()

scenario.close()

}

@Test
fun tooShortOfPasswordError() {
val scenario = launchActivity<LoginActivity>()

LoginPage().apply {
startOnPage<LoginPage> {
onEmail().typeText("1")
onPassword().typeText("4")
onEmail().typeText("2")
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".ui.settings.SettingsActivity"
android:exported="true"
android:label="@string/settings"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package com.plusmobileapps.kotlinopenespresso.ui.login

import android.app.Activity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import android.content.Intent
import android.os.Bundle
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import com.plusmobileapps.kotlinopenespresso.databinding.ActivityLoginBinding

import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.plusmobileapps.kotlinopenespresso.R
import com.plusmobileapps.kotlinopenespresso.databinding.ActivityLoginBinding
import com.plusmobileapps.kotlinopenespresso.ui.settings.SettingsActivity

class LoginActivity : AppCompatActivity() {

Expand All @@ -36,6 +34,10 @@ class LoginActivity : AppCompatActivity() {
loginViewModel = ViewModelProvider(this, LoginViewModelFactory())
.get(LoginViewModel::class.java)

binding.settingsButton.setOnClickListener {
startActivity(Intent(this, SettingsActivity::class.java))
}

loginViewModel.loginFormState.observe(this@LoginActivity, Observer {
val loginState = it ?: return@Observer

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.plusmobileapps.kotlinopenespresso.ui.settings

import android.os.Bundle
import android.view.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import com.plusmobileapps.kotlinopenespresso.databinding.SettingsBinding

class SettingsActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = SettingsBinding.inflate(LayoutInflater.from(this))
setContentView(binding.root)
}
}
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/ic_settings_black_48dp.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98 0,-0.34 -0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.09,-0.16 -0.26,-0.25 -0.44,-0.25 -0.06,0 -0.12,0.01 -0.17,0.03l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.06,-0.02 -0.12,-0.03 -0.18,-0.03 -0.17,0 -0.34,0.09 -0.43,0.25l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98 0,0.33 0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.09,0.16 0.26,0.25 0.44,0.25 0.06,0 0.12,-0.01 0.17,-0.03l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.06,0.02 0.12,0.03 0.18,0.03 0.17,0 0.34,-0.09 0.43,-0.25l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM17.45,11.27c0.04,0.31 0.05,0.52 0.05,0.73 0,0.21 -0.02,0.43 -0.05,0.73l-0.14,1.13 0.89,0.7 1.08,0.84 -0.7,1.21 -1.27,-0.51 -1.04,-0.42 -0.9,0.68c-0.43,0.32 -0.84,0.56 -1.25,0.73l-1.06,0.43 -0.16,1.13 -0.2,1.35h-1.4l-0.19,-1.35 -0.16,-1.13 -1.06,-0.43c-0.43,-0.18 -0.83,-0.41 -1.23,-0.71l-0.91,-0.7 -1.06,0.43 -1.27,0.51 -0.7,-1.21 1.08,-0.84 0.89,-0.7 -0.14,-1.13c-0.03,-0.31 -0.05,-0.54 -0.05,-0.74s0.02,-0.43 0.05,-0.73l0.14,-1.13 -0.89,-0.7 -1.08,-0.84 0.7,-1.21 1.27,0.51 1.04,0.42 0.9,-0.68c0.43,-0.32 0.84,-0.56 1.25,-0.73l1.06,-0.43 0.16,-1.13 0.2,-1.35h1.39l0.19,1.35 0.16,1.13 1.06,0.43c0.43,0.18 0.83,0.41 1.23,0.71l0.91,0.7 1.06,-0.43 1.27,-0.51 0.7,1.21 -1.07,0.85 -0.89,0.7 0.14,1.13zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"
android:fillColor="#000000"/>
</vector>
69 changes: 0 additions & 69 deletions app/src/main/res/layout-w1240dp/activity_login.xml

This file was deleted.

76 changes: 0 additions & 76 deletions app/src/main/res/layout-w936dp/activity_login.xml

This file was deleted.

11 changes: 11 additions & 0 deletions app/src/main/res/layout/activity_login.xml
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,15 @@
tools:layout_editor_absoluteY="16dp"
tools:visibility="visible" />

<ImageButton
android:id="@+id/settings_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_settings_black_48dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

0 comments on commit a6bd764

Please sign in to comment.