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
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,22 @@ package com.youthtalk.repository
import com.core.dataapi.repository.PolicyRepository
import com.core.exception.NoDataException
import com.youthtalk.data.PolicyService
import com.youthtalk.dto.PolicyDetailResponse
import com.youthtalk.dto.policy.PolicyResponse
import com.youthtalk.mapper.toData
import com.youthtalk.mapper.toDomain
import com.youthtalk.model.policy.Policy
import com.youthtalk.model.policy.PolicyDetail
import com.youthtalk.utils.ErrorUtils.throwableError
import com.youthtalk.utils.ErrorUtils.createResult
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import timber.log.Timber

class PolicyRepositoryImpl @Inject constructor(
private val policyService: PolicyService
) : PolicyRepository {

override fun getPolicyDetail(policyId: Long): Flow<PolicyDetail> = flow {
runCatching {
policyService.getPolicyDetail(policyId)
}
.onSuccess { response ->
response.data?.let {
emit(it.toData())
} ?: throw NoDataException("no Data")
}
.onFailure {
Timber.e("getPolicyDetail $it")
throwableError<PolicyDetailResponse>(it)
}
override suspend fun getPolicyDetail(policyId: Long): Result<PolicyDetail> = createResult {
policyService.getPolicyDetail(policyId).data?.toData() ?: throw NoDataException()
}

override fun getRecentlyViewPolicies(): Flow<List<Policy>> = flow {
runCatching {
policyService.getRecentlyViewPolicies()
}
.onSuccess { response ->
response.data?.let { data ->
emit(data.map { it.toDomain() })
} ?: throw NoDataException("no Data")
}
.onFailure {
Timber.e("PolicyRepositoryImpl getRecentlyViewPolicies error $it")
throwableError<PolicyResponse>(it)
}
override suspend fun getRecentlyViewPolicies(): Result<List<Policy>> = createResult {
policyService.getRecentlyViewPolicies().data?.map { it.toDomain() } ?: throw NoDataException()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.youthtalk.repository

import com.core.dataapi.repository.PolicyRepository
import com.youthtalk.data.PolicyService
import com.youthtalk.dto.CommonResponse
import com.youthtalk.dto.PolicyDetailResponse
import com.youthtalk.mapper.toData
import com.youthtalk.model.policy.Policy
import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

@RunWith(MockitoJUnitRunner::class)
class PolicyRepositoryTest {

private lateinit var sut: PolicyRepository

@Mock
private lateinit var policyService: PolicyService

@Before
fun setUp() {
sut = PolicyRepositoryImpl(policyService)
}

@Test
fun givenPolicyId_whenGetPolicyDetail_thenReturnsPolicy() {
runTest {
// given
val policyId = 3L
val policyDetailResponse = createPolicyDetailResponse()

whenever(policyService.getPolicyDetail(policyId)).thenReturn(CommonResponse(200, "정책 조회에 성공하였습니다.", "S04", policyDetailResponse))

// when
val result = sut.getPolicyDetail(policyId).getOrThrow()

// then
assertEquals(policyDetailResponse.toData(), result)
verify(policyService).getPolicyDetail(policyId)
}
}

@Test
fun given_whenGetRecentViewPolicy_thenReturnsPolicy() {
runTest {
// given
whenever(policyService.getRecentlyViewPolicies()).thenReturn(CommonResponse(200, "요청에 성공하였습니다.", "S01", listOf()))

// when
val result = sut.getRecentlyViewPolicies().getOrThrow()

// then
assertEquals(listOf<Policy>(), result)
verify(policyService).getRecentlyViewPolicies()
}
}

private fun createPolicyDetailResponse(): PolicyDetailResponse {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [ktlint] standard:function-expression-body reported by reviewdog 🐶
Function body should be replaced with body expression

return PolicyDetailResponse("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", true, "", "")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ package com.core.dataapi.repository

import com.youthtalk.model.policy.Policy
import com.youthtalk.model.policy.PolicyDetail
import kotlinx.coroutines.flow.Flow

interface PolicyRepository {
fun getPolicyDetail(policyId: Long): Flow<PolicyDetail>
fun getRecentlyViewPolicies(): Flow<List<Policy>>
suspend fun getPolicyDetail(policyId: Long): Result<PolicyDetail>
suspend fun getRecentlyViewPolicies(): Result<List<Policy>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ import javax.inject.Inject
class GetRecentlyViewPolicesUseCase @Inject constructor(
private val policyRepository: PolicyRepository
) {
operator fun invoke() = policyRepository.getRecentlyViewPolicies()
suspend operator fun invoke() = policyRepository.getRecentlyViewPolicies()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ package com.core.domain.usercase.policydetail
import com.core.dataapi.repository.PolicyRepository
import com.youthtalk.model.policy.PolicyDetail
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow

class GetPolicyDetailUseCase @Inject constructor(
private val policyRepository: PolicyRepository
) {
operator fun invoke(policyId: Long): Flow<PolicyDetail> = policyRepository.getPolicyDetail(policyId)
suspend operator fun invoke(policyId: Long): Result<PolicyDetail> = policyRepository.getPolicyDetail(policyId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,7 @@ class NewPolicyViewModel @Inject constructor(
viewModelScope.launch {
state.value.policyId?.let { policyId ->
getPolicyDetailUseCase(policyId)
.catch {
Timber.e("NewPolicyViewModel refresh error $it")
}
.collectLatest { policyDetail ->
.onSuccess { policyDetail ->
setState {
copy(
newPolicies = newPolicies.copy(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,7 @@ class PopularPolicyViewModel @Inject constructor(
viewModelScope.launch {
state.value.policyId?.let { policyId ->
getPolicyDetailUseCase(policyId)
.catch {
Timber.e("PopularPolicyViewModel refresh error $it")
}
.collectLatest { policyDetail ->
.onSuccess { policyDetail ->
setState {
copy(
policies = policies.map { policy ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ class PolicyViewModel @Inject constructor(
setState {
copy(
recentlyPolicies = recentlyPolicies
.map {
policy ->
.map { policy ->
if (policy.policyId == policyId) policy.copy(scrap = !scrap) else policy
}
)
Expand All @@ -81,13 +80,12 @@ class PolicyViewModel @Inject constructor(
private fun refresh() {
viewModelScope.launch {
getRecentlyViewPolicesUseCase()
.catch {
Timber.e("PolicyViewModel refresh error $it")
}
.collectLatest { policies ->
.onSuccess { policies ->
setState {
copy(recentlyPolicies = policies)
}
}.onFailure {
Timber.e("error $it")
}
}
}
Expand Down Expand Up @@ -164,8 +162,8 @@ class PolicyViewModel @Inject constructor(
private fun initData() {
val today = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(state.value.selectedDay)
viewModelScope.launch {
val recentViewPolicies = getRecentlyViewPolicesUseCase()
combine(
getRecentlyViewPolicesUseCase(),
getUserUseCase(),
combine(
postSpecPoliciesUseCase(SearchFilter(applyDue = today), PolicyType.POLICY_TAB_DEADLINE),
Expand All @@ -179,10 +177,10 @@ class PolicyViewModel @Inject constructor(
) { categoryPolicies, allCount ->
Pair(categoryPolicies, allCount)
}
) { recentlyViewPolicies, user, deadlineInfo, categoryInfo ->
) { user, deadlineInfo, categoryInfo ->
PolicyUiState.initState.copy(
user = user,
recentlyPolicies = recentlyViewPolicies,
recentlyPolicies = recentViewPolicies.getOrThrow(),
deadlinePolicies = deadlineInfo.first.cachedIn(viewModelScope),
deadlineCount = deadlineInfo.second,
allCount = categoryInfo.second,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ class RecentlyViewPolicyViewModel @Inject constructor(
setState {
copy(
policies = policies
.map {
policy ->
.map { policy ->
if (policy.policyId == policyId) policy.copy(scrap = !scrap) else policy
}
)
Expand All @@ -72,11 +71,10 @@ class RecentlyViewPolicyViewModel @Inject constructor(
private fun initData() {
viewModelScope.launch {
getRecentlyViewPolicesUseCase()
.catch {
Timber.e("RecentlyViewPolicyViewModel initData error $it")
}
.collectLatest {
.onSuccess {
setState { copy(isLoading = false, policies = it) }
}.onFailure {
Timber.e("error : $it")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import java.time.LocalDateTime
import javax.inject.Inject
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import timber.log.Timber

Expand Down Expand Up @@ -197,29 +196,19 @@ class PolicyDetailViewModel @Inject constructor(
private fun initData(policyId: Long) {
viewModelScope.launch {
val commentInfo = getPolicyDetailCommentUseCase(policyId)
val policyDetail = getPolicyDetailUseCase(policyId)

if (commentInfo.isFailure) {
Timber.e("commentInfoError ${commentInfo.exceptionOrNull()?.message}")
return@launch
}

combine(
getPolicyDetailUseCase(policyId),
getUserUseCase()
) { policyDetail, user ->
PolicyDetailUiState(
isLoading = false,
user = user,
policyDetail = policyDetail,
commentInfo = commentInfo.getOrThrow(),
policyId = policyId
)
}
getUserUseCase()
.catch {
Timber.e("PolicyDetailViewModel initData error $it")
}
.collectLatest {
setState { it }
Timber.e("error $it")
}.collectLatest { user ->
PolicyDetailUiState(
isLoading = false,
user = user,
policyDetail = policyDetail.getOrThrow(),
commentInfo = commentInfo.getOrThrow(),
policyId = policyId
)
}
}
}
Expand Down