diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt index dae33b98..c992e8e4 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt @@ -123,10 +123,19 @@ class CreatorChannelDonationViewModel( } fun consumeActionToastMessage() { - val content = _donationStateLiveData.value as? CreatorChannelDonationUiState.Content ?: return - if (content.actionToastMessage == null) return - - _donationStateLiveData.value = content.copy(actionToastMessage = null) + when (val state = _donationStateLiveData.value) { + is CreatorChannelDonationUiState.Empty -> { + if (state.actionToastMessage != null) { + _donationStateLiveData.value = state.copy(actionToastMessage = null) + } + } + is CreatorChannelDonationUiState.Content -> { + if (state.actionToastMessage != null) { + _donationStateLiveData.value = state.copy(actionToastMessage = null) + } + } + else -> Unit + } } fun consumeDonationSuccessEvent(): Boolean { @@ -188,8 +197,11 @@ class CreatorChannelDonationViewModel( } private fun setActionToastMessage(message: String?) { - val content = _donationStateLiveData.value as? CreatorChannelDonationUiState.Content ?: return - _donationStateLiveData.value = content.copy(actionToastMessage = message) + when (val state = _donationStateLiveData.value) { + is CreatorChannelDonationUiState.Empty -> _donationStateLiveData.value = state.copy(actionToastMessage = message) + is CreatorChannelDonationUiState.Content -> _donationStateLiveData.value = state.copy(actionToastMessage = message) + else -> Unit + } } private fun CreatorChannelDonationTabResponse.toContentState( @@ -220,7 +232,11 @@ class CreatorChannelDonationViewModel( sealed interface CreatorChannelDonationUiState { data object Loading : CreatorChannelDonationUiState - data class Empty(val donationCount: Int, val isOwner: Boolean) : CreatorChannelDonationUiState + data class Empty( + val donationCount: Int, + val isOwner: Boolean, + val actionToastMessage: String? = null + ) : CreatorChannelDonationUiState data class Error(val message: String?) : CreatorChannelDonationUiState data class Content( val donationCount: Int, diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt index ea38ca74..e012e2e3 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt @@ -133,6 +133,25 @@ class CreatorChannelDonationViewModelTest { assertEquals(0, SharedPreferenceManager.can) } + @Test + fun `Empty 상태에서 채널 후원 실패는 action toast message를 emit하고 consume한다`() { + stubGetDonations(response = Single.just(ApiResponse(true, donationResponse(donationCount = 0, ids = emptyList()), null))) + whenever(repository.postChannelDonation(100L, 50, false, "응원", "Bearer test-token")).thenReturn( + Single.just(ApiResponse(false, Any(), "후원 실패")) + ) + viewModel.loadDonations(100L, isOwner = false) + + viewModel.postChannelDonation(can = 50, isSecret = false, message = "응원") + + val state = viewModel.donationStateLiveData.requireValue() as CreatorChannelDonationUiState.Empty + assertEquals("후원 실패", state.actionToastMessage) + + viewModel.consumeActionToastMessage() + + val consumed = viewModel.donationStateLiveData.requireValue() as CreatorChannelDonationUiState.Empty + assertEquals(null, consumed.actionToastMessage) + } + private fun stubGetDonations( page: Int = 0, response: Single>