package Ġcom . m ct ech . show case . feature . f lick er _ data . photo Ċ Ċ import Ġcom . m ct ech . show case . feature . f lick er _ data . photo . remote . F lick er Remote DataSource Ċ import Ġcom . m ct ech . show case . feature . f lick er _ domain . service . F lick er Service Ċ import Ġcom . m ct ech . testing . data _ factory . F lick er Photos Data Factory Ċ import Ġcom . m ct ech . testing . data _ factory . sus pended Test Scenario Ċ import Ġcom . n ha ar man . mock it ok otlin 2 .* Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMAY CON ĠCAR DO SO Ġon Ġ 2 0 2 0 - 0 3 - 0 1 . Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ class ĠF lick er Strategy Repository Test { ĊĠĠĠ Ġprivate Ġval Ġtag ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ" cat " ĊĠĠĠ Ġprivate Ġval Ġcache Expected Value ĠĠĠĠĠ Ġ= ĠF lick er Photos Data Factory . listOf ( 5 ) ĊĠĠĠ Ġprivate Ġval Ġdata Base Expected Value ĠĠ Ġ= ĠF lick er Photos Data Factory . listOf ( 5 ) ĊĠĠĠ Ġprivate Ġval Ġremote Expected Value ĠĠĠĠ Ġ= ĠF lick er Photos Data Factory . listOf ( 5 ) ĊĊĠĠĠ Ġprivate Ġval Ġcache DataSource ĠĠĠĠĠĠĠĠ Ġ= Ġmock < F lick er St orable Service >() ĊĠĠĠ Ġprivate Ġval Ġdatabase DataSource ĠĠĠĠĠ Ġ= Ġmock < F lick er St orable Service >() ĊĠĠĠ Ġprivate Ġval Ġremote DataSource ĠĠĠĠĠĠĠ Ġ= Ġmock < F lick er Remote DataSource >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice : ĠF lick er Service ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġ` before Ġeach Ġtest `() Ġ{ ĊĠĠĠĠĠĠĠ Ġservice Ġ= ĠF lick er Strategy Repository ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache DataSource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase DataSource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote DataSource ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġdelegate Ġclean Ġcache Ġcall `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . clean Cache ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). delete All By Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database DataSource ). delete All By Tag ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( remote DataSource ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfrom Ġcache Ġfirst Ġpage `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġscenario Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhenever ( cache DataSource . restore ( any (), Ġany ())). thenReturn ( cache Expected Value ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load First Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). restore ( tag , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( database DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( remote DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( cache Expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfrom Ġcache Ġother Ġpage `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġscenario Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( cache DataSource . restore ( any (), Ġany ())). thenReturn ( cache Expected Value ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load First Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load Next Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). restore ( tag , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( database DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( remote DataSource ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( cache Expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfrom Ġdatabase Ġfirst Ġpage `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġscenario Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhenever ( cache DataSource . restore ( any (), Ġany ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠ Ġwhenever ( database DataSource . restore ( any (), Ġany ())). thenReturn ( data Base Expected Value ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load First Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database DataSource ). restore ( tag , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). save ( tag , Ġ 1 , Ġdata Base Expected Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( remote DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( data Base Expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfrom Ġdatabase Ġother Ġpage `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġscenario Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( cache DataSource . restore ( any (), Ġany ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( database DataSource . restore ( any (), Ġany ())). thenReturn ( data Base Expected Value ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load First Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load Next Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database DataSource ). restore ( tag , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). save ( tag , Ġ 2 , Ġdata Base Expected Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( remote DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( data Base Expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfrom Ġserver Ġfirst Ġpage `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġscenario Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhenever ( cache DataSource . restore ( any (), Ġany ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠ Ġwhenever ( database DataSource . restore ( any (), Ġany ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠ Ġwhenever ( remote DataSource . load Photos By Page ( any (), Ġany ())). thenReturn ( remote Expected Value ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load First Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote DataSource ). load Photos By Page ( tag , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). save ( tag , Ġ 1 , Ġremote Expected Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database DataSource ). save ( tag , Ġ 1 , Ġremote Expected Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( remote Expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġfrom Ġserver Ġother Ġpage `() Ġ= Ġsus pended Test Scenario ( ĊĠĠĠĠĠĠĠ Ġscenario Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( cache DataSource . restore ( any (), Ġany ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( database DataSource . restore ( any (), Ġany ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( remote DataSource . load Photos By Page ( any (), Ġany ())). thenReturn ( remote Expected Value ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load First Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . load Next Page Of Photos ( tag ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġassertions Ġ= Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote DataSource ). load Photos By Page ( tag , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( cache DataSource ). save ( tag , Ġ 2 , Ġremote Expected Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database DataSource ). save ( tag , Ġ 2 , Ġremote Expected Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( remote Expected Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ Ċ }