/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . pl aid app . d ribb ble . ui . shot Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . as Flow Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Return Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġio . pl aid app . core . data . Result Ċ import Ġio . pl aid app . core . d ribb ble . data . Sh ots Repository Ċ import Ġio . pl aid app . core . d ribb ble . data . api . model . Shot Ċ import Ġio . pl aid app . d ribb ble . domain . Create Shot Ui Model UseCase Ċ import Ġio . pl aid app . d ribb ble . domain . Get Share Shot Info UseCase Ċ import Ġio . pl aid app . d ribb ble . domain . Share Shot Info Ċ import Ġio . pl aid app . d ribb ble . test Shot Ċ import Ġio . pl aid app . d ribb ble . test Shot Ui Model Ċ import Ġio . pl aid app . d ribb ble . ui . shot . Shot ViewModel . User Action . Open Link Ċ import Ġio . pl aid app . d ribb ble . ui . shot . Shot ViewModel . User Action . Share Shot Ċ import Ġio . pl aid app . test . shared . provide Fake Cor outines Dispatcher Provider Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . flow . take Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġkotlinx . coroutines . test . set Main Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertNotNull Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ Ċ /** Ċ Ġ* ĠTests Ġfor Ġ[ Shot ViewModel ], Ġmock ing Ġout Ġits Ġdependencies . Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ class ĠShot ViewModel Test Ġ{ ĊĊĠĠĠ Ġ// ĠExec utes Ġtasks Ġin Ġthe ĠArchitecture ĠComponents Ġin Ġthe Ġsame Ġthread ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġprivate Ġval Ġshot Id Ġ= Ġ 1 3 3 7 L ĊĠĠĠ Ġprivate Ġval Ġrepo : ĠSh ots Repository Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġget Share Shot Info UseCase : ĠGet Share Shot Info UseCase Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġcreate Shot Ui Model : ĠCreate Shot Ui Model UseCase Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġrun Blocking Ġ{ Ġinvoke ( any ()) Ġ} Ġ} Ġdo Return Ġtest Shot Ui Model ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġtest Coroutine Dispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġinit Main Dispatcher () Ġ{ ĊĠĠĠĠĠĠĠ ĠDispatch ers . set Main ( test Coroutine Dispatcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Coroutine Dispatcher . cleanup Test Cor outines () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload Shot _ exists In Repo () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthat Ġthe Ġrepo Ġsuccessfully Ġreturns Ġthe Ġrequested Ġshot ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġview Ġmodel Ġis Ġconstructed ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġwith ViewModel () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠShot Ui Model ? Ġ= ĠviewModel . shot Ui Model . current Or Next Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġ< T > ĠLive Data < T >. current Or Next Value () Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . as Flow (). first () ĊĠĠĠ Ġ} Ġcatch Ġ(_ : ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġload Shot _ not In Repo () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthat Ġthe Ġrepo Ġfails Ġto Ġreturn Ġthe Ġrequested Ġshot ĊĠĠĠĠĠĠĠ Ġwhenever ( repo . get Shot ( shot Id )). thenReturn ( Result . Error ( Exception ())) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġview Ġmodel Ġis Ġconstructed ĊĠĠĠĠĠĠĠ ĠShot ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshot Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Shot Ui Model , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Share Shot Info UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovide Fake Cor outines Dispatcher Provider () ĊĠĠĠĠĠĠĠ Ġ). shot Ui Model . current Or Next Value () ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġit Ġthrows ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshot Clicked _ s ends Open Link Event () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġview Ġmodel Ġwith Ġa Ġshot Ġwith Ġa Ġknown ĠURL ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// d ribb ble . com / shots / 2 3 4 4 3 3 4 - Pl aid - Product - Icon " ĊĠĠĠĠĠĠĠ Ġval Ġmock Shot Ui Model Ġ= Ġmock < Shot Ui Model > Ġ{ Ġon Ġ{ Ġthis . url Ġ} Ġdo Return Ġurl Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( create Shot Ui Model . invoke ( any ())). thenReturn ( mock Shot Ui Model ) ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġwith ViewModel ( shot Ġ= Ġtest Shot . copy ( html Url Ġ= Ġurl )) ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġis Ġa Ġrequest Ġto Ġview Ġthe Ġshot ĊĠĠĠĠĠĠĠ ĠviewModel . view Shot Requested () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġan Ġevent Ġis Ġemitted Ġto Ġopen Ġthe Ġgiven Ġurl ĊĠĠĠĠĠĠĠ Ġval Ġopen Link Event Ġ= ĠviewModel . events . poll () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( open Link Event ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( url , Ġ( open Link Event Ġas ĠOpen Link ). url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshot Share Clicked _ s ends Share Info Event () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa ĠVM Ġwith Ġa Ġmocked Ġuse Ġcase Ġwhich Ġreturn Ġa Ġknown ĠShare ĠInfo Ġobject ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠShare Shot Info ( mock (), Ġ" Title ", Ġ" Share ĠText ", Ġ" Mime ") ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġwith ViewModel ( share Info Ġ= Ġexpected ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġis Ġa Ġrequest Ġto Ġshare Ġthe Ġshot ĊĠĠĠĠĠĠĠ ĠviewModel . share Shot Requested () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġan Ġevent Ġis Ġraised Ġwith Ġthe Ġexpected Ġinfo ĊĠĠĠĠĠĠĠ Ġval Ġshare Info Event Ġ= ĠviewModel . events . poll () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( share Info Event ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġ( share Info Event Ġas ĠShare Shot ). info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Ass ist Web Url _ returns Shot Url () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġview Ġmodel Ġwith Ġa Ġshot Ġwith Ġa Ġknown ĠURL ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// d ribb ble . com / shots / 2 3 4 4 3 3 4 - Pl aid - Product - Icon " ĊĠĠĠĠĠĠĠ Ġval Ġmock Shot Ui Model Ġ= Ġmock < Shot Ui Model > Ġ{ Ġon Ġ{ Ġthis . url Ġ} Ġdo Return Ġurl Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( create Shot Ui Model . invoke ( any ())). thenReturn ( mock Shot Ui Model ) ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġwith ViewModel ( shot Ġ= Ġtest Shot . copy ( html Url Ġ= Ġurl )) ĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġit Ġis Ġobserved ĊĠĠĠĠĠĠĠ ĠviewModel . shot Ui Model . current Or Next Value () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġis Ġa Ġrequest Ġto Ġshare Ġthe Ġshot ĊĠĠĠĠĠĠĠ Ġval Ġassist Web Url Ġ= ĠviewModel . get Ass ist Web Url () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġexpected ĠURL Ġis Ġreturned ĊĠĠĠĠĠĠĠ ĠassertEquals ( url , Ġassist Web Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Shot Id _ returns Id () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġview Ġmodel Ġwith Ġa Ġshot Ġwith Ġa Ġknown ĠID ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ 1 2 3 4 L ĊĠĠĠĠĠĠĠ Ġval Ġmock Shot Ui Model Ġ= Ġmock < Shot Ui Model > Ġ{ Ġon Ġ{ Ġthis . id Ġ} Ġdo Return Ġid Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( create Shot Ui Model . invoke ( any ())). thenReturn ( mock Shot Ui Model ) ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġwith ViewModel ( shot Ġ= Ġtest Shot . copy ( id Ġ= Ġid )) ĊĠĠĠĠĠĠĠ Ġ// Ġensure Ġit Ġis Ġobserved ĊĠĠĠĠĠĠĠ ĠviewModel . shot Ui Model . current Or Next Value () ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġis Ġa Ġrequest Ġto Ġshare Ġthe Ġshot ĊĠĠĠĠĠĠĠ Ġval Ġshot Id Ġ= ĠviewModel . get Shot Id () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġexpected ĠID Ġis Ġreturned ĊĠĠĠĠĠĠĠ ĠassertEquals ( id , Ġshot Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġload Shot _ em its Two Ui Models () Ġ= Ġtest Coroutine Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġcor outines Ġhave Ġnot Ġstarted Ġyet Ġand Ġthe ĠView ĠModel Ġis Ġcreated ĊĠĠĠĠĠĠĠ Ġtest Coroutine Dispatcher . pause Dispatcher () ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġwith ViewModel () ĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . shot Ui Model . as Flow (). take ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" hello Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest Coroutine Dispatcher . run Current () ĊĠĠĠĠĠĠĠ ĠassertEquals ( collection . await (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . formatted Description . isEmpty () ĊĠĠĠĠĠĠĠ Ġ}, ĠlistOf ( true , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwith ViewModel ( ĊĠĠĠĠĠĠĠ Ġshot : ĠShot Ġ= Ġtest Shot , ĊĠĠĠĠĠĠĠ Ġshare Info : ĠShare Shot Info ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠShot ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( repo . get Shot ( shot Id )). thenReturn ( Result . Success ( shot )) ĊĠĠĠĠĠĠĠ Ġif Ġ( share Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( get Share Shot Info UseCase ( any ())). thenReturn ( share Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠShot ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshot Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepo , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Shot Ui Model , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Share Shot Info UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovide Fake Cor outines Dispatcher Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Coroutine Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Coroutine Dispatcher , Ġtest Coroutine Dispatcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ