package Ġcom . ou day . pokemon . details Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġcom . ou day . pokemon . details . data . model . response . Pokemon Details Response Ċ import Ġcom . ou day . pokemon . details . data . repo . Pokemon Details Repository Impl Ċ import Ġcom . ou day . pokemon . details . data . service . Pokemon Details Service Ċ import Ġcom . ou day . pokemon . utils . Base UnitTest Ċ import Ġjunit . framework . TestCase Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Test Ċ Ċ private Ġconst Ġval ĠPO KE MON _ ID Ġ= Ġ 5 Ċ Ċ class ĠPokemon Details Repository Should : ĠBase UnitTest () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġservice : ĠPokemon Details Service Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġpokemon Response : ĠPokemon Details Response Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġbackend ErrorException Ġ= ĠRuntimeException (" Backend Ġerror ") ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfetch Pokemon Details From Service () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġmock Successful Case () ĊĠĠĠĠĠĠĠ Ġrepository . fetch Pokemon Details ( PO KE MON _ ID ) ĊĠĠĠĠĠĠĠ Ġverify ( service , Ġtimes ( 1 )). fetch Pokemon Details ( PO KE MON _ ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġemit Pokemon Details From Service () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġmock Successful Case () ĊĠĠĠĠĠĠĠ ĠTestCase . assertEquals ( pokemon Response , Ġrepository . fetch Pokemon Details ( PO KE MON _ ID ). first (). get OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġpropagate Errors () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= Ġmock Error Case () ĊĠĠĠĠĠĠĠ ĠTestCase . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend ErrorException , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . fetch Pokemon Details ( PO KE MON _ ID ). first (). exception OrNull () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġemits Error Result When Network Fails () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Error Case () ĊĠĠĠĠĠĠĠ ĠTestCase . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend ErrorException , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . fetch Pokemon Details ( PO KE MON _ ID ). first (). exception OrNull () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconvert Values To Flow Result And Emit s The m () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Successful Case () ĊĠĠĠĠĠĠĠ ĠTestCase . assertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . success ( pokemon Response ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . fetch Pokemon Details ( PO KE MON _ ID ). first () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġmock Error Case (): ĠPokemon Details Repository Impl Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( service . fetch Pokemon Details ( PO KE MON _ ID )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Result . failure < Pokemon Details Response >( backend ErrorException )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPokemon Details Repository Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġmock Successful Case (): ĠPokemon Details Repository Impl Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( service . fetch Pokemon Details ( PO KE MON _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( Result . success ( pokemon Response )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn ĠPokemon Details Repository Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ }