<@U2E974ELT> How can I deterministic test the `loa...
# coroutines
k
@elizarov How can I deterministic test the
loadProducts
method? I thought I did it before but I didnt worked as expected.
Copy code
sealed class ProductsAction
object LoadProducts: ProductsAction()
object FetchProducts: ProductsAction()

class ProductsViewModel(
        private val productDataStore: ProductRepository,
        private val coroutineContext: CoroutineContext)
    : ViewModel(), JobHolder {

    override val job: Job = Job()
    private lateinit var channel: ReceiveChannel<List<Product>>
    private val viewState = MutableLiveData<Result<ProductsUiModel>>()

    fun action(action: ProductsAction) = actor.offer(action)
    fun viewState(): LiveData<Result<ProductsUiModel>> = viewState

    private val actor = actor<ProductsAction>(context = coroutineContext, parent = job) {
        for (action in channel) {
            when (action) {
                is LoadProducts -> loadProducts()
                is FetchProducts -> fetchProducts()
            }
        }
    }

    private suspend fun loadProducts(){
        viewState.postValue(Loading())
        channel = productDataStore.loadProducts(job, coroutineContext)
        channel.consumeEach { products ->
            val uiModel = ProductsUiModel(products)
            viewState.postValue(Success(uiModel))
        }
    }
    override fun onCleared() {
        super.onCleared()
        job.cancel()
    }
}