From 7fbaae1342a4a1bf5f0cdc0d8e919189d64a95d4 Mon Sep 17 00:00:00 2001 From: JanFidor Date: Sun, 6 Nov 2022 18:39:22 +0100 Subject: [PATCH] add robot for bookmarks feature ui tests --- .../feature/bookmarks/BookmarksRobot.kt | 102 +++++++++++++++ .../feature/bookmarks/BookmarksScreenTest.kt | 123 +++++------------- 2 files changed, 135 insertions(+), 90 deletions(-) create mode 100644 feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksRobot.kt diff --git a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksRobot.kt b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksRobot.kt new file mode 100644 index 000000000..ce1a0c952 --- /dev/null +++ b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksRobot.kt @@ -0,0 +1,102 @@ +/* + * 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.bookmarks + +import androidx.activity.ComponentActivity +import androidx.compose.ui.test.assertCountEquals +import androidx.compose.ui.test.assertHasClickAction +import androidx.compose.ui.test.filter +import androidx.compose.ui.test.hasAnyAncestor +import androidx.compose.ui.test.hasScrollToNodeAction +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.compose.ui.test.onAllNodesWithContentDescription +import androidx.compose.ui.test.onFirst +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollToNode +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.google.samples.apps.nowinandroid.core.model.data.NewsResource +import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState + +internal class BookmarksRobot( + private val composeTestRule: AndroidComposeTestRule, ComponentActivity> +) { + private val removedBookmarks = mutableSetOf() + + fun setContent(newsFeedUiState: NewsFeedUiState) { + composeTestRule.setContent { + BookmarksScreen( + feedState = newsFeedUiState, + removeFromBookmarks = { + removedBookmarks.add(it) + } + ) + } + } + + fun loadingIndicatorShown() { + composeTestRule + .onNodeWithContentDescription( + composeTestRule.activity.resources.getString(R.string.saved_loading) + ) + .assertExists() + } + + fun clickableNewsResourceExists(newsResource: NewsResource) { + composeTestRule + .onNodeWithText( + newsResource.title, + substring = true + ) + .assertExists() + .assertHasClickAction() + } + + fun scrollToNewsResource(newsResource: NewsResource) { + composeTestRule.onNode(hasScrollToNodeAction()) + .performScrollToNode( + hasText( + newsResource.title, + substring = true + ) + ) + } + + fun clickNewsResourceBookmark(newsResource: NewsResource) { + composeTestRule + .onAllNodesWithContentDescription( + composeTestRule.activity.getString( + com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark + ) + ).filter( + hasAnyAncestor( + hasText( + newsResource.title, + substring = true + ) + ) + ) + .assertCountEquals(1) + .onFirst() + .performClick() + } + + fun removedNewsResourceBookmark(newsResource: NewsResource) = + removedBookmarks.contains(newsResource.id) +} \ No newline at end of file diff --git a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt index f018be8c0..81332f98d 100644 --- a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt +++ b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt @@ -17,25 +17,12 @@ package com.google.samples.apps.nowinandroid.feature.bookmarks import androidx.activity.ComponentActivity -import androidx.compose.material3.windowsizeclass.WindowSizeClass -import androidx.compose.ui.test.assertCountEquals -import androidx.compose.ui.test.assertHasClickAction -import androidx.compose.ui.test.filter -import androidx.compose.ui.test.hasAnyAncestor -import androidx.compose.ui.test.hasScrollToNodeAction -import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule -import androidx.compose.ui.test.onAllNodesWithContentDescription -import androidx.compose.ui.test.onFirst -import androidx.compose.ui.test.onNodeWithContentDescription -import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performClick -import androidx.compose.ui.test.performScrollToNode +import androidx.test.ext.junit.rules.ActivityScenarioRule import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.model.data.previewNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import org.junit.Assert.assertEquals -import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test @@ -49,93 +36,49 @@ class BookmarksScreenTest { @Test fun loading_showsLoadingSpinner() { - composeTestRule.setContent { - BookmarksScreen( - feedState = NewsFeedUiState.Loading, - removeFromBookmarks = { } - ) + launchBookmarksRobot( + composeTestRule, + NewsFeedUiState.Loading + ) { + loadingIndicatorShown() } - - composeTestRule - .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.saved_loading) - ) - .assertExists() } @Test fun feed_whenHasBookmarks_showsBookmarks() { - lateinit var windowSizeClass: WindowSizeClass - - composeTestRule.setContent { - BookmarksScreen( - feedState = NewsFeedUiState.Success( - previewNewsResources.take(2) - .map { SaveableNewsResource(it, true) } - ), - removeFromBookmarks = { } + launchBookmarksRobot( + composeTestRule, + NewsFeedUiState.Success( + previewNewsResources.take(2) + .map { SaveableNewsResource(it, true) } ) + ) { + clickNewsResourceBookmark(previewNewsResources[0]) + scrollToNewsResource(previewNewsResources[1]) + clickableNewsResourceExists(previewNewsResources[1]) } - - composeTestRule - .onNodeWithText( - previewNewsResources[0].title, - substring = true - ) - .assertExists() - .assertHasClickAction() - - composeTestRule.onNode(hasScrollToNodeAction()) - .performScrollToNode( - hasText( - previewNewsResources[1].title, - substring = true - ) - ) - - composeTestRule - .onNodeWithText( - previewNewsResources[1].title, - substring = true - ) - .assertExists() - .assertHasClickAction() } @Test fun feed_whenRemovingBookmark_removesBookmark() { - var removeFromBookmarksCalled = false - - composeTestRule.setContent { - BookmarksScreen( - feedState = NewsFeedUiState.Success( - previewNewsResources.take(2) - .map { SaveableNewsResource(it, true) } - ), - removeFromBookmarks = { newsResourceId -> - assertEquals(previewNewsResources[0].id, newsResourceId) - removeFromBookmarksCalled = true - } + launchBookmarksRobot( + composeTestRule, + NewsFeedUiState.Success( + previewNewsResources.take(2) + .map { SaveableNewsResource(it, true) } ) + ) { + clickNewsResourceBookmark(previewNewsResources[0]) + removedNewsResourceBookmark(previewNewsResources[0]) } - - composeTestRule - .onAllNodesWithContentDescription( - composeTestRule.activity.getString( - com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark - ) - ).filter( - hasAnyAncestor( - hasText( - previewNewsResources[0].title, - substring = true - ) - ) - ) - .assertCountEquals(1) - .onFirst() - .performClick() - - assertTrue(removeFromBookmarksCalled) } } + +private fun launchBookmarksRobot( + composeTestRule: AndroidComposeTestRule, ComponentActivity>, + newsFeedUiState: NewsFeedUiState, + func: BookmarksRobot.() -> Unit +) = BookmarksRobot(composeTestRule).apply { + setContent(newsFeedUiState) + func() +}