/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠZ UP ĠIT ĠSER V IC OS ĠEM ĠT EC NO LOG IA ĠE ĠIN OV AC AO ĠSA Ċ Ġ* Ċ Ġ* Ġ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 Ġbr . com . z up . be agle . android . view . view model Ċ Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġbr . com . z up . be agle . android . Base Test Ċ import Ġbr . com . z up . be agle . android . action . Action Ċ import Ġbr . com . z up . be agle . android . components . layout . Screen Component Ċ import Ġbr . com . z up . be agle . android . data . Action Request er Ċ import Ġbr . com . z up . be agle . android . data . Component Request er Ċ import Ġbr . com . z up . be agle . android . exception . Be agle Exception Ċ import Ġbr . com . z up . be agle . android . extensions . once Ċ import Ġbr . com . z up . be agle . android . testutil . Cor outines Test Extension Ċ import Ġbr . com . z up . be agle . android . testutil . Instant Executor Extension Ċ import Ġbr . com . z up . be agle . android . testutil . Random Data Ċ import Ġbr . com . z up . be agle . android . view . Screen Request Ċ import Ġbr . com . z up . be agle . core . Identifier Component Ċ import Ġbr . com . z up . be agle . core . Server D riven Component Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Order Ċ import Ġio . mock k . co Verify Sequence Ċ import Ġio . mock k . every Ċ import Ġio . mock k . impl . annotations . Mock K Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Job Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Assertions . assertFalse Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ Ċ @ Experimental Cor outines Api Ċ @ Extend With ( Instant Executor Extension :: class , ĠCor outines Test Extension :: class ) Ċ class ĠBe agle ViewModel Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcomponent : ĠServer D riven Component ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaction : ĠAction ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcomponent Request er : ĠComponent Request er ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaction Request er : ĠAction Request er ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġobserver : ĠObserver < ViewState > ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbe agle UI ViewModel : ĠBe agle ViewModel ĊĊĠĠĠ Ġprivate Ġval Ġslot ViewState Ġ= Ġmutable ListOf < ViewState >() ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setUp () ĊĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel Ġ= ĠBe agle ViewModel ( component Request er Ġ= Ġcomponent Request er ) ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcomponent Request er . fetch Component ( any ()) Ġ} Ġreturns Ġcomponent ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġaction Request er . fetch Action ( any ()) Ġ} Ġreturns Ġaction ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġobserver . on Changed ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġobserver . on Changed ( capture ( slot ViewState )) Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġscreen Request ĠWHEN Ġfetch ĠSHO ULD Ġreturn Ġrender ĠView State `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ( Random Data . http Url ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġco Verify Order Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Do Render ( screen Request . url , Ġcomponent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( false )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġscreen Request Ġthrows Ġexception ĠWHEN Ġfetch ĠSHO ULD Ġreturn Ġa Ġerror ĠView State `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ( Random Data . http Url ()) ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠBe agle Exception (" Error ") ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcomponent Request er . fetch Component ( any ()) Ġ} Ġthrows Ġexception ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( any < ViewState . Error >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( false )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa Ġscreen Request Ġthrows Ġexception ĠWHEN Ġfetch ĠSHO ULD Ġreturn Ġa Ġerror ĠView State Ġretry `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ( Random Data . http Url ()) ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠBe agle Exception (" Error ") ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcomponent Request er . fetch Component ( any ()) Ġ} Ġthrows Ġexception Ġand Then Ġcomponent ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request , Ġnull ). observe Fore ver ( observer ) ĊĠĠĠĠĠĠĠ Ġ( slot ViewState [ 1 ] Ġas ĠView State . Error ). retry . invoke () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġco Verify Order Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( any < ViewState . Error >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Do Render ( screen Request . url , Ġcomponent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . on Changed ( ViewState . Loading ( false )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠServer D riven Component ĠWHEN Ġfetch Components Ġcalled ĠSHO ULD Ġpost ĠView State Ġdo Render Ġ` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// G IV EN ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ("") ĊĊĠĠĠĠĠĠĠ Ġ// WHEN ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request , Ġcomponent ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġonce ()) Ġ{ Ġobserver . on Changed ( ViewState . Do Render ( null , Ġcomponent )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠIdentifier Component ĠWHEN Ġfetch Components Ġcalled ĠSHO ULD Ġpost ĠView State Ġdo Render Ġ` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// G IV EN ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ("") ĊĠĠĠĠĠĠĠ Ġval Ġcomponent : ĠIdentifier Component Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcomponent . id Ġ} Ġreturns Ġid ĊĊĠĠĠĠĠĠĠ Ġ// WHEN ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request , Ġcomponent ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġonce ()) Ġ{ Ġobserver . on Changed ( ViewState . Do Render ( id , Ġcomponent )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠNULL ĠScreen Component ĠWHEN Ġfetch Components Ġcalled ĠSHO ULD Ġpost ĠView State Ġdo Render Ġ` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// G IV EN ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request (" url ") ĊĊĊĠĠĠĠĠĠĠ Ġ// WHEN ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request , Ġnull ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġonce ()) Ġ{ Ġobserver . on Changed ( ViewState . Do Render ( screen Request . url , Ġcomponent )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġscreen Ġwith Ġfull Ġpath ĠWHEN Ġfetch Components Ġcalled ĠSHO ULD Ġpost ĠView State Ġdo Render Ġwith Ġcorrect Ġscreen Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// G IV EN ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbe agle Sdk . config . baseUrl Ġ} Ġreturns Ġ" http :// localhost : 2 0 2 0 /" ĊĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request (" http :// localhost : 2 0 2 0 / test ") ĊĊĠĠĠĠĠĠĠ Ġ// WHEN ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request , Ġnull ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġonce ()) Ġ{ Ġobserver . on Changed ( ViewState . Do Render (" test ", Ġcomponent )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GI IV EN Ġa ĠScreen Component ĠWHEN Ġfetch Component Ġcalled ĠSHO ULD Ġuse Ġidentifier Ġas Ġscreen Id Ġon ĠView State Ġdo Render `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ("") ĊĠĠĠĠĠĠĠ Ġval Ġcomponent : ĠScreen Component Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= Ġ" identifier " ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcomponent . id Ġ} Ġreturns Ġid ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcomponent . identifier Ġ} Ġreturns Ġidentifier ĊĊĠĠĠĠĠĠĠ Ġ// WHEN ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request , Ġcomponent ). observe Fore ver ( observer ) ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġonce ()) Ġ{ Ġobserver . on Changed ( ViewState . Do Render ( identifier , Ġcomponent )) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠNULL ĠFetch Component LiveData ĠWHEN Ġis Fetch Component Ġcalled ĠSHO ULD Ġreturn Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// WHEN ĊĠĠĠĠĠĠĠ Ġval Ġis Fetch Ġ= Ġbe agle UI ViewModel . is Fetch Component () ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ ĠassertFalse Ġ{ Ġis Fetch Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠNULL ĠJob Ġin ĠFetch Component LiveData ĠWHEN Ġis Fetch Component Ġcalled ĠSHO ULD Ġreturn Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ("") ĊĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request ) ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ?. job Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġis Fetch Ġ= Ġbe agle UI ViewModel . is Fetch Component () ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ ĠassertFalse Ġ{ Ġis Fetch Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠJob ĠCOMP LETED Ġin ĠFetch Component LiveData ĠWHEN Ġis Fetch Component Ġcalled ĠSHO ULD Ġreturn Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ("") ĊĠĠĠĠĠĠĠ Ġval Ġmock Job Ġ= ĠJob () ĊĠĠĠĠĠĠĠ Ġmock Job . complete () ĊĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request ) ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ?. job Ġ= Ġmock Job ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġis Fetch Ġ= Ġbe agle UI ViewModel . is Fetch Component () ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ ĠassertFalse Ġ{ Ġis Fetch Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` G IV EN Ġa ĠJob ĠNOT ĠCOMP LETED Ġin ĠFetch Component LiveData ĠWHEN Ġis Fetch Component Ġcalled ĠSHO ULD Ġpost ĠView State Ġdo Cancel Ġand Ġreturn Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Given ĊĠĠĠĠĠĠĠ Ġval Ġscreen Request Ġ= ĠScreen Request ("") ĊĠĠĠĠĠĠĠ Ġval Ġmock Job Ġ= ĠJob () ĊĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ( screen Request ). observe Fore ver ( observer ) ĊĠĠĠĠĠĠĠ Ġbe agle UI ViewModel . fetch Component ?. job Ġ= Ġmock Job ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġval Ġis Fetch Ġ= Ġbe agle UI ViewModel . is Fetch Component () ĊĊĠĠĠĠĠĠĠ Ġ// THEN ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġmock Job . is Cancelled Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġonce ()) Ġ{ Ġobserver . on Changed ( ViewState . Do Cancel ) Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġis Fetch Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ