Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 모험 기록 상세 페이지 뷰 구현 #494

Merged
Merged
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
520a766
feat: OpenLetter 매퍼 생성
krrong Oct 16, 2023
85b8ee8
Merge branch 'dev_android' of https://github.com/woowacourse-teams/20…
krrong Oct 16, 2023
a8912df
feat: AdventureDetailViewModel 구현
krrong Oct 16, 2023
04cc1a9
test: AdventureDetailViewModel 테스트 작성
krrong Oct 16, 2023
82c3344
feat: LetterThrowable 추가
krrong Oct 16, 2023
81c7c24
feat: 읽은 편지, 등록한 편지를 읽을 수 있는 뷰페이저 구현
krrong Oct 16, 2023
96c762f
feat: 뷰페이저, 탭레이아웃 연결
krrong Oct 16, 2023
f05ca63
feat: radius를 파일명에 맞게 변경
krrong Oct 16, 2023
aa544f9
refactor: 뷰 마진, 배경 수정
krrong Oct 16, 2023
3e30f2b
refactor: text를 tools로 변경
krrong Oct 16, 2023
33f7425
refactor: 마진 추가
krrong Oct 16, 2023
22781e5
feat: 읽은 쪽지, 등록한 쪽지를 flow로 combine
krrong Oct 17, 2023
97e8478
feat: 모험 기록 상세 페이지로 이동하는 기능 구현
krrong Oct 17, 2023
f81a799
feat: 뒤로가기 기능 구현
krrong Oct 17, 2023
4c5d696
feat: 넘겨준 게임 id를 가져오는 기능 구현
krrong Oct 17, 2023
01c0d09
feat: 게임 id로 게임 결과를 가져와 보여주는 기능 구현
krrong Oct 17, 2023
4df8471
refactor: string resource화
krrong Oct 17, 2023
94fced6
refactor: string 변경
krrong Oct 17, 2023
0c29e97
feat: 등록된 쪽지가 없는 경우 쪽지가 없다는 내용을 보여주는 기능 구현
krrong Oct 17, 2023
9b2c5fd
feat: 이벤트가 없는 스낵바 확장함수 추가
krrong Oct 17, 2023
c7e7589
feat: 예상 가능한 예외 핸들링
krrong Oct 17, 2023
0e9a035
refactor: repeatOnStarted 확장함수 생성
krrong Oct 17, 2023
3fac1bc
feat: 액티비티 추가
krrong Oct 17, 2023
6d0c438
test: 테스트 수정
krrong Oct 17, 2023
5d6abee
refactor: 디폴트 객체 생성
krrong Oct 17, 2023
8c8c88c
Merge branch 'dev_android' of https://github.com/woowacourse-teams/20…
krrong Oct 17, 2023
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
Prev Previous commit
Next Next commit
test: 테스트 수정
krrong committed Oct 17, 2023
commit 6d0c43846b21e186fc6699d1d674fa033d77c7b2
Original file line number Diff line number Diff line change
@@ -1,41 +1,45 @@
package com.now.naaga

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.now.domain.model.AdventureResult
import com.now.domain.model.Coordinate
import com.now.domain.model.Place
import com.now.domain.model.Player
import com.now.domain.model.letter.OpenLetter
import com.now.domain.model.type.AdventureResultType
import com.now.domain.model.type.LogType
import com.now.domain.repository.AdventureRepository
import com.now.domain.repository.LetterRepository
import com.now.naaga.presentation.adventuredetail.AdventureDetailUiState
import com.now.naaga.presentation.adventuredetail.AdventureDetailViewModel
import com.now.naaga.presentation.uimodel.mapper.toUiModel
import io.mockk.coEvery
import io.mockk.mockk
import junit.framework.TestCase.assertEquals
import junit.framework.TestCase.assertTrue
import junit.framework.TestCase.assertSame
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.setMain
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import java.time.LocalDateTime

class AdventureDetailViewModelTest {
private lateinit var vm: AdventureDetailViewModel
private lateinit var letterRepository: LetterRepository

@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()
private lateinit var adventureRepository: AdventureRepository

@OptIn(ExperimentalCoroutinesApi::class)
@Before
fun setup() {
Dispatchers.setMain(UnconfinedTestDispatcher())
letterRepository = mockk()
vm = AdventureDetailViewModel(letterRepository)
adventureRepository = mockk()
vm = AdventureDetailViewModel(letterRepository, adventureRepository)
}

@Test
fun `읽은 쪽지를 불러올 때 작성한 쪽지는 불러오지 않는다`() {
fun `읽은 쪽지만 불러오면 AdventureDetailUiState는 Loading 상태다`() {
// given
coEvery {
letterRepository.fetchLetterLogs(1L, LogType.READ)
@@ -44,16 +48,14 @@ class AdventureDetailViewModelTest {
}

// when
vm.fetchLetterLogs(1L, LogType.READ)
vm.fetchReadLetter(1L)

// then
assertTrue(vm.readLetters.isInitialized)
assertEquals(vm.readLetters.getOrAwaitValue(), fakeReadLetterLogs)
assertEquals(vm.writeLetters.isInitialized, false)
assertSame(vm.uiState.value, AdventureDetailUiState.Loading)
}

@Test
fun `작성한 쪽지를 불러올 때 읽은 쪽지는 불러오지 않는다`() {
fun `작성한 쪽지만 불러오면 AdventureDetailUiState는 Loading 상태다`() {
// given
coEvery {
letterRepository.fetchLetterLogs(1L, LogType.WRITE)
@@ -62,12 +64,68 @@ class AdventureDetailViewModelTest {
}

// when
vm.fetchLetterLogs(1L, LogType.WRITE)
vm.fetchWriteLetter(1L)

// then
assertEquals(vm.readLetters.isInitialized, false)
assertTrue(vm.writeLetters.isInitialized)
assertEquals(vm.writeLetters.getOrAwaitValue(), fakeWriteLetterLogs)
assertSame(vm.uiState.value, AdventureDetailUiState.Loading)
}

@Test
fun `읽은 쪽지와 작성한 쪽지를 모두 불러와도 AdventureDetailUiState은 Loading 상태다`() {
// given
coEvery {
letterRepository.fetchLetterLogs(1L, LogType.WRITE)
} coAnswers {
fakeWriteLetterLogs
}

coEvery {
letterRepository.fetchLetterLogs(1L, LogType.READ)
} coAnswers {
fakeReadLetterLogs
}

// when
vm.fetchWriteLetter(1L)
vm.fetchReadLetter(1L)

// then
assertSame(vm.uiState.value, AdventureDetailUiState.Loading)
}

@Test
fun `읽은 쪽지, 작성한 쪽지, 게임 결과를 불러오면 AdventureDetailUiState은 Success 상태다`() {
// given
coEvery {
letterRepository.fetchLetterLogs(1L, LogType.WRITE)
} coAnswers {
fakeWriteLetterLogs
}

coEvery {
letterRepository.fetchLetterLogs(1L, LogType.READ)
} coAnswers {
fakeReadLetterLogs
}

coEvery {
adventureRepository.fetchAdventureResult(1L)
} coAnswers {
fakeAdventureResult
}

// when
vm.fetchWriteLetter(1L)
vm.fetchReadLetter(1L)
vm.fetchAdventureResult(1L)

// then
val actual = AdventureDetailUiState.Success(
readLetters = fakeReadLetterLogs.map { it.toUiModel() },
writeLetters = fakeWriteLetterLogs.map { it.toUiModel() },
adventureResult = fakeAdventureResult,
)
assertEquals(vm.uiState.value, actual)
}

private val fakeReadLetterLogs = listOf(
@@ -89,4 +147,18 @@ class AdventureDetailViewModelTest {
registerDate = "now",
),
)

private val fakeAdventureResult = AdventureResult(
id = 1L,
gameId = 2L,
destination = Place(1L, "집", Coordinate(123.0, 37.0), "", ""),
resultType = AdventureResultType.FAIL,
score = 123,
playTime = 123,
distance = 123,
hintUses = 123,
tryCount = 1,
beginTime = LocalDateTime.now(),
endTime = LocalDateTime.now(),
)
}