Skip to content

Commit

Permalink
test: add UI tests for BottomNavigationMenu
Browse files Browse the repository at this point in the history
  • Loading branch information
francelu committed Oct 13, 2024
1 parent fd4579c commit 58bbb5b
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.android.periodpals.ui.navigation

import android.annotation.SuppressLint
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertIsNotSelected
import androidx.compose.ui.test.assertIsSelected
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import org.junit.Rule
import org.junit.Test

class BottomNavigationMenuTest {

@get:Rule val composeTestRule = createComposeRule()

@Test
fun bottomNavigationMenu_displaysAllTabs() {
composeTestRule.setContent {
BottomNavigationMenu(
onTabSelect = {}, tabList = LIST_TOP_LEVEL_DESTINATION, selectedItem = "Map")
}

composeTestRule.onNodeWithTag("bottomNavigationMenu").assertIsDisplayed()
LIST_TOP_LEVEL_DESTINATION.forEach { tab ->
composeTestRule.onNodeWithTag(tab.textId).assertIsDisplayed()
}
}

@SuppressLint("UnrememberedMutableState")
@Test
fun bottomNavigationMenu_clickOnTab_changesSelection() {
var selectedTab by mutableStateOf(Route.MAP) // Initially selected tab is "MAP"

// Set the composable content with an initial selected tab
composeTestRule.setContent {
BottomNavigationMenu(
onTabSelect = { selectedTab = it.route },
tabList = LIST_TOP_LEVEL_DESTINATION,
selectedItem = selectedTab)
}

// Initially, verify that "MAP" is selected
composeTestRule.onNodeWithTag("Map").assertIsSelected()

// Perform a click on the "Alert" tab
composeTestRule.onNodeWithTag("Alert").performClick()

// Now check that the "Alert" tab is selected
composeTestRule.onNodeWithTag("Alert").assertIsSelected()

// Optionally, check that the previously selected "Map" tab is no longer selected
composeTestRule.onNodeWithTag("Map").assertIsNotSelected()
}

@Test
fun bottomNavigationMenu_iconAndLabelAreDisplayedCorrectly() {
composeTestRule.setContent {
BottomNavigationMenu(
onTabSelect = {}, tabList = LIST_TOP_LEVEL_DESTINATION, selectedItem = "Profile")
}

LIST_TOP_LEVEL_DESTINATION.forEach { tab ->
composeTestRule.onNodeWithTag(tab.textId).assertIsDisplayed()
composeTestRule.onNodeWithTag(tab.textId).assertIsDisplayed()
}
}

@Test
fun bottomNavigationMenu_initialSelectionIsCorrect() {
composeTestRule.setContent {
BottomNavigationMenu(
onTabSelect = {}, tabList = LIST_TOP_LEVEL_DESTINATION, selectedItem = "Timer")
}

composeTestRule.onNodeWithTag("Timer").assertIsSelected()
}

@Test
fun bottomNavigationMenu_selectingSameTabDoesNotCrash() {
var selectedTab = Route.ALERT_LIST

composeTestRule.setContent {
BottomNavigationMenu(
onTabSelect = { selectedTab = it.route },
tabList = LIST_TOP_LEVEL_DESTINATION,
selectedItem = selectedTab)
}

composeTestRule.onNodeWithTag("Alert List").performClick()
composeTestRule.onNodeWithTag("Alert List").assertIsSelected()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import androidx.navigation.NavHostController
object Route {
const val AUTH = "Auth"
const val ALERT = "Alert"
const val ALERT_LIST = "AlertList"
const val ALERT_LIST = "Alert List"
const val MAP = "Map"
const val TIMER = "Timer"
const val PROFILE = "Profile"
Expand Down

0 comments on commit 58bbb5b

Please sign in to comment.