diff --git a/app/src/androidTest/java/com/afternote/afternote_fe/AppAndReceiverCompletionAndroidTest.kt b/app/src/androidTest/java/com/afternote/afternote_fe/AppAndReceiverCompletionAndroidTest.kt index c4431df645..6e3242f21f 100644 --- a/app/src/androidTest/java/com/afternote/afternote_fe/AppAndReceiverCompletionAndroidTest.kt +++ b/app/src/androidTest/java/com/afternote/afternote_fe/AppAndReceiverCompletionAndroidTest.kt @@ -102,7 +102,6 @@ import com.afternote.feature.receiver.presentation.R as ReceiverR /** 이 테스트의 관심 밖인 외부 라우팅을 채우는 no-op 묶음. */ private val noopActions = ReceiverHomeActions( - onSettingClick = {}, onNavigateToMindRecord = {}, onNavigateToTimeLetter = {}, onNavigateToAfternote = {}, diff --git a/app/src/main/java/com/afternote/afternote_fe/navigation/AppNavigationActions.kt b/app/src/main/java/com/afternote/afternote_fe/navigation/AppNavigationActions.kt index 9d66666006..ff045e09c7 100644 --- a/app/src/main/java/com/afternote/afternote_fe/navigation/AppNavigationActions.kt +++ b/app/src/main/java/com/afternote/afternote_fe/navigation/AppNavigationActions.kt @@ -627,7 +627,6 @@ fun rememberReceiverNavActions(appState: AppState): ReceiverNavActions = fun rememberReceiverHomeActions(appState: AppState): ReceiverHomeActions = remember(appState) { ReceiverHomeActions( - onSettingClick = { appState.navController.navigate(Route.Setting) }, onNavigateToMindRecord = { appState.navController.navigate(Route.ReceiverMindRecord) }, onNavigateToTimeLetter = { appState.navController.navigate(Route.TimeLetter) }, onNavigateToAfternote = { diff --git a/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeActions.kt b/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeActions.kt index 3ff50f34c3..2c3b63f735 100644 --- a/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeActions.kt +++ b/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeActions.kt @@ -6,7 +6,6 @@ package com.afternote.feature.receiver.presentation.home * 데이터 로드/다운로드는 ViewModel이 관할하고, 외부 화면 이동만 호출 측이 채운다. */ data class ReceiverHomeActions( - val onSettingClick: () -> Unit, val onNavigateToMindRecord: () -> Unit, val onNavigateToTimeLetter: () -> Unit, val onNavigateToAfternote: () -> Unit, diff --git a/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreen.kt b/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreen.kt index 9b184faa75..6f47593dbd 100644 --- a/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreen.kt +++ b/feature/receiver/presentation/src/main/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreen.kt @@ -56,9 +56,15 @@ fun ReceiverHomeScreen( modifier = modifier, containerColor = Color.Transparent, topBar = { + // 수신자에게 유효한 헤더 액션이 없다 — 둘 다 그리지 않는다 (#613). + // + // 프로필 아이콘은 목적지가 없는 장식이었고, 톱니는 **회원 설정 화면**을 그대로 열었다. + // 수신자는 로그인한 적이 없는 사용자(`X-Auth-Code` 기반)라 그 화면의 유일한 항목인 + // 「로그아웃」에 지울 세션이 없다. 수신자용 설정 계약이 생기기 전까지 새 화면이나 + // 가짜 로그아웃을 지어내지 않고 진입점을 내린다(#613 디자인 게이트 해제). HomeTopBar( showProfileIcon = false, - onSettingClick = actions.onSettingClick, + onSettingClick = null, ) }, snackbarHost = { SnackbarHost(snackbarHostState) }, diff --git a/feature/receiver/presentation/src/screenshotTest/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTest.kt b/feature/receiver/presentation/src/screenshotTest/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTest.kt index cdfa46db39..d8b2e702c9 100644 --- a/feature/receiver/presentation/src/screenshotTest/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTest.kt +++ b/feature/receiver/presentation/src/screenshotTest/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTest.kt @@ -12,7 +12,6 @@ import com.android.tools.screenshot.PreviewTest /** baseline 은 화면 픽셀만 본다 — 외부 라우팅은 눌리지 않으므로 빈 액션으로 채운다. */ private val noopActions = ReceiverHomeActions( - onSettingClick = {}, onNavigateToMindRecord = {}, onNavigateToTimeLetter = {}, onNavigateToAfternote = {}, diff --git a/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenLoadingScreenshot_748aa731_0.png b/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenLoadingScreenshot_748aa731_0.png index aa0f83477f..43613bdfb7 100644 Binary files a/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenLoadingScreenshot_748aa731_0.png and b/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenLoadingScreenshot_748aa731_0.png differ diff --git a/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenPartialFailureScreenshot_748aa731_0.png b/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenPartialFailureScreenshot_748aa731_0.png index 919e55998f..417f7ceaac 100644 Binary files a/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenPartialFailureScreenshot_748aa731_0.png and b/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenPartialFailureScreenshot_748aa731_0.png differ diff --git a/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenSuccessScreenshot_748aa731_0.png b/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenSuccessScreenshot_748aa731_0.png index 980271244c..a307eaf42c 100644 Binary files a/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenSuccessScreenshot_748aa731_0.png and b/feature/receiver/presentation/src/screenshotTestDebug/reference/com/afternote/feature/receiver/presentation/home/ReceiverHomeScreenScreenshotTestKt/receiverHomeScreenSuccessScreenshot_748aa731_0.png differ diff --git a/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeDownloadSnackbarTest.kt b/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeDownloadSnackbarTest.kt index 016c76e5c0..6691581653 100644 --- a/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeDownloadSnackbarTest.kt +++ b/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeDownloadSnackbarTest.kt @@ -17,7 +17,6 @@ import org.robolectric.annotation.GraphicsMode /** 이 테스트의 관심 밖인 외부 라우팅을 채우는 no-op 묶음. */ private val noopActions = ReceiverHomeActions( - onSettingClick = {}, onNavigateToMindRecord = {}, onNavigateToTimeLetter = {}, onNavigateToAfternote = {}, diff --git a/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeHeaderTest.kt b/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeHeaderTest.kt index 4ca6b05018..b6dcf38554 100644 --- a/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeHeaderTest.kt +++ b/feature/receiver/presentation/src/test/kotlin/com/afternote/feature/receiver/presentation/home/ReceiverHomeHeaderTest.kt @@ -1,8 +1,10 @@ package com.afternote.feature.receiver.presentation.home import androidx.activity.ComponentActivity +import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertHasClickAction import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasClickAction import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag @@ -19,7 +21,6 @@ import org.robolectric.annotation.Config /** 이 테스트의 관심 밖인 외부 라우팅을 채우는 no-op 묶음. */ private val noopActions = ReceiverHomeActions( - onSettingClick = {}, onNavigateToMindRecord = {}, onNavigateToTimeLetter = {}, onNavigateToAfternote = {}, @@ -60,19 +61,39 @@ class ReceiverHomeHeaderTest { } @Test - fun `설정 아이콘은 이름이 있고 눌린다`() { - var settingClicks = 0 + fun `설정 아이콘을 그리지 않는다`() { + // 톱니는 **회원 설정 화면**을 그대로 열었고, 그 화면의 유일한 항목이 「로그아웃」이다. + // 수신자는 로그인한 적이 없는 사용자(X-Auth-Code 기반)라 지울 세션이 없다 (#613). + // + // 「이름이 있고 눌린다」를 단언하던 자리를 뒤집는다 — 진입점 자체가 없어야 한다. composeRule.setContent { AfternoteTheme { ReceiverHomeScreen( uiState = ReceiverHomeUiState.Loading, onEvent = {}, - actions = noopActions.copy(onSettingClick = { settingClicks += 1 }), + actions = noopActions, ) } } val setting = composeRule.activity.getString(R.string.core_ui_home_top_bar_setting) - composeRule.onNodeWithContentDescription(setting).assertIsDisplayed().assertHasClickAction() + composeRule.onNodeWithContentDescription(setting).assertDoesNotExist() + } + + @Test + fun `헤더에 누를 수 있는 액션이 하나도 없다`() { + // 개별 아이콘을 이름으로 확인하는 것과 별개로, 「헤더에 회원 액션이 새로 생기지 않는다」를 + // 통째로 고정한다 — 새 아이콘이 추가되면 이름을 모르니 위 두 단언은 그대로 통과한다. + composeRule.setContent { + AfternoteTheme { + ReceiverHomeScreen( + uiState = ReceiverHomeUiState.Loading, + onEvent = {}, + actions = noopActions, + ) + } + } + + composeRule.onAllNodes(hasClickAction()).assertCountEquals(0) } }