164 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Kotlin
		
	
	
	
	
	
/*
 | 
						|
 * 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<ComponentActivity>()
 | 
						|
 | 
						|
    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)
 | 
						|
    }
 | 
						|
}
 |