Skip to content

Adding baserock generated unit tests #518

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions TestingCodelab/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ android {
buildTypes {
debug {
signingConfig signingConfigs.debug
testCoverageEnabled true
}

release {
Expand Down Expand Up @@ -80,6 +81,11 @@ android {
exclude "META-INF/licenses/**"
exclude "META-INF/AL2.0"
exclude "META-INF/LGPL2.1"
exclude "META-INF/LICENSE.md"
exclude "META-INF/LICENSE"
exclude "META-INF/NOTICE"
exclude "META-INF/*.md"
exclude "META-INF/DEPENDENCIE"
}
}

Expand Down Expand Up @@ -115,4 +121,6 @@ dependencies {
androidTestImplementation "androidx.compose.ui:ui-test"
androidTestImplementation "androidx.compose.ui:ui-test-junit4"
debugImplementation "androidx.compose.ui:ui-test-manifest"

androidTestImplementation("io.mockk:mockk-android:1.13.16")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package com.example.compose.rally

import androidx.compose.ui.test.*
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.espresso.IdlingPolicies
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.util.concurrent.TimeUnit

@RunWith(AndroidJUnit4::class)
class RallyActivityBaseRockGeneratedTest {

@get:Rule
val composeTestRule = createComposeRule()

@Before
fun setUp() {
IdlingPolicies.setIdlingResourceTimeout(3, TimeUnit.SECONDS)
composeTestRule.mainClock.autoAdvance = false
composeTestRule.mainClock.advanceTimeBy(1000)
}

@Test(timeout = 15000)
fun testRallyAppInitialState() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Overview").assertIsSelected()
composeTestRule.onNodeWithContentDescription("Accounts").assertExists()
composeTestRule.onNodeWithContentDescription("Bills").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testRallyAppTabNavigation() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Accounts").performClick()
composeTestRule.onNodeWithContentDescription("Accounts").assertExists()

composeTestRule.onNodeWithContentDescription("Bills").performClick()
composeTestRule.onNodeWithContentDescription("Bills").assertExists()

composeTestRule.onNodeWithContentDescription("Overview").performClick()
composeTestRule.onNodeWithContentDescription("Overview").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testRallyAppOverviewScreen() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Overview").assertIsSelected()
composeTestRule.onNodeWithText("Accounts").assertExists()
composeTestRule.onNodeWithText("Bills").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testRallyAppAccountsScreen() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Accounts").performClick()
composeTestRule.onNodeWithText("Accounts").assertExists()
composeTestRule.onNodeWithContentDescription("Accounts").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testRallyAppBillsScreen() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Bills").performClick()
composeTestRule.onNodeWithText("Bills").assertExists()
composeTestRule.onNodeWithContentDescription("Bills").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testRallyAppTopBarVisibility() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Overview").assertExists()
composeTestRule.onNodeWithContentDescription("Accounts").assertExists()
composeTestRule.onNodeWithContentDescription("Bills").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testRallyAppScreenContentChanges() {
composeTestRule.setContent {
RallyApp()
}

try {
composeTestRule.onNodeWithContentDescription("Overview").assertExists()
composeTestRule.onNodeWithContentDescription("Accounts").performClick()
composeTestRule.onNodeWithContentDescription("Accounts").assertExists()
composeTestRule.onNodeWithContentDescription("Bills").performClick()
composeTestRule.onNodeWithContentDescription("Bills").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

private fun getRootTrees(): String {
val allRootNodes = composeTestRule.onAllNodes(isRoot())
val builder = StringBuilder()
for (i in 0 until allRootNodes.fetchSemanticsNodes().size) {
builder.append("\n")
builder.append("Root Node #$i: \n")
builder.append(allRootNodes[i].printToString())
builder.append("\n")
}
return builder.toString()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package com.example.compose.rally

import androidx.compose.material.MaterialTheme
import androidx.compose.ui.test.*
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.espresso.IdlingPolicies
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.util.concurrent.TimeUnit

@RunWith(AndroidJUnit4::class)
class RallyScreenBaseRockGeneratedTest {

@get:Rule
val composeTestRule = createComposeRule()

@Before
fun setUp() {
IdlingPolicies.setIdlingResourceTimeout(3, TimeUnit.SECONDS)
composeTestRule.mainClock.autoAdvance = false
composeTestRule.mainClock.advanceTimeBy(1000)
}

@Test(timeout = 15000)
fun testOverviewScreenContent() {
composeTestRule.setContent {
MaterialTheme {
RallyScreen.Overview.content {}
}
}

try {
composeTestRule.onNodeWithText("Alerts").assertExists()
composeTestRule.onAllNodesWithText("SEE ALL")[0].assertExists()
composeTestRule.onAllNodesWithText("SEE ALL")[1].assertExists()
composeTestRule.onAllNodesWithText("SEE ALL")[2].assertExists()
composeTestRule.onNodeWithText("Accounts").assertExists()
composeTestRule.onNodeWithText("Bills").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testAccountsScreenContent() {
composeTestRule.setContent {
MaterialTheme {
RallyScreen.Accounts.content {}
}
}

try {
composeTestRule.onNodeWithContentDescription("Checking account ending in 1234, current balance $ 2,215.13").assertExists()
composeTestRule.onNodeWithContentDescription("Home Savings account ending in 5678, current balance $ 8,676.88").assertExists()
composeTestRule.onNodeWithContentDescription("Car Savings account ending in 9012, current balance $ 987.48").assertExists()
composeTestRule.onNodeWithContentDescription("Vacation account ending in 3456, current balance $ 253").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testBillsScreenContent() {
composeTestRule.setContent {
MaterialTheme {
RallyScreen.Bills.content {}
}
}

try {
composeTestRule.onNodeWithContentDescription("RedPay Credit account ending in n 29, current balance –$ 45.36").assertExists()
composeTestRule.onNodeWithContentDescription("Rent account ending in eb 9, current balance –$ 1,200").assertExists()
composeTestRule.onNodeWithContentDescription("TabFine Credit account ending in b 22, current balance –$ 87.33").assertExists()
composeTestRule.onNodeWithContentDescription("ABC Loans account ending in b 29, current balance –$ 400").assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

@Test(timeout = 15000)
fun testScreenIconsExist() {
composeTestRule.setContent {
MaterialTheme {
RallyScreen.entries.forEach { screen ->
screen.icon
}
}
}

try {
composeTestRule.onRoot().assertExists()
} catch (e: AssertionError) {
throw AssertionError(e.message + " Current tree: " + getRootTrees())
}
}

private fun getRootTrees(): String {
val allRootNodes = composeTestRule.onAllNodes(isRoot())
val builder = StringBuilder()
for (i in 0 until allRootNodes.fetchSemanticsNodes().size) {
builder.append("\n")
builder.append("Root Node #$i: \n")
builder.append(allRootNodes[i].printToString())
builder.append("\n")
}
return builder.toString()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.example.compose.rally.ui.components

import androidx.compose.ui.graphics.Color
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.printToString
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.espresso.IdlingPolicies
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.util.concurrent.TimeUnit

@RunWith(AndroidJUnit4::class)
class AnimatedCircleBaseRockGeneratedTest {

@get:Rule
val composeTestRule = createComposeRule()

@Before
fun setUp() {
IdlingPolicies.setIdlingResourceTimeout(3, TimeUnit.SECONDS)
composeTestRule.mainClock.autoAdvance = false
composeTestRule.mainClock.advanceTimeBy(1000)
}

@Test(timeout = 15000)
fun testAnimatedCircleRendersCorrectly() {
val proportions = listOf(0.3f, 0.3f, 0.4f)
val colors = listOf(Color.Red, Color.Green, Color.Blue)

composeTestRule.setContent {
AnimatedCircle(proportions = proportions, colors = colors)
}

try {
composeTestRule.onRoot().assertExists()
} catch (e: AssertionError) {
val tree = composeTestRule.onRoot().printToString()
throw AssertionError(e.message + " Current tree: " + tree)
}
}

@Test(timeout = 15000)
fun testAnimatedCircleWithEmptyProportions() {
val proportions = emptyList<Float>()
val colors = emptyList<Color>()

composeTestRule.setContent {
AnimatedCircle(proportions = proportions, colors = colors)
}

try {
composeTestRule.onRoot().assertExists()
} catch (e: AssertionError) {
val tree = composeTestRule.onRoot().printToString()
throw AssertionError(e.message + " Current tree: " + tree)
}
}

@Test(timeout = 15000)
fun testAnimatedCircleWithSingleProportion() {
val proportions = listOf(1.0f)
val colors = listOf(Color.Red)

composeTestRule.setContent {
AnimatedCircle(proportions = proportions, colors = colors)
}

try {
composeTestRule.onRoot().assertExists()
} catch (e: AssertionError) {
val tree = composeTestRule.onRoot().printToString()
throw AssertionError(e.message + " Current tree: " + tree)
}
}

@Test(timeout = 15000)
fun testAnimatedCircleWithMultipleProportions() {
val proportions = listOf(0.2f, 0.3f, 0.1f, 0.4f)
val colors = listOf(Color.Red, Color.Green, Color.Blue, Color.Yellow)

composeTestRule.setContent {
AnimatedCircle(proportions = proportions, colors = colors)
}

try {
composeTestRule.onRoot().assertExists()
} catch (e: AssertionError) {
val tree = composeTestRule.onRoot().printToString()
throw AssertionError(e.message + " Current tree: " + tree)
}
}
}
Loading