Merge pull request #3 from friendlyrobotnyc/feature/remove-getWithResult

Remove getWithResult and freshWithResult
This commit is contained in:
Brian Plummer 2019-05-27 15:58:29 -04:00 committed by GitHub
commit 7981500102
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 10 additions and 291 deletions

View file

@ -1,42 +0,0 @@
package com.nytimes.android.external.store.util
/**
* Result is a container with meta data for the parsed object.
*
* @param <Parsed> data type after parsing
</Parsed> */
data class Result<Parsed>(val source: Source, val value: Parsed?) {
val isFromNetwork: Boolean
get() = source == Source.NETWORK
val isFromCache: Boolean
get() = source == Source.CACHE
enum class Source {
CACHE, NETWORK
}
companion object {
/**
* Convenient method to create a result object from {SOURCE_CACHE}.
* @param value data type after parsing
* @param <T> data type after parsing
* @return a Result object with T passed
</T> */
fun <T> createFromCache(value: T): Result<T> {
return Result(Source.CACHE, value)
}
/**
* Convenient method to create a result object from {SOURCE_NETWORK}.
* @param value data type after parsing
* @param <T> data type after parsing
* @return a Result object with T passed
</T> */
fun <T> createFromNetwork(value: T): Result<T> {
return Result(Source.NETWORK, value)
}
}
}

View file

@ -67,9 +67,6 @@ open class RealStore<Parsed, Key> : Store<Parsed, Key> {
return internalStore.get(key) return internalStore.get(key)
} }
// fun getWithResult(key: Key): Single<Result<Parsed>> {
// TODO("not implemented")
// }
// //
// fun getRefreshing(key: Key): Observable<Parsed> { // fun getRefreshing(key: Key): Observable<Parsed> {
// TODO("not implemented") // TODO("not implemented")

View file

@ -1,6 +1,5 @@
package com.nytimes.android.external.store3.base.impl package com.nytimes.android.external.store3.base.impl
import com.nytimes.android.external.store.util.Result
import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -23,13 +22,6 @@ interface Store<T, V> {
*/ */
suspend fun get(key: V): T suspend fun get(key: V): T
/**
* Return an Observable of [Result]<T> for request Barcode
* Data will be returned from oldest non expired source
* Sources are Memory Cache, Disk Cache, Inflight, Network Response
</T> */
// suspend fun getWithResult(key: V): Result<T>
/** /**
* Calls store.get(), additionally will repeat anytime store.clear(barcode) is called * Calls store.get(), additionally will repeat anytime store.clear(barcode) is called
* WARNING: getRefreshing(barcode) is an endless observable, be careful when combining * WARNING: getRefreshing(barcode) is an endless observable, be careful when combining
@ -44,11 +36,6 @@ interface Store<T, V> {
*/ */
suspend fun fresh(key: V): T suspend fun fresh(key: V): T
/**
* Return an Observable of [Result]<T> for requested Barcode skipping Memory & Disk Cache
</T> */
// suspend fun freshWithResult(key: V): Result<T>
/** /**
* @return an Observable that emits "fresh" new response from the store that hit the fetcher * @return an Observable that emits "fresh" new response from the store that hit the fetcher
* WARNING: stream is an endless observable, be careful when combining * WARNING: stream is an endless observable, be careful when combining

View file

@ -36,21 +36,4 @@ class DontCacheErrorsTest {
shouldThrow = false shouldThrow = false
store.get(barcode) store.get(barcode)
} }
// TODO storeWithResult test
// @Test
// fun testStoreDoesntCacheErrorsWithResult() = runBlocking<Unit> {
// val barcode = BarCode("bar", "code")
//
// shouldThrow = true
// store.getWithResult(barcode).test()
// .assertTerminated()
// .assertError(Exception::class.java)
// .awaitTerminalEvent()
//
// shouldThrow = false
// store.get(barcode).test()
// .assertNoErrors()
// .awaitTerminalEvent()
// }
} }

View file

@ -25,14 +25,6 @@ class NoNetworkTest {
} }
} }
// TODO getWithResult test
// @Test
// fun testNoNetworkWithResult() = runBlocking<Unit> {
// store.getWithResult(BarCode("test", "test"))
// .test()
// .assertError(EXCEPTION)
// }
companion object { companion object {
private val EXCEPTION = RuntimeException("abc") private val EXCEPTION = RuntimeException("abc")
} }

View file

@ -23,15 +23,6 @@ class SequentialTest {
assertThat(networkCalls).isEqualTo(1) assertThat(networkCalls).isEqualTo(1)
} }
// @Test
// fun sequentiallyWithResult() = runBlocking<Unit> {
// val b = BarCode("one", "two")
// store.getWithResult(b)
// store.getWithResult(b)
//
// assertThat(networkCalls).isEqualTo(1)
// }
@Test @Test
fun parallel() = runBlocking<Unit> { fun parallel() = runBlocking<Unit> {
val b = BarCode("one", "two") val b = BarCode("one", "two")
@ -41,13 +32,4 @@ class SequentialTest {
assertThat(networkCalls).isEqualTo(1) assertThat(networkCalls).isEqualTo(1)
} }
// @Test
// fun parallelWithResult() = runBlocking<Unit> {
// val b = BarCode("one", "two")
// val first = store.getWithResult(b)
// val second = store.getWithResult(b)
//
// assertThat(networkCalls).isEqualTo(1)
// }
} }

View file

@ -46,40 +46,9 @@ class StoreTest {
assertThat(value).isEqualTo(DISK) assertThat(value).isEqualTo(DISK)
value = simpleStore.get(barCode) value = simpleStore.get(barCode)
assertThat(value).isEqualTo(DISK) assertThat(value).isEqualTo(DISK)
verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
} }
// @Test
// fun testSimpleWithResult() = runBlocking<Unit> {
//
// val simpleStore = StoreBuilder.barcode<String>()
// .persister(persister)
// .fetcher(fetcher)
// .open()
//
//
// whenever(fetcher.fetch(barCode))
// .thenReturn(NETWORK)
//
// whenever(persister.read(barCode))
// .thenReturn(null)
// .thenReturn(DISK)
//
// whenever(persister.write(barCode, NETWORK))
// .thenReturn(true)
//
// var result = simpleStore.getWithResult(barCode)
//
// assertThat(result.source()).isEqualTo(Result.Source.NETWORK)
// assertThat(result.value()).isEqualTo(DISK)
//
// result = simpleStore.getWithResult(barCode)
// assertThat(result.source()).isEqualTo(Result.Source.CACHE)
// assertThat(result.value()).isEqualTo(DISK)
// verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode)
// }
@Test @Test
fun testDoubleTap() = runBlocking<Unit> { fun testDoubleTap() = runBlocking<Unit> {
@ -112,44 +81,6 @@ class StoreTest {
verify(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
} }
// @Test
// fun testDoubleTapWithResult() = runBlocking<Unit> {
//
// val simpleStore = StoreBuilder.barcode<String>()
// .persister(persister)
// .fetcher(fetcher)
// .open()
//
// val networkSingle = Single.create<String> { emitter ->
// if (counter.incrementAndGet() == 1) {
// emitter.onSuccess(NETWORK)
// } else {
// emitter.onError(RuntimeException("Yo Dawg your inflight is broken"))
// }
// }
//
//
// whenever(fetcher.fetch(barCode))
// .thenReturn(networkSingle)
//
// whenever(persister.read(barCode))
// .thenReturn(null)
// .thenReturn(DISK)
//
// whenever(persister.write(barCode, NETWORK))
// .thenReturn(true)
//
//
// val response = simpleStore.getWithResult(barCode)
// .zipWith(simpleStore.getWithResult(barCode), { s, s2 -> Result.createFromNetwork<T>("hello") })
//
//
// assertThat(response.source()).isEqualTo(Result.Source.NETWORK)
// assertThat(response.value()).isEqualTo("hello")
// verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode)
// }
@Test @Test
fun testSubclass() = runBlocking<Unit> { fun testSubclass() = runBlocking<Unit> {
@ -168,34 +99,9 @@ class StoreTest {
assertThat(value).isEqualTo(DISK) assertThat(value).isEqualTo(DISK)
value = simpleStore.get(barCode) value = simpleStore.get(barCode)
assertThat(value).isEqualTo(DISK) assertThat(value).isEqualTo(DISK)
verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
} }
// @Test
// fun testSubclassWithResult() = runBlocking<Unit> {
//
// val simpleStore = SampleStore(fetcher, persister)
// simpleStore.clear()
//
// whenever(fetcher.fetch(barCode))
// .thenReturn(NETWORK)
//
// whenever(persister.read(barCode))
// .thenReturn(null)
// .thenReturn(DISK)
// whenever(persister.write(barCode, NETWORK)).thenReturn(true)
//
// var result = simpleStore.getWithResult(barCode)
//
// assertThat(result.source()).isEqualTo(Result.Source.NETWORK)
// assertThat(result.value()).isEqualTo(DISK)
//
// result = simpleStore.getWithResult(barCode)
// assertThat(result.source()).isEqualTo(Result.Source.CACHE)
// assertThat(result.value()).isEqualTo(DISK)
// verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode)
// }
@Test @Test
fun testNoopAndDefault() = runBlocking<Unit> { fun testNoopAndDefault() = runBlocking<Unit> {
@ -207,47 +113,20 @@ class StoreTest {
.thenReturn(NETWORK) .thenReturn(NETWORK)
var value = simpleStore.get(barCode) var value = simpleStore.get(barCode)
verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
verify<Persister<String, BarCode>>(persister, times(1)).write(barCode, NETWORK) verify(persister, times(1)).write(barCode, NETWORK)
verify<Persister<String, BarCode>>(persister, times(2)).read(barCode) verify(persister, times(2)).read(barCode)
assertThat(value).isEqualTo(NETWORK) assertThat(value).isEqualTo(NETWORK)
value = simpleStore.get(barCode) value = simpleStore.get(barCode)
verify<Persister<String, BarCode>>(persister, times(2)).read(barCode) verify(persister, times(2)).read(barCode)
verify<Persister<String, BarCode>>(persister, times(1)).write(barCode, NETWORK) verify(persister, times(1)).write(barCode, NETWORK)
verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
assertThat(value).isEqualTo(NETWORK) assertThat(value).isEqualTo(NETWORK)
} }
// @Test
// fun testNoopAndDefaultWithResult() = runBlocking<Unit> {
//
// val persister = spy(NoopPersister.create<String, BarCode>())
// val simpleStore = SampleStore(fetcher, persister)
//
//
// whenever(fetcher.fetch(barCode))
// .thenReturn(NETWORK)
//
// var value = simpleStore.getWithResult(barCode)
// verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode)
// verify<Persister<String, BarCode>>(persister, times(1)).write(barCode, NETWORK)
// verify<Persister<String, BarCode>>(persister, times(2)).read(barCode)
// assertThat(value.source()).isEqualTo(Result.Source.NETWORK)
// assertThat(value.value()).isEqualTo(NETWORK)
//
//
// value = simpleStore.getWithResult(barCode)
// verify<Persister<String, BarCode>>(persister, times(2)).read(barCode)
// verify<Persister<String, BarCode>>(persister, times(1)).write(barCode, NETWORK)
// verify<Fetcher<String, BarCode>>(fetcher, times(1)).fetch(barCode)
//
// assertThat(value.source()).isEqualTo(Result.Source.CACHE)
// assertThat(value.value()).isEqualTo(NETWORK)
// }
@Test @Test
fun testEquivalence() = runBlocking<Unit> { fun testEquivalence() = runBlocking<Unit> {
val cache = CacheBuilder.newBuilder() val cache = CacheBuilder.newBuilder()

View file

@ -48,36 +48,6 @@ class StoreWithParserTest {
verify(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
} }
// @Test
// fun testSimpleWithResult() = runBlocking<Unit> {
// val simpleStore = ParsingStoreBuilder.builder<String, String>()
// .persister(persister)
// .fetcher(fetcher)
// .parser(parser)
// .open()
//
// whenever(fetcher.fetch(barCode))
// .thenReturn(NETWORK)
//
// whenever(persister.read(barCode))
// .thenReturn(null)
// .thenReturn(DISK)
//
// whenever(persister.write(barCode, NETWORK))
// .thenReturn(true)
//
// whenever(parser.apply(DISK)).thenReturn(barCode.key)
//
// var result = simpleStore.getWithResult(barCode)
// assertThat(result.source()).isEqualTo(Result.Source.NETWORK)
// assertThat(result.value()).isEqualTo(barCode.key)
//
// result = simpleStore.getWithResult(barCode)
// assertThat(result.source()).isEqualTo(Result.Source.CACHE)
// assertThat(result.value()).isEqualTo(barCode.key)
// verify(fetcher, times(1)).fetch(barCode)
// }
@Test @Test
fun testSubclass() = runBlocking<Unit> { fun testSubclass() = runBlocking<Unit> {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
@ -103,37 +73,8 @@ class StoreWithParserTest {
verify(fetcher, times(1)).fetch(barCode) verify(fetcher, times(1)).fetch(barCode)
} }
// @Test
// fun testSubclassWithResult() = runBlocking<Unit> {
// MockitoAnnotations.initMocks(this)
//
// val simpleStore = SampleParsingStore(fetcher, persister, parser)
//
// whenever(fetcher.fetch(barCode))
// .thenReturn(NETWORK)
//
// whenever(persister.read(barCode))
// .thenReturn(null)
// .thenReturn(DISK)
//
// whenever(persister.write(barCode, NETWORK))
// .thenReturn(true)
//
// whenever(parser.apply(DISK)).thenReturn(barCode.key)
//
// var result = simpleStore.getWithResult(barCode)
// assertThat(result.source()).isEqualTo(Result.Source.NETWORK)
// assertThat(result.value()).isEqualTo(barCode.key)
//
// result = simpleStore.getWithResult(barCode)
// assertThat(result.source()).isEqualTo(Result.Source.CACHE)
// assertThat(result.value()).isEqualTo(barCode.key)
// verify(fetcher, times(1)).fetch(barCode)
// }
companion object { companion object {
private const val DISK = "persister"
private val DISK = "persister" private const val NETWORK = "fresh"
private val NETWORK = "fresh"
} }
} }