Skip to content

Instantly share code, notes, and snippets.

@aartikov
Created September 12, 2020 10:16
Show Gist options
  • Select an option

  • Save aartikov/34f1413c9bb8d3b548730b668dbfbd5d to your computer and use it in GitHub Desktop.

Select an option

Save aartikov/34f1413c9bb8d3b548730b668dbfbd5d to your computer and use it in GitHub Desktop.

Revisions

  1. aartikov created this gist Sep 12, 2020.
    64 changes: 64 additions & 0 deletions StoreTest.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    package me.aartikov.storesample

    import com.dropbox.android.external.store4.*
    import kotlinx.coroutines.delay
    import kotlinx.coroutines.flow.Flow
    import kotlinx.coroutines.flow.MutableStateFlow
    import kotlinx.coroutines.flow.toList
    import kotlinx.coroutines.launch
    import kotlinx.coroutines.runBlocking
    import org.junit.Assert.assertEquals
    import org.junit.Test

    class StoreTest {

    @Test
    fun refreshWithError() = runBlocking {
    val fetcher = Fetcher.ofResult<Unit, String> {
    FetcherResult.Error.Message("Error")
    }
    val sourceOfTruth = InMemorySourceOfTruth()
    val store = StoreBuilder.from(fetcher, sourceOfTruth).build()

    val result = mutableListOf<StoreResponse<String>>()
    val job = launch {
    store.stream(StoreRequest.cached(Unit, refresh = true))
    .toList(result)
    }

    delay(1000)
    runCatching {
    store.fresh(Unit)
    }

    delay(1000)
    job.cancel()

    val expected = listOf<StoreResponse<String>>(
    StoreResponse.Loading(origin = ResponseOrigin.Fetcher),
    StoreResponse.Error.Message(message = "Error", origin = ResponseOrigin.Fetcher),
    StoreResponse.Error.Message(message = "Error", origin = ResponseOrigin.Fetcher)
    )
    assertEquals(expected, result)
    }
    }

    class InMemorySourceOfTruth : SourceOfTruth<Unit, String, String> {
    private val stateFlow = MutableStateFlow<String?>(null)

    override suspend fun delete(key: Unit) {
    stateFlow.value = null
    }

    override suspend fun deleteAll() {
    stateFlow.value = null
    }

    override fun reader(key: Unit): Flow<String?> {
    return stateFlow
    }

    override suspend fun write(key: Unit, value: String) {
    stateFlow.value = value
    }
    }