From 1f855102ce9163ad5b8c311d895f47f25895b7fa Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 19 Jun 2026 21:04:15 +0900 Subject: [PATCH] =?UTF-8?q?fix(creator):=20=EC=98=A4=EB=94=94=EC=98=A4=20?= =?UTF-8?q?=ED=83=AD=20owner=20reload=EB=A5=BC=20=EB=B3=B4=EC=A0=95?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../audio/CreatorChannelAudioViewModel.kt | 5 ++-- .../audio/CreatorChannelAudioViewModelTest.kt | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModel.kt index 5875b75f..910a41df 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModel.kt @@ -10,7 +10,7 @@ import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.v2.common.data.ContentSort import kr.co.vividnext.sodalive.v2.creator.channel.audio.data.CreatorChannelAudioTabResponse -import kr.co.vividnext.sodalive.v2.creator.channel.audio.model.CreatorChannelAudioContentUiModel +import kr.co.vividnext.sodalive.v2.creator.channel.model.CreatorChannelAudioContentUiModel import kr.co.vividnext.sodalive.v2.creator.channel.audio.model.CreatorChannelAudioRateUiModel import kr.co.vividnext.sodalive.v2.creator.channel.audio.model.CreatorChannelAudioThemeUiModel import kr.co.vividnext.sodalive.v2.creator.channel.audio.model.effectiveSelectedThemeId @@ -35,7 +35,8 @@ class CreatorChannelAudioViewModel( fun loadAudio(creatorId: Long, isOwner: Boolean) { if (creatorId <= 0) return - if (this.creatorId == creatorId && _audioStateLiveData.value != null) return + val shouldSkipReload = this.creatorId == creatorId && this.isOwner == isOwner && _audioStateLiveData.value != null + if (shouldSkipReload) return this.creatorId = creatorId this.isOwner = isOwner diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModelTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModelTest.kt index 67c80f87..f42052b6 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModelTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/audio/CreatorChannelAudioViewModelTest.kt @@ -210,6 +210,34 @@ class CreatorChannelAudioViewModelTest { verifyGetAudio(sort = ContentSort.POPULAR, themeId = null) } + @Test + fun `같은 creatorId라도 owner 상태가 바뀌면 첫 페이지를 다시 조회하고 소장률을 갱신한다`() { + whenever( + repository.getAudio( + 100L, + 0, + CreatorChannelAudioViewModel.DEFAULT_PAGE_SIZE, + ContentSort.LATEST, + null, + "Bearer test-token" + ) + ).thenReturn( + Single.just(ApiResponse(true, audioResponse(themeId = null, ids = listOf(1L)), null)), + Single.just(ApiResponse(true, audioResponse(themeId = null, ids = listOf(2L)), null)) + ) + + viewModel.loadAudio(100L, isOwner = false) + val guestState = viewModel.audioStateLiveData.requireValue() as CreatorChannelAudioUiState.Content + assertEquals(CreatorChannelAudioRateUiModel(75.0, 3, 4), guestState.rate) + + viewModel.loadAudio(100L, isOwner = true) + + val ownerState = viewModel.audioStateLiveData.requireValue() as CreatorChannelAudioUiState.Content + assertNull(ownerState.rate) + assertEquals(listOf(2L), ownerState.audioContents.map { it.audioContentId }) + verifyGetAudio(themeId = null, times = 2) + } + @Test fun `같은 정렬 또는 같은 테마를 다시 선택하면 API를 재호출하지 않는다`() { stubGetAudio(response = Single.just(ApiResponse(true, audioResponse(), null)))