add robot for topic feature ui tests

pull/402/head
JanFidor 3 years ago
parent 54155fcf37
commit 9045b06c02

@ -0,0 +1,70 @@
/*
* 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.topic
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.hasScrollToNodeAction
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.onFirst
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performScrollToNode
import androidx.test.ext.junit.rules.ActivityScenarioRule
import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic
import com.google.samples.apps.nowinandroid.core.model.data.NewsResource
internal class TopicRobot(
private val composeTestRule: AndroidComposeTestRule<ActivityScenarioRule<ComponentActivity>, ComponentActivity>
) {
private val topicLoading = composeTestRule.activity.resources.getString(R.string.topic_loading)
fun setContent(topicUiState: TopicUiState, newsUiState: NewsUiState) {
composeTestRule.setContent {
TopicScreen(
topicUiState = topicUiState,
newsUiState = newsUiState,
onBackClick = { },
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
)
}
}
fun loadingIndicatorExists() {
composeTestRule
.onNodeWithContentDescription(topicLoading)
.assertExists()
}
fun topicExists(topic: FollowableTopic) {
composeTestRule
.onNodeWithText(topic.topic.name)
.assertExists()
composeTestRule
.onNodeWithText(topic.topic.longDescription)
.assertExists()
}
fun scrollToNewsResource(newsResource: NewsResource) {
composeTestRule
.onAllNodes(hasScrollToNodeAction())
.onFirst()
.performScrollToNode(hasText(newsResource.title))
}
}

@ -17,20 +17,15 @@
package com.google.samples.apps.nowinandroid.feature.topic package com.google.samples.apps.nowinandroid.feature.topic
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.ui.test.hasScrollToNodeAction import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onFirst import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performScrollToNode
import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic
import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource import com.google.samples.apps.nowinandroid.core.domain.model.SaveableNewsResource
import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResource
import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video
import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.model.data.Topic
import kotlinx.datetime.Instant import kotlinx.datetime.Instant
import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
@ -44,109 +39,79 @@ class TopicScreenTest {
@get:Rule @get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>() val composeTestRule = createAndroidComposeRule<ComponentActivity>()
private lateinit var topicLoading: String
@Before
fun setup() {
composeTestRule.activity.apply {
topicLoading = getString(R.string.topic_loading)
}
}
@Test @Test
fun niaLoadingWheel_whenScreenIsLoading_showLoading() { fun niaLoadingWheel_whenScreenIsLoading_showLoading() {
composeTestRule.setContent { launchTopicRobot(
TopicScreen( composeTestRule,
topicUiState = TopicUiState.Loading, TopicUiState.Loading,
newsUiState = NewsUiState.Loading, NewsUiState.Loading
onBackClick = { }, ) {
onFollowClick = { }, loadingIndicatorExists()
onBookmarkChanged = { _, _ -> },
)
} }
composeTestRule
.onNodeWithContentDescription(topicLoading)
.assertExists()
} }
@Test @Test
fun topicTitle_whenTopicIsSuccess_isShown() { fun topicTitle_whenTopicIsSuccess_isShown() {
val testTopic = testTopics.first() val testTopic = testTopics.first()
composeTestRule.setContent {
TopicScreen(
topicUiState = TopicUiState.Success(testTopic),
newsUiState = NewsUiState.Loading,
onBackClick = { },
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
)
}
// Name is shown
composeTestRule
.onNodeWithText(testTopic.topic.name)
.assertExists()
// Description is shown launchTopicRobot(
composeTestRule composeTestRule,
.onNodeWithText(testTopic.topic.longDescription) TopicUiState.Success(testTopic),
.assertExists() NewsUiState.Loading
) {
topicExists(testTopic)
}
} }
@Test @Test
fun news_whenTopicIsLoading_isNotShown() { fun news_whenTopicIsLoading_isNotShown() {
composeTestRule.setContent { launchTopicRobot(
TopicScreen( composeTestRule,
topicUiState = TopicUiState.Loading, TopicUiState.Loading,
newsUiState = NewsUiState.Success( NewsUiState.Success(
sampleNewsResources.mapIndexed { index, newsResource -> sampleNewsResources.mapIndexed { index, newsResource ->
SaveableNewsResource( SaveableNewsResource(
newsResource = newsResource, newsResource = newsResource,
isSaved = index % 2 == 0, isSaved = index % 2 == 0,
) )
} }
),
onBackClick = { },
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
) )
) {
loadingIndicatorExists()
} }
// Loading indicator shown
composeTestRule
.onNodeWithContentDescription(topicLoading)
.assertExists()
} }
@Test @Test
fun news_whenSuccessAndTopicIsSuccess_isShown() { fun news_whenSuccessAndTopicIsSuccess_isShown() {
val testTopic = testTopics.first() val testTopic = testTopics.first()
composeTestRule.setContent { launchTopicRobot(
TopicScreen( composeTestRule,
topicUiState = TopicUiState.Success(testTopic), TopicUiState.Success(testTopic),
newsUiState = NewsUiState.Success( NewsUiState.Success(
sampleNewsResources.mapIndexed { index, newsResource -> sampleNewsResources.mapIndexed { index, newsResource ->
SaveableNewsResource( SaveableNewsResource(
newsResource = newsResource, newsResource = newsResource,
isSaved = index % 2 == 0, isSaved = index % 2 == 0,
) )
} }
),
onBackClick = { },
onFollowClick = { },
onBookmarkChanged = { _, _ -> },
) )
} ) {
// Scroll to first news title if available // Scroll to first news title if available
composeTestRule scrollToNewsResource(sampleNewsResources.first())
.onAllNodes(hasScrollToNodeAction()) }
.onFirst()
.performScrollToNode(hasText(sampleNewsResources.first().title))
} }
} }
private fun launchTopicRobot(
composeTestRule: AndroidComposeTestRule<ActivityScenarioRule<ComponentActivity>, ComponentActivity>,
topicUiState: TopicUiState,
newsUiState: NewsUiState,
func: TopicRobot.() -> Unit
) = TopicRobot(composeTestRule).apply {
setContent(topicUiState, newsUiState)
func()
}
private const val TOPIC_1_NAME = "Headlines" private const val TOPIC_1_NAME = "Headlines"
private const val TOPIC_2_NAME = "UI" private const val TOPIC_2_NAME = "UI"
private const val TOPIC_3_NAME = "Tools" private const val TOPIC_3_NAME = "Tools"

Loading…
Cancel
Save