Skip to content

Commit

Permalink
test fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
psuzn committed Jan 5, 2024
1 parent 10f31a8 commit 0cc6aa4
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ import io.kotest.matchers.shouldBe
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.emptyFlow
Expand All @@ -23,22 +21,51 @@ import me.sujanpoudel.playdeals.common.domain.models.Failure
import me.sujanpoudel.playdeals.common.domain.models.Result
import me.sujanpoudel.playdeals.common.domain.persistent.AppPreferences
import me.sujanpoudel.playdeals.common.domain.repositories.DealsRepository
import me.sujanpoudel.playdeals.common.domain.repositories.ForexRepository
import me.sujanpoudel.playdeals.common.domain.repositories.defaultUsdConversion
import me.sujanpoudel.playdeals.common.ui.screens.home.HomeScreenState
import me.sujanpoudel.playdeals.common.ui.screens.home.HomeScreenViewModel
import me.sujanpoudel.playdeals.common.utils.setMainDispatcher
import me.sujanpoudel.playdeals.common.utils.settings.asObservableSettings
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test


fun dealEntity(id: String = "1") = DealEntity(
id = id,
name = "name",
icon = "icon",
images = listOf(),
normalPrice = 1.1f,
currentPrice = 1.2f,
currency = "$",
url = "",
category = "game",
downloads = "150k",
rating = 3.7f,
offerExpiresIn = kotlinx.datetime.Clock.System.now(),
type = "",
source = "",
createdAt = kotlinx.datetime.Clock.System.now(),
updatedAt = kotlinx.datetime.Clock.System.now(),
)

@OptIn(ExperimentalCoroutinesApi::class)
class HomeScreenViewModelTest {

@MockK
lateinit var dealsRepository: DealsRepository

@MockK
lateinit var forexRepository: ForexRepository

@BeforeEach
fun setup() {
MockKAnnotations.init(this)
coEvery { forexRepository.refreshRatesIfNecessary() } returns Result.success(Unit)
coEvery { forexRepository.forexRatesFlow() } returns flowOf(emptyList())
coEvery { forexRepository.forexUpdateAtFlow() } returns MutableStateFlow(null)
coEvery { forexRepository.preferredConversionRateFlow() } returns MutableStateFlow(defaultUsdConversion())
}

private fun appPreference(): AppPreferences {
Expand All @@ -62,7 +89,7 @@ class HomeScreenViewModelTest {
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
coEvery { dealsRepository.refreshDeals() } returns Result.success(Unit)

HomeScreenViewModel(appPreference(), dealsRepository)
HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

coVerify {
dealsRepository.dealsFlow()
Expand All @@ -76,21 +103,18 @@ class HomeScreenViewModelTest {
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
coEvery { dealsRepository.refreshDeals() } returns Result.success(Unit)

HomeScreenViewModel(appPreference(), dealsRepository)
HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

coVerify { dealsRepository.refreshDeals() }
}

@Test
fun `should correctly update state before calling the remoteAPI_getDeals`(): Unit = runTest {
val dispatcher = StandardTestDispatcher()

setMainDispatcher(dispatcher)

coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
coEvery { dealsRepository.refreshDeals() } returns Result.success(Unit)

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

viewModel.state.value.let {
it.allDeals shouldHaveSize 0
Expand All @@ -108,7 +132,7 @@ class HomeScreenViewModelTest {
coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
coEvery { dealsRepository.refreshDeals() } returns Result.failure(Failure.UnknownError)

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

dispatcher.scheduler.runCurrent()

Expand All @@ -125,16 +149,13 @@ class HomeScreenViewModelTest {
runTest {
val dispatcher = StandardTestDispatcher()

val deal = mockk<DealEntity>()

every { deal.category } returns ""

setMainDispatcher(dispatcher)

coEvery { dealsRepository.dealsFlow() } returns emptyFlow()
coEvery { dealsRepository.refreshDeals() } returns Result.success(Unit)

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

dispatcher.scheduler.runCurrent()

Expand All @@ -151,15 +172,15 @@ class HomeScreenViewModelTest {
runTest {
val dispatcher = StandardTestDispatcher()

val entity = mockk<DealEntity>()
every { entity.category } returns ""
val entity = dealEntity("32")


setMainDispatcher(dispatcher)

coEvery { dealsRepository.dealsFlow() } returns flowOf(listOf(entity))
coEvery { dealsRepository.refreshDeals() } returns Result.success(Unit)

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

dispatcher.scheduler.runCurrent()

Expand All @@ -184,7 +205,7 @@ class HomeScreenViewModelTest {

coEvery { dealsRepository.dealsFlow() } returns emptyFlow()

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

viewModel.state.value.also { state ->
state.allDeals shouldHaveSize 0
Expand Down Expand Up @@ -230,9 +251,7 @@ class HomeScreenViewModelTest {
runTest {
val dispatcher = StandardTestDispatcher()

val entity = mockk<DealEntity>()

every { entity.category } returns ""
val entity = dealEntity("1")

setMainDispatcher(dispatcher)

Expand All @@ -242,7 +261,7 @@ class HomeScreenViewModelTest {

coEvery { dealsRepository.dealsFlow() } returns flowOf(listOf(entity))

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

viewModel.state.value.also { state ->
state.allDeals shouldHaveSize 0
Expand Down Expand Up @@ -289,20 +308,17 @@ class HomeScreenViewModelTest {
val dispatcher = StandardTestDispatcher()
setMainDispatcher(dispatcher)

val deal1 = mockk<DealEntity>()
val deal2 = mockk<DealEntity>()

val flow = MutableStateFlow<List<DealEntity>>(emptyList())
val deal1 = dealEntity("123")
val deal2 = dealEntity("321")

every { deal1.category } returns ""
every { deal2.category } returns ""
val flow = MutableStateFlow<List<DealEntity>>(emptyList())

coEvery { dealsRepository.refreshDeals() } returns Result.success(Unit)
coEvery { dealsRepository.dealsFlow() } returns flow

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

dispatcher.scheduler.advanceTimeBy(10000)
dispatcher.scheduler.advanceUntilIdle()

viewModel.state.value.also { state ->
Expand All @@ -312,6 +328,7 @@ class HomeScreenViewModelTest {
flow.emit(listOf(deal1, deal2))

dispatcher.scheduler.advanceUntilIdle()
dispatcher.scheduler.runCurrent()

viewModel.state.value.also { state ->
state.allDeals.shouldContainExactly(deal1, deal2)
Expand All @@ -324,18 +341,15 @@ class HomeScreenViewModelTest {
val dispatcher = StandardTestDispatcher()
setMainDispatcher(dispatcher)

val deal1 = mockk<DealEntity>()
val deal2 = mockk<DealEntity>()
val deal1 = dealEntity()
val deal2 = dealEntity("2")

val flow = MutableStateFlow<List<DealEntity>>(emptyList())

every { deal1.category } returns ""
every { deal2.category } returns ""

coEvery { dealsRepository.refreshDeals() } returns Result.failure(Failure.UnknownError)
coEvery { dealsRepository.dealsFlow() } returns flow

val viewModel = HomeScreenViewModel(appPreference(), dealsRepository)
val viewModel = HomeScreenViewModel(appPreference(), dealsRepository, forexRepository)

dispatcher.scheduler.advanceTimeBy(10000)
dispatcher.scheduler.advanceUntilIdle()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import me.sujanpoudel.playdeals.common.domain.entities.ForexRateEntity
import me.sujanpoudel.playdeals.common.extensions.capitalizeWords
import me.sujanpoudel.playdeals.common.strings.AppLanguage
import me.sujanpoudel.playdeals.common.strings.Strings
import me.sujanpoudel.playdeals.common.ui.components.common.clickableWithoutIndicator
import me.sujanpoudel.playdeals.common.ui.screens.settings.icon
import me.sujanpoudel.playdeals.common.ui.theme.AppearanceMode
import me.sujanpoudel.playdeals.common.ui.theme.SOFT_COLOR_ALPHA
Expand Down Expand Up @@ -213,10 +214,12 @@ object SettingsScreen {
Dialog(closeRequest, properties = DialogProperties()) {
Column(
modifier = Modifier
.windowInsetsPadding(WindowInsets(bottom = 40.dp, top = 40.dp))
.clickableWithoutIndicator { closeRequest() }
.windowInsetsPadding(WindowInsets(bottom = 100.dp, top = 100.dp))
.clip(RoundedCornerShape(5))
.background(MaterialTheme.colorScheme.surface)
.padding(top = 16.dp),
.padding(top = 16.dp)
.clickableWithoutIndicator { },
) {
Text(
title,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import io.ktor.util.reflect.instanceOf
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -52,7 +51,7 @@ class HomeScreenViewModel(
)
}
}
.collectLatest { deals ->
.collect { deals ->
_state.update { state ->
state.copy(
persistentError = if (deals.isNotEmpty()) null else state.persistentError,
Expand Down

0 comments on commit 0cc6aa4

Please sign in to comment.