From 54155fcf3734319e977dc2fbef375dd900ba572a Mon Sep 17 00:00:00 2001 From: JanFidor Date: Sun, 6 Nov 2022 18:41:44 +0100 Subject: [PATCH] add robot for settings feature ui tests --- .../feature/settings/SettingsDialogRobot.kt | 60 ++++++++++++ .../feature/settings/SettingsDialogTest.kt | 96 ++++++++----------- 2 files changed, 101 insertions(+), 55 deletions(-) create mode 100644 feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogRobot.kt diff --git a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogRobot.kt b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogRobot.kt new file mode 100644 index 000000000..c94f7b29b --- /dev/null +++ b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogRobot.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.feature.settings + +import androidx.activity.ComponentActivity +import androidx.annotation.StringRes +import androidx.compose.ui.test.assertIsSelected +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.compose.ui.test.onNodeWithText +import androidx.test.ext.junit.rules.ActivityScenarioRule + +internal class SettingsDialogRobot( + private val composeTestRule: AndroidComposeTestRule, ComponentActivity> +) { + fun setContent(settingsUiState: SettingsUiState) { + composeTestRule.setContent { + SettingsDialog( + settingsUiState = settingsUiState, + onDismiss = { }, + onChangeThemeBrand = {}, + onChangeDarkThemeConfig = {} + ) + } + } + + fun loadingIndicatorExists() { + composeTestRule + .onNodeWithText(getString(R.string.loading)) + .assertExists() + } + + fun settingExists(name: String) { + composeTestRule + .onNodeWithText(name) + .assertExists() + } + + fun settingIsSelected(name: String) { + composeTestRule + .onNodeWithText(name) + .assertIsSelected() + } + + fun getString(@StringRes stringId: Int) = + composeTestRule.activity.resources.getString(stringId) +} \ No newline at end of file diff --git a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt index 07b6b272c..bf1af77dc 100644 --- a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt +++ b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.feature.settings import androidx.activity.ComponentActivity -import androidx.compose.ui.test.assertIsSelected +import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.compose.ui.test.onNodeWithText +import androidx.test.ext.junit.rules.ActivityScenarioRule import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig.DARK import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand.ANDROID import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading @@ -32,74 +32,60 @@ class SettingsDialogTest { @get:Rule val composeTestRule = createAndroidComposeRule() - private fun getString(id: Int) = composeTestRule.activity.resources.getString(id) - @Test fun whenLoading_showsLoadingText() { - - composeTestRule.setContent { - SettingsDialog( - settingsUiState = Loading, - onDismiss = { }, - onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} - ) + launchSettingsDialogRobot(composeTestRule, Loading) { + loadingIndicatorExists() } - - composeTestRule - .onNodeWithText(getString(R.string.loading)) - .assertExists() } @Test fun whenStateIsSuccess_allSettingsAreDisplayed() { - composeTestRule.setContent { - SettingsDialog( - settingsUiState = Success( - UserEditableSettings( - brand = ANDROID, - darkThemeConfig = DARK - ) - ), - onDismiss = { }, - onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + launchSettingsDialogRobot( + composeTestRule, + Success( + UserEditableSettings( + brand = ANDROID, + darkThemeConfig = DARK + ) ) - } + ) { + settingExists(getString(R.string.brand_default)) + settingExists(getString(R.string.brand_android)) + settingExists(getString(R.string.dark_mode_config_system_default)) - // Check that all the possible settings are displayed. - composeTestRule.onNodeWithText(getString(R.string.brand_default)).assertExists() - composeTestRule.onNodeWithText(getString(R.string.brand_android)).assertExists() - composeTestRule.onNodeWithText( - getString(R.string.dark_mode_config_system_default) - ).assertExists() - composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_light)).assertExists() - composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_dark)).assertExists() + settingExists(getString(R.string.dark_mode_config_light)) + settingExists(getString(R.string.dark_mode_config_dark)) - // Check that the correct settings are selected. - composeTestRule.onNodeWithText(getString(R.string.brand_android)).assertIsSelected() - composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_dark)).assertIsSelected() + settingIsSelected(getString(R.string.brand_android)) + settingIsSelected(getString(R.string.dark_mode_config_dark)) + } } @Test fun whenStateIsSuccess_allLinksAreDisplayed() { - composeTestRule.setContent { - SettingsDialog( - settingsUiState = Success( - UserEditableSettings( - brand = ANDROID, - darkThemeConfig = DARK - ) - ), - onDismiss = { }, - onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + launchSettingsDialogRobot( + composeTestRule, + Success( + UserEditableSettings( + brand = ANDROID, + darkThemeConfig = DARK + ) ) + ) { + settingExists(getString(R.string.privacy_policy)) + settingExists(getString(R.string.licenses)) + settingExists(getString(R.string.brand_guidelines)) + settingExists(getString(R.string.feedback)) } - - composeTestRule.onNodeWithText(getString(R.string.privacy_policy)).assertExists() - composeTestRule.onNodeWithText(getString(R.string.licenses)).assertExists() - composeTestRule.onNodeWithText(getString(R.string.brand_guidelines)).assertExists() - composeTestRule.onNodeWithText(getString(R.string.feedback)).assertExists() } } + +private fun launchSettingsDialogRobot( + composeTestRule: AndroidComposeTestRule, ComponentActivity>, + settingsUiState: SettingsUiState, + func: SettingsDialogRobot.() -> Unit +) = SettingsDialogRobot(composeTestRule).apply { + setContent(settingsUiState) + func() +}