Skip to content

Instantly share code, notes, and snippets.

View shredderskelton's full-sized avatar

Nick Skelton shredderskelton

View GitHub Profile
sealed class MyResult<T> {
sealed class Success<T>(val data: T) : MyResult<T>() {
class Network<T>(data: T) : Success<T>(data)
class Cache<T>(data: T) : Success<T>(data)
}
data class Failure<T>(val error: String) : MyResult<T>()
}
@shredderskelton
shredderskelton / Hot Flow Turbine.kt
Created February 21, 2021 12:07
Hot Flow Turbine
@Test
fun `hot flow - Turbine`() {
runBlocking {
MutableStateFlow("test").test {
assertThat(expectItem()).isEqualTo("test")
cancelAndIgnoreRemainingEvents()
}
}
}
@shredderskelton
shredderskelton / Cold Flow Turbine.kt
Created February 21, 2021 12:04
Cold Flow Turbine
/**
* Unit Testing Cold Flows with Turbine
*/
@Test
fun `cold flow - take multiple - Turbine`() {
runBlocking {
flow {
emit("test")
@shredderskelton
shredderskelton / Unit Test Hot Flow Take.kt
Created February 21, 2021 11:45
Unit Test Hot Flow Take
/**
* Unit Testing Hot Flows the Android recommended way
*/
@Ignore
@Test
fun `hot flow - hangs`() {
runBlocking {
val actual = MutableStateFlow("test").single()
@shredderskelton
shredderskelton / Unit Test Cold Flow Take.kt
Created February 21, 2021 11:36
Unit Test Cold Flow Take
/**
* Unit Testing Cold Flows the Android recommended way
*/
@Test
fun `cold flow - take multiple - Android recommended - Success!`() {
runBlocking {
val actual = mutableListOf<String>()
flow {
@shredderskelton
shredderskelton / RxScheduler.kt
Created February 20, 2021 15:05
RxScheduler
class RxSchedulersOverrideRule(private val scheduler: Scheduler = TestScheduler()) : TestRule {
private val handler = Function<Scheduler, Scheduler> { scheduler }
override fun apply(base: Statement, description: Description): Statement =
object : Statement() {
override fun evaluate() {
RxJavaPlugins.reset()
RxAndroidPlugins.reset()
RxJavaPlugins.setIoSchedulerHandler(handler)
@shredderskelton
shredderskelton / TestCoroutineRule.kt
Created February 20, 2021 14:26
TestCoroutineRule
class TestCoroutineRule(
val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()
) : TestWatcher() {
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(testDispatcher)
}
@shredderskelton
shredderskelton / PeopleTest.kt
Created February 20, 2021 13:57
PeopleTest
class PeopleViewModelTest {
private lateinit var underTest: PeopleViewModel
private val service = mock<StarWarsService> {
onBlocking { getPeople() }
.then {
flow {
// Simulate multiple requests to backend
emit(Result.Success(listOf(dummyPerson)))
@shredderskelton
shredderskelton / LiveDataTestObserver.kt
Created February 19, 2021 19:06
LiveDataTestObserver
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.asLiveData
import kotlinx.coroutines.flow.Flow
class LiveDataTestObserver<T> : Observer<T> {
val observedValues = mutableListOf<T>()
override fun onChanged(value: T) {
@shredderskelton
shredderskelton / slowinxcollector.kt
Created February 11, 2021 07:58
SlowIndexedCollector
FirebaseStorage.getInstance().reference.download("tanz.mov")
.collectIndexed { _, result: DownloadResult ->
delay(5000)
updateScreen(result)
}