Skip to content

Commit

Permalink
Adding RatesStateFlowTest
Browse files Browse the repository at this point in the history
  • Loading branch information
philipplackner committed Aug 7, 2023
1 parent 6af67c4 commit 872a857
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
33 changes: 33 additions & 0 deletions exchange-rates/src/test/java/com/ivy/exchangeRates/RatesDaoFake.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.ivy.exchangeRates

import com.ivy.core.persistence.algorithm.calc.Rate
import com.ivy.core.persistence.algorithm.calc.RatesDao
import com.ivy.data.CurrencyCode
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf

class RatesDaoFake: RatesDao {

var rates = MutableStateFlow(
listOf(
Rate(1.0, "EUR"),
Rate(1.2, "USD"),
Rate(1.8, "CAD"),
)
)

var overrides = MutableStateFlow(
listOf(
Rate(1.3, "USD"),
)
)

override fun findAll(baseCurrency: CurrencyCode): Flow<List<Rate>> {
return rates
}

override fun findAllOverrides(baseCurrency: CurrencyCode): Flow<List<Rate>> {
return overrides
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
@file:OptIn(ExperimentalCoroutinesApi::class)

package com.ivy.exchangeRates

import app.cash.turbine.test
import assertk.assertThat
import assertk.assertions.contains
import assertk.assertions.doesNotContain
import com.ivy.MainCoroutineExtension
import com.ivy.core.domain.action.settings.basecurrency.BaseCurrencyFlow
import com.ivy.core.persistence.algorithm.calc.Rate
import com.ivy.exchangeRates.data.RateUi
import io.mockk.every
import io.mockk.mockk
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith

@OptIn(ExperimentalCoroutinesApi::class)
@ExtendWith(MainCoroutineExtension::class)
internal class RatesStateFlowTest {

private lateinit var ratesFlow: RatesStateFlow
private lateinit var baseCurrencyFlow: BaseCurrencyFlow
private lateinit var ratesDaoFake: RatesDaoFake

@BeforeEach
fun setUp() {
baseCurrencyFlow = mockk()
every { baseCurrencyFlow.invoke() } returns flowOf("", "EUR")

ratesDaoFake = RatesDaoFake()

ratesFlow = RatesStateFlow(
baseCurrencyFlow = baseCurrencyFlow,
ratesDao = ratesDaoFake
)
}

@Test
fun `Test rates flow emissions`() = runTest {
ratesFlow().test {
awaitItem() // Initial emission

val emission1 = awaitItem()

val overriddenRate = RateUi(from = "EUR", to = "USD", rate = 1.3)
assertThat(emission1.automatic).doesNotContain(overriddenRate)
assertThat(emission1.manual).contains(overriddenRate)

ratesDaoFake.rates.value += Rate(rate = 0.00004, currency = "BTC")

val emission2 = awaitItem()
val rate = RateUi(from = "EUR", to = "BTC", rate = 0.00004)
assertThat(emission2.automatic).contains(rate)
assertThat(emission2.manual).doesNotContain(rate)
}
}
}

0 comments on commit 872a857

Please sign in to comment.