package Ġcom . sher az . list repos . data . repository Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . paging . DataSource Ċ import Ġcom . n ha ar man . mock it ok otlin 2 .* Ċ import Ġcom . sher az . list repos . data . Cor outines Dispatcher Provider Ċ import Ġcom . sher az . list repos . data . db . dao . GitHub Repo Entity Dao Ċ import Ġcom . sher az . list repos . data . db . entity . GitHub Repo Entity Ċ import Ġcom . sher az . list repos . data . db . mapper . Db Repo Mapper Ċ import Ġcom . sher az . list repos . data . network . GitHub Network DataSource Ċ import Ġcom . sher az . list repos . shared . af Quick Look View Ċ import Ġcom . sher az . list repos . shared . ami ando Repo Ċ import Ġcom . sher az . list repos . shared . provide Fake Cor outines Dispatcher Provider Ċ import Ġcom . sher az . list repos . ui . models . GitHub Repo Item Ċ import Ġcom . sher az . list repos . utils . Logger Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertNotNull Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . junit . Mockito JUnit Runner Ċ import Ġorg . mockito . stub bing . Answer ĊĊ Ċ /** Ċ Ġ* ĠTests Ġfor Ġ[ App Repository ] Ġclass Ċ Ġ*/ Ċ @ RunWith ( Mockito JUnit Runner :: class ) Ċ class ĠApp Repository Test Ġ{ ĊĊĠĠĠ Ġ// ĠExec utes Ġtasks Ġin Ġthe ĠArchitecture ĠComponents Ġin Ġthe Ġsame Ġthread ĊĠĠĠ Ġ// ĠWe Ġdon 't Ġwant Ġanything Ġhappening Ġon Ġbackground Ġthread , ĊĠĠĠ Ġ// ĠWe Ġwant Ġthings Ġto Ġhappen Ġsynchronous ly ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĊĠĠĠ Ġprivate Ġval Ġdb Repo Mapper : ĠDb Repo Mapper Ġ= Ġmock () ĊĊĠĠĠ Ġprivate Ġval Ġrepo List Ġ= ĠlistOf ( ami ando Repo , Ġaf Quick Look View ) ĊĊĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġgit Hub Repo Entity Dao : ĠGitHub Repo Entity Dao Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġgit Hub Network DataSource : ĠGitHub Network DataSource Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġdispatcher Provider : ĠCor outines Dispatcher Provider Ġ= Ġprovide Fake Cor outines Dispatcher Provider () ĊĠĠĠ Ġprivate Ġval Ġfake LiveData : ĠLive Data < Result < List < GitHub Repo Entity >>> Ġ= Ġmock () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Repository : ĠApp Repository ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġbuild App Repository () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhenever ( git Hub Network DataSource . downloaded GitHub Repo List ). thenReturn ( fake LiveData ) ĊĠĠĠĠĠĠĠ Ġapp Repository Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Repository Impl ( logger , Ġdb Repo Mapper , Ġgit Hub Repo Entity Dao , Ġgit Hub Network DataSource , Ġdispatcher Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrefresh List _ with At Least One Network Call () Ġ= Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthe Ġrefresh Ġrepos Ġlist Ġhappens ĊĠĠĠĠĠĠĠ Ġapp Repository . refresh Repos List () ĊĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġat Ġleast Ġonce Ġthe Ġnetwork Ġsources Ġcalls Ġload GitHub Repos () Ġmethod ĊĠĠĠĠĠĠĠ Ġverify ( git Hub Network DataSource ). load GitHub Repos ( 1 , ĠApp Repository . NETWORK _ PAGE _ SIZE ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrefresh List _ with At Least One Network Call _ with Argument Captor () Ġ= Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthe Ġrefresh Ġrepos Ġlist Ġhappens ĊĠĠĠĠĠĠĠ Ġapp Repository . refresh Repos List () ĊĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġonly Ġonce Ġload GitHub Repos () Ġmethod Ġis Ġcalled ĊĠĠĠĠĠĠĠ Ġ// Ġwith Ġcorrect Ġarguments ĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < Int >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( git Hub Network DataSource , Ġtimes ( 1 )). load GitHub Repos ( capture (), Ġcapture ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcapt or . all Values . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . first Value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( App Repository . NETWORK _ PAGE _ SIZE , Ġcapt or . second Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclear Cache _ with At Least One Dao MethodCall () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthe Ġclear Ġcache Ġis Ġtriggered ĊĠĠĠĠĠĠĠ Ġapp Repository . clear Cache () ĊĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġonce ĠDAO Ġmethod Ġcall Ġis Ġinvoked ĊĠĠĠĠĠĠĠ Ġverify ( git Hub Repo Entity Dao , Ġtimes ( 1 )). delete All () ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġ@ Test Ċ // ĠĠĠ Ġfun Ġget LiveData () Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthe Ġlive Ġdata Ġis Ġrequested Ċ // ĠĠĠĠĠĠĠ Ġwhenever ( git Hub Repo Entity Dao . getAll Repos Paged ()). thenReturn ( fake DataSource Entity ) Ċ // ĠĠĠĠĠĠĠ Ġwhenever ( db Repo Mapper . from Db ( any ())). thenReturn ( git Repo ItemList [ 0 ]) Ċ // ĠĠĠĠĠĠĠ Ġwhenever ( db Repo Mapper . from Db ( any ())). then Answer ( Answer < GitHub Repo Item > Ġ{ Ġreturn @ Answer Ġgit Repo ItemList [ 0 ] Ġ}) Ċ // ĠĠĠĠĠĠĠ Ġwhenever ( fake DataSource Entity . map Ġ{ Ġdb Repo Mapper . from Db ( any ()) Ġas ĠGitHub Repo Item Ġ}). then Answer ( Answer < GitHub Repo Item > Ġ{ Ġreturn @ Answer Ġgit Repo ItemList [ 0 ] Ġ}) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġwhenever ( app Repository . getAll Repos Paged Factory ()). thenReturn ( fake DataSource Item ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// ĠWhen Ġwe Ġrequest Ġlive Ġdata Ċ // ĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġapp Repository . get LiveData Paged List () Ċ // Ċ // ĠĠĠĠĠĠĠ ĠassertNotNull ( live Data ) Ċ // ĠĠĠ Ġ} Ċ }