Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ dependencies {
androidTestImplementation(projects.core.data)
androidTestImplementation(projects.feature.afternote.domain)
androidTestImplementation(projects.feature.mindrecord.domain)
androidTestImplementation(testFixtures(projects.feature.mindrecord.domain))
androidTestImplementation(projects.feature.receiver.domain)
androidTestImplementation(projects.feature.timeletter.domain)
kspAndroidTest(libs.hilt.compiler)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import com.afternote.feature.afternote.domain.AfternoteType
import com.afternote.feature.afternote.domain.model.LeaveMessageBlock
import com.afternote.feature.home.presentation.HomeTabActions
import com.afternote.feature.mindrecord.domain.model.ReceiverMindRecords
import com.afternote.feature.mindrecord.domain.repository.MindRecordReceiverRepository
import com.afternote.feature.mindrecord.domain.testing.FakeMindRecordReceiverRepository
import com.afternote.feature.mindrecord.presentation.model.MindRecordCategory
import com.afternote.feature.receiver.domain.error.ReceiverFailure
import com.afternote.feature.receiver.domain.model.AfterNoteListItem
Expand Down Expand Up @@ -234,7 +234,10 @@ class ReceiverRuntimeCompletionAndroidTest {
@Test
fun receiverHome_allFailureThenRetryPartialSuccess_keepsAvailableSectionsAndReportsBothStages() {
val repository = CompletionReceiverRepository()
val mindRecordRepository = CompletionMindRecordReceiverRepository()
// 완료 시점을 테스트가 쥐어야 세 조회의 경합 순서를 만들 수 있다.
val mindRecordHomeResults = ArrayDeque<CompletableDeferred<Result<ReceiverMindRecords>>>()
val mindRecordRepository =
FakeMindRecordReceiverRepository(onGetAll = { mindRecordHomeResults.removeFirst().await() })
val timeLetterRepository = CompletionReceiverTimeLetterRepository()

fun homeCallCounts(): List<Int> =
Expand All @@ -245,8 +248,8 @@ class ReceiverRuntimeCompletionAndroidTest {
repository.senderMessageCalls,
)

val allFailureAttempt = enqueueHomeAttempt(repository, mindRecordRepository, timeLetterRepository)
val partialAttempt = enqueueHomeAttempt(repository, mindRecordRepository, timeLetterRepository)
val allFailureAttempt = enqueueHomeAttempt(repository, mindRecordHomeResults, timeLetterRepository)
val partialAttempt = enqueueHomeAttempt(repository, mindRecordHomeResults, timeLetterRepository)
val reporter = FakeErrorReporter()
val viewModel =
ReceiverHomeViewModel(
Expand Down Expand Up @@ -744,7 +747,7 @@ private data class PendingHomeAttempt(
/** 홈 한 번의 로드가 물리는 세 리포지토리 대기열에 결과 게이트를 한 벌씩 건다. */
private fun enqueueHomeAttempt(
receiverRepository: CompletionReceiverRepository,
mindRecordRepository: CompletionMindRecordReceiverRepository,
mindRecordHomeResults: ArrayDeque<CompletableDeferred<Result<ReceiverMindRecords>>>,
timeLetterRepository: CompletionReceiverTimeLetterRepository,
): PendingHomeAttempt {
val attempt =
Expand All @@ -755,7 +758,7 @@ private fun enqueueHomeAttempt(
senderMessage = CompletableDeferred(),
)
receiverRepository.afterNoteHomeResults.addLast(attempt.afterNotes)
mindRecordRepository.homeResults.addLast(attempt.mindRecords)
mindRecordHomeResults.addLast(attempt.mindRecords)
timeLetterRepository.homeResults.addLast(attempt.timeLetters)
receiverRepository.senderMessageHomeResults.addLast(attempt.senderMessage)
return attempt
Expand Down Expand Up @@ -807,17 +810,6 @@ private class CompletionReceiverRepository : ReceiverRepository {
}
}

private class CompletionMindRecordReceiverRepository : MindRecordReceiverRepository {
val homeResults = ArrayDeque<CompletableDeferred<Result<ReceiverMindRecords>>>()
var getAllCalls = 0
private set

override suspend fun getAll(): Result<ReceiverMindRecords> {
getAllCalls += 1
return homeResults.removeFirst().await()
}
}

private class CompletionReceiverTimeLetterRepository : ReceiverTimeLetterRepository {
val homeResults = ArrayDeque<CompletableDeferred<Result<ReceivedTimeLetterList>>>()
var listCalls = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import androidx.compose.ui.test.waitUntilAtLeastOneExists
import androidx.lifecycle.SavedStateHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.afternote.afternote_fe.test.FailureArtifactRule
import com.afternote.afternote_fe.test.FakeDailyQuestionRepository
import com.afternote.afternote_fe.test.FakeDiaryRepository
import com.afternote.afternote_fe.test.FakeUserRepository
import com.afternote.core.domain.repository.PhotoUploadRepository
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.mindrecord.domain.model.TodayMood
import com.afternote.feature.mindrecord.domain.testing.FakeDailyQuestionRepository
import com.afternote.feature.mindrecord.domain.testing.FakeDiaryRepository
import com.afternote.feature.mindrecord.presentation.screen.sender.DiaryWriteScreen
import com.afternote.feature.mindrecord.presentation.viewmodel.DailyQuestionWriteViewModel
import com.afternote.feature.mindrecord.presentation.viewmodel.DiaryWriteViewModel
Expand All @@ -46,8 +46,15 @@ class MindRecordFlowAndroidTest {
@Test
fun diaryFailureThenRetry_preservesInputAndSendsExactPayload() {
val repository = FakeDiaryRepository()
repository.createResults.addLast(Result.failure(IllegalStateException("temporary")))
repository.createResults.addLast(Result.success(Unit))
// 첫 저장은 실패, 재시도는 성공 — 입력이 남는지와 정확한 payload 를 본다.
val createResults =
ArrayDeque(
listOf(
Result.failure<Unit>(IllegalStateException("temporary")),
Result.success(Unit),
),
)
repository.onCreate = { createResults.removeFirst() }
val viewModel = diaryViewModel(repository)
var successCalls = 0

Expand Down Expand Up @@ -105,8 +112,15 @@ class MindRecordFlowAndroidTest {
@Test
fun dailyQuestion_failureThenRetry_keepsAnswerAndAvoidsDuplicateSuccess() {
val repository = FakeDailyQuestionRepository()
repository.createResults.addLast(Result.failure(IllegalStateException("offline")))
repository.createResults.addLast(Result.success(1L))
// 첫 저장은 실패, 재시도는 성공 — 실패 후 답변이 남는지와 중복 성공이 없는지를 본다.
val createResults =
ArrayDeque(
listOf(
Result.failure<Long>(IllegalStateException("offline")),
Result.success(FakeDailyQuestionRepository.FIRST_CREATED_ID),
),
)
repository.onCreate = { createResults.removeFirst() }
val viewModel =
DailyQuestionWriteViewModel(
savedStateHandle = SavedStateHandle(emptyMap()),
Expand Down
Loading
Loading