/* * Copyright (C) 2023 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.example.cupcake.test import android.icu.util.Calendar import androidx.activity.ComponentActivity import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.navigation.compose.ComposeNavigator import androidx.navigation.testing.TestNavHostController import com.example.cupcake.CupcakeApp import com.example.cupcake.CupcakeScreen import com.example.cupcake.R import org.junit.Before import org.junit.Rule import org.junit.Test import java.text.SimpleDateFormat import java.util.Locale class CupcakeScreenNavigationTest { /** * Note: To access to an empty activity, the code uses ComponentActivity instead of * MainActivity. */ @get:Rule val composeTestRule = createAndroidComposeRule() private lateinit var navController: TestNavHostController @Before fun setupCupcakeNavHost() { composeTestRule.setContent { navController = TestNavHostController(LocalContext.current).apply { navigatorProvider.addNavigator(ComposeNavigator()) } CupcakeApp(navController = navController) } } @Test fun cupcakeNavHost_verifyStartDestination() { navController.assertCurrentRouteName(CupcakeScreen.Start.name) } @Test fun cupcakeNavHost_verifyBackNavigationNotShownOnStartOrderScreen() { val backText = composeTestRule.activity.getString(R.string.back_button) composeTestRule.onNodeWithContentDescription(backText).assertDoesNotExist() } @Test fun cupcakeNavHost_clickOneCupcake_navigatesToSelectFlavorScreen() { composeTestRule.onNodeWithStringId(R.string.one_cupcake) .performClick() navController.assertCurrentRouteName(CupcakeScreen.Flavor.name) } @Test fun cupcakeNavHost_clickNextOnFlavorScreen_navigatesToPickupScreen() { navigateToFlavorScreen() composeTestRule.onNodeWithStringId(R.string.next) .performClick() navController.assertCurrentRouteName(CupcakeScreen.Pickup.name) } @Test fun cupcakeNavHost_clickBackOnFlavorScreen_navigatesToStartOrderScreen() { navigateToFlavorScreen() performNavigateUp() navController.assertCurrentRouteName(CupcakeScreen.Start.name) } @Test fun cupcakeNavHost_clickCancelOnFlavorScreen_navigatesToStartOrderScreen() { navigateToFlavorScreen() composeTestRule.onNodeWithStringId(R.string.cancel) .performClick() navController.assertCurrentRouteName(CupcakeScreen.Start.name) } @Test fun cupcakeNavHost_clickNextOnPickupScreen_navigatesToSummaryScreen() { navigateToPickupScreen() composeTestRule.onNodeWithText(getFormattedDate()) .performClick() composeTestRule.onNodeWithStringId(R.string.next) .performClick() navController.assertCurrentRouteName(CupcakeScreen.Summary.name) } @Test fun cupcakeNavHost_clickBackOnPickupScreen_navigatesToFlavorScreen() { navigateToPickupScreen() performNavigateUp() navController.assertCurrentRouteName(CupcakeScreen.Flavor.name) } @Test fun cupcakeNavHost_clickCancelOnPickupScreen_navigatesToStartOrderScreen() { navigateToPickupScreen() composeTestRule.onNodeWithStringId(R.string.cancel) .performClick() navController.assertCurrentRouteName(CupcakeScreen.Start.name) } @Test fun cupcakeNavHost_clickCancelOnSummaryScreen_navigatesToStartOrderScreen() { navigateToSummaryScreen() composeTestRule.onNodeWithStringId(R.string.cancel) .performClick() navController.assertCurrentRouteName(CupcakeScreen.Start.name) } private fun navigateToFlavorScreen() { composeTestRule.onNodeWithStringId(R.string.one_cupcake) .performClick() composeTestRule.onNodeWithStringId(R.string.chocolate) .performClick() } private fun navigateToPickupScreen() { navigateToFlavorScreen() composeTestRule.onNodeWithStringId(R.string.next) .performClick() } private fun navigateToSummaryScreen() { navigateToPickupScreen() composeTestRule.onNodeWithText(getFormattedDate()) .performClick() composeTestRule.onNodeWithStringId(R.string.next) .performClick() } private fun performNavigateUp() { val backText = composeTestRule.activity.getString(R.string.back_button) composeTestRule.onNodeWithContentDescription(backText).performClick() } private fun getFormattedDate(): String { val calendar = Calendar.getInstance() calendar.add(java.util.Calendar.DATE, 1) val formatter = SimpleDateFormat("E MMM d", Locale.getDefault()) return formatter.format(calendar.time) } }