Skip to content

Commit

Permalink
Add screenshot tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Aniokrait committed Sep 17, 2023
1 parent 91d88e3 commit 813b64f
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ data class AchievementAnimation(
val notHasDrawableResId: Int,
val hasAchievement: Boolean = false,
val contentDescription: String,
val testTag: String,
) {
fun getDrawableResId() = if (hasAchievement) hasDrawableResId else notHasDrawableResId
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
package io.github.droidkaigi.confsched2023.testing.robot

import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.isRoot
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.onFirst
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTouchInput
import androidx.compose.ui.test.swipeUp
import com.github.takahirom.roborazzi.captureRoboImage
import io.github.droidkaigi.confsched2023.achievements.AchievementsScreen
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageATestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageBTestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageCTestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageDTestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageETestTag
import io.github.droidkaigi.confsched2023.data.achievements.AchievementsDataStore
import io.github.droidkaigi.confsched2023.designsystem.theme.KaigiTheme
import io.github.droidkaigi.confsched2023.model.Achievement
import io.github.droidkaigi.confsched2023.testing.RobotTestRule
import io.github.droidkaigi.confsched2023.testing.coroutines.runTestWithLogging
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.runTest
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds

Expand All @@ -19,6 +29,9 @@ class AchievementsScreenRobot @Inject constructor(
) {
@Inject lateinit var robotTestRule: RobotTestRule
private lateinit var composeTestRule: AndroidComposeTestRule<*, *>

@Inject lateinit var achievementsDataStore: AchievementsDataStore

operator fun invoke(
block: AchievementsScreenRobot.() -> Unit,
) {
Expand Down Expand Up @@ -49,6 +62,35 @@ class AchievementsScreenRobot @Inject constructor(
}
}

fun setupSavedAchievement(achievement: Achievement) = runTest(testDispatcher) {
achievementsDataStore.saveAchievements(achievement)
}

fun clickAchievementImageA() {
composeTestRule.onNode(hasTestTag(AchievementImageATestTag))
.performClick()
}

fun clickAchievementImageB() {
composeTestRule.onNode(hasTestTag(AchievementImageBTestTag))
.performClick()
}

fun clickAchievementImageC() {
composeTestRule.onNode(hasTestTag(AchievementImageCTestTag))
.performClick()
}

fun clickAchievementImageD() {
composeTestRule.onNode(hasTestTag(AchievementImageDTestTag))
.performClick()
}

fun clickAchievementImageE() {
composeTestRule.onNode(hasTestTag(AchievementImageETestTag))
.performClick()
}

fun checkScreenCapture() {
composeTestRule
.onAllNodes(isRoot())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ package io.github.droidkaigi.confsched2023.achievements
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageATestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageBTestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageCTestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageDTestTag
import io.github.droidkaigi.confsched2023.achievements.component.AchievementImageETestTag
import io.github.droidkaigi.confsched2023.achievements.section.AchievementListUiState
import io.github.droidkaigi.confsched2023.data.contributors.AchievementRepository
import io.github.droidkaigi.confsched2023.designsystem.strings.AppStrings
Expand Down Expand Up @@ -86,34 +91,39 @@ class AchievementsScreenViewModel @Inject constructor(
notHasDrawableResId = R.drawable.img_achievement_a_off,
hasAchievement = achievements.contains(Achievement.ArcticFox),
contentDescription = "AchievementA image",
testTag = AchievementImageATestTag,
),
AchievementAnimation(
achievement = Achievement.Bumblebee,
hasDrawableResId = R.drawable.img_achievement_b_on,
notHasDrawableResId = R.drawable.img_achievement_b_off,
hasAchievement = achievements.contains(Achievement.Bumblebee),
contentDescription = "AchievementB image",
testTag = AchievementImageBTestTag,
),
AchievementAnimation(
achievement = Achievement.Chipmunk,
hasDrawableResId = R.drawable.img_achievement_c_on,
notHasDrawableResId = R.drawable.img_achievement_c_off,
hasAchievement = achievements.contains(Achievement.Chipmunk),
contentDescription = "AchievementC image",
testTag = AchievementImageCTestTag,
),
AchievementAnimation(
achievement = Achievement.Dolphin,
hasDrawableResId = R.drawable.img_achievement_d_on,
notHasDrawableResId = R.drawable.img_achievement_d_off,
hasAchievement = achievements.contains(Achievement.Dolphin),
contentDescription = "AchievementD image",
testTag = AchievementImageDTestTag,
),
AchievementAnimation(
achievement = Achievement.ElectricEel,
hasDrawableResId = R.drawable.img_achievement_e_on,
notHasDrawableResId = R.drawable.img_achievement_e_off,
hasAchievement = achievements.contains(Achievement.ElectricEel),
contentDescription = "AchievementE image",
testTag = AchievementImageETestTag,
),
),
detailDescription = detailDescription,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.compose.LottieCompositionSpec.RawRes
import com.airbnb.lottie.compose.animateLottieCompositionAsState
import com.airbnb.lottie.compose.rememberLottieComposition
import io.github.droidkaigi.confsched2023.ui.isTest

@Composable
fun AchievementHighlightAnimation(
Expand All @@ -18,7 +19,7 @@ fun AchievementHighlightAnimation(
isPlaying = true,
restartOnPlay = true,
)
if (progress == 1f) {
if (progress == 1f && !isTest()) {
onAnimationFinish()
}
LottieAnimation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,18 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import io.github.droidkaigi.confsched2023.model.Achievement
import io.github.droidkaigi.confsched2023.model.AchievementAnimation

const val AchievementImageATestTag = "AchievementImageATestTag"
const val AchievementImageBTestTag = "AchievementImageBTestTag"
const val AchievementImageCTestTag = "AchievementImageCTestTag"
const val AchievementImageDTestTag = "AchievementImageDTestTag"
const val AchievementImageETestTag = "AchievementImageETestTag"

@Composable
fun AchievementImage(
achievementAnimation: AchievementAnimation,
Expand All @@ -24,6 +31,7 @@ fun AchievementImage(
contentDescription = achievementAnimation.contentDescription,
modifier = modifier
.padding(horizontal = 21.dp)
.testTag(achievementAnimation.testTag)
.then(
if (achievementAnimation.hasAchievement) {
Modifier.clickable(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
package io.github.droidkaigi.confsched2023.achievements

import androidx.test.ext.junit.runners.AndroidJUnit4
import com.airbnb.lottie.LottieTask
import com.github.takahirom.roborazzi.RobolectricDeviceQualifiers
import dagger.hilt.android.testing.BindValue
import dagger.hilt.android.testing.HiltAndroidTest
import io.github.droidkaigi.confsched2023.model.Achievement.ArcticFox
import io.github.droidkaigi.confsched2023.model.Achievement.Bumblebee
import io.github.droidkaigi.confsched2023.model.Achievement.Chipmunk
import io.github.droidkaigi.confsched2023.model.Achievement.Dolphin
import io.github.droidkaigi.confsched2023.model.Achievement.ElectricEel
import io.github.droidkaigi.confsched2023.testing.HiltTestActivity
import io.github.droidkaigi.confsched2023.testing.RobotTestRule
import io.github.droidkaigi.confsched2023.testing.category.ScreenshotTests
import io.github.droidkaigi.confsched2023.testing.robot.AchievementsScreenRobot
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.experimental.categories.Category
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
import org.robolectric.annotation.GraphicsMode
import java.util.concurrent.Executor
import javax.inject.Inject

@RunWith(AndroidJUnit4::class)
Expand All @@ -30,6 +38,11 @@ class AchievementsScreenTest {
@Inject
lateinit var achievementsScreenRobot: AchievementsScreenRobot

@Before
fun setup() {
LottieTask.EXECUTOR = Executor(Runnable::run)
}

@Test
@Category(ScreenshotTests::class)
fun checkLaunchShot() {
Expand All @@ -40,4 +53,59 @@ class AchievementsScreenTest {
checkScreenCapture()
}
}

@Test
@Category(ScreenshotTests::class)
fun checkHighlightImageA() {
achievementsScreenRobot {
setupSavedAchievement(ArcticFox)
setupScreenContent()
clickAchievementImageA()
checkScreenCapture()
}
}

@Test
@Category(ScreenshotTests::class)
fun checkHighlightImageB() {
achievementsScreenRobot {
setupSavedAchievement(Bumblebee)
setupScreenContent()
clickAchievementImageB()
checkScreenCapture()
}
}

@Test
@Category(ScreenshotTests::class)
fun checkHighlightImageC() {
achievementsScreenRobot {
setupSavedAchievement(Chipmunk)
setupScreenContent()
clickAchievementImageC()
checkScreenCapture()
}
}

@Test
@Category(ScreenshotTests::class)
fun checkHighlightImageD() {
achievementsScreenRobot {
setupSavedAchievement(Dolphin)
setupScreenContent()
clickAchievementImageD()
checkScreenCapture()
}
}

@Test
@Category(ScreenshotTests::class)
fun checkHighlightImageE() {
achievementsScreenRobot {
setupSavedAchievement(ElectricEel)
setupScreenContent()
clickAchievementImageE()
checkScreenCapture()
}
}
}

0 comments on commit 813b64f

Please sign in to comment.