package Ġcom . ol iver one ill . w ilt . data Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . google . firebase . functions . Firebase Functions Exception Ċ import Ġcom . jr ask a . li ved ata . test Ċ import Ġcom . n ha ar man . mock it ok otlin 2 .* Ċ import Ġcom . ol iver one ill . w ilt . Message Ċ import Ġcom . ol iver one ill . w ilt . data . dao . Artist Rank Ċ import Ġcom . ol iver one ill . w ilt . data . dao . Play History Dao Ċ import Ġcom . ol iver one ill . w ilt . view model . Play History Network State Ċ import Ġcom . ol iver one ill . w ilt . view model . Play History State Ċ import Ġjunit . framework . TestCase Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġjava . io . IOException Ċ import Ġjava . time . LocalDate Ċ import Ġjava . util . concurrent . Executor Ċ Ċ class ĠArtist Rank Boundary Callback Test Ġ{ ĊĠĠĠ Ġ// ĠRequired Ġto Ġtest ĠLive Data ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġprivate Ġval ĠpageSize Ġ= Ġ 1 1 L ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfirebase : ĠFirebase API ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdao : ĠPlay History Dao ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġloading State : ĠMutable LiveData < Message < Play History State >> ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġboundary Callback : ĠArtist Rank Boundary Callback ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUseful Ġexecutor Ġfor Ġserial ising Ġfunctions Ġfor Ġtesting ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠCurrent Thread Executor : ĠExecutor Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( run nable : ĠRunnable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunnable ?. run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġfirebase Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġ// ĠDefault Ġvalue Ġof Ġfirebase Ġwill Ġbe Ġsuccess ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( listOf ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġloading State Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġdao Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġboundary Callback Ġ= ĠArtist Rank Boundary Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao , Ġfirebase , Ġloading State , ĠpageSize , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrent Thread Executor () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġfunction Ġto Ġunwrap Ġthe Ġmessage Ġand Ġthe Ġstate . ĠThis Ġwill Ġreturn Ġnull Ġif Ġthere 's Ġno Ġvalue Ġor ĊĠĠĠĠ Ġ* Ġyou 're Ġnot Ġlogged Ġin ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMessage < Play History State >. unwrap State (): ĠPlay History Network State ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠgetContent () ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠPlay History State . LoggedIn ) Ġreturn Ġstate . state ĊĠĠĠĠĠĠĠ ĠTestCase . fail () ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġconvert Ġtimestamps Ġcorrectly `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 4 3 7 9 5 2 0 0 ), Ġeq ( 1 5 5 0 4 4 8 0 0 0 ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġmodify Ġrequest Ġbased Ġon Ġpage Ġsize `() Ġ{ ĊĠĠĠĠĠĠĠ Ġboundary Callback Ġ= ĠArtist Rank Boundary Callback ( dao , Ġfirebase , Ġloading State , Ġ 4 L ) ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 3 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 3 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 5 0 4 4 8 0 0 0 ), Ġeq ( 1 5 5 2 8 6 7 2 0 0 ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġinsert Ġloaded Ġdata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 5 2 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 1 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Bon ĠI ver ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// another domain . com / bl a . png ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( expected )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 4 7 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 1 1 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ty ler , ĠThe ĠCreator ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( dao ). insert ( eq ( expected )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġloading Ġstate Ġwhen Ġloading Ġfrom Ġtop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAssertion Ġis Ġasynchronous Ġand Ġis Ġchecked Ġonce Ġthe Ġnetwork Ġcall Ġis Ġmade ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ġloading Ġstate Ġis Ġloading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . unwrap State () Ġis ĠPlay History Network State . Loading From Top Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġsuccess Ġvalue Ġto Ġstop Ġblocking ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( listOf ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġwe Ġfail Ġif Ġthis Ġisn 't Ġcalled Ġsince Ġotherwise Ġthe Ġassertions Ġare Ġnever Ġactually Ġrun ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( any (), Ġany (), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġloading Ġstate Ġwhen Ġloading Ġfrom Ġbottom `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAssertion Ġis Ġasynchronous Ġand Ġis Ġchecked Ġonce Ġthe Ġnetwork Ġcall Ġis Ġmade ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert Ġloading Ġstate Ġis Ġloading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . unwrap State () Ġis ĠPlay History Network State . Loading From Bottom Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġsuccess Ġvalue Ġto Ġstop Ġblocking ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( listOf ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġwe Ġfail Ġif Ġthis Ġisn 't Ġcalled Ġsince Ġotherwise Ġthe Ġassertions Ġare Ġnever Ġactually Ġrun ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( any (), Ġany (), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġloading Ġstate Ġon Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġa Ġsuccessful Ġvalue ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( listOf ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . unwrap State () Ġis ĠPlay History Network State . Not Loading Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġhandle Ġerror Ġwhen Ġloading Ġfrom Ġtop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ" This Ġis Ġa Ġtest Ġerror Ġfor ĠArtist Rank DataSource " ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠIOException ( expected ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġit . unwrap State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġis ĠPlay History Network State . Failure At Top Ġ&& Ġstate . error Ġ== Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcorrectly Ġset Ġretry Ġwhen Ġloading Ġfrom Ġtop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ" This Ġis Ġa Ġtest Ġerror Ġfor ĠArtist Rank DataSource " ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠIOException ( expected ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġstate Ġthat Ġwas Ġsent ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġloading State . value ?. unwrap State () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlay History Network State . Failure At Top Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . retry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġit Ġmakes Ġthe Ġcorrect Ġcall . ĠThis Ġwill Ġbe Ġthe Ġsecond Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( firebase , Ġtimes ( 2 )). top Art ists Per Week ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( 1 5 1 8 9 9 8 4 0 0 ), Ġeq ( 1 5 2 5 6 5 1 2 0 0 ), Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFail Ġif Ġwe Ġdidn 't Ġget Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . fail () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġhandle Ġerror Ġwhen Ġloading Ġfrom Ġbottom `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ" This Ġis Ġa Ġtest Ġerror Ġfor ĠArtist Rank DataSource " ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠIOException ( expected ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġit . unwrap State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġis ĠPlay History Network State . Failure At Bottom Ġ&& Ġstate . error Ġ== Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġcorrectly Ġset Ġretry Ġwhen Ġloading Ġfrom Ġbottom `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ" This Ġis Ġa Ġtest Ġerror Ġfor ĠArtist Rank DataSource " ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠIOException ( expected ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġstate Ġthat Ġwas Ġsent ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġloading State . value ?. unwrap State () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlay History Network State . Failure At Bottom Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . retry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġit Ġmakes Ġthe Ġcorrect Ġcall . ĠThis Ġwill Ġbe Ġthe Ġsecond Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( firebase , Ġtimes ( 2 )). top Art ists Per Week ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( 1 5 4 3 7 9 5 2 0 0 ), Ġeq ( 1 5 5 0 4 4 8 0 0 0 ), Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFail Ġif Ġwe Ġdidn 't Ġget Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . fail () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġuse Ġcurrent Ġdate Ġif Ġnone Ġspecified `() Ġ{ ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Zero Items Loaded () ĊĠĠĠĠĠĠĠ Ġ// ĠI Ġshould Ġmock Ġthe Ġdate Ġsomehow , Ġbut ĠI Ġthink Ġif ĠI Ġjust Ġtest Ġthat Ġit Ġstill Ġactually Ġmakes Ġa Ġrequest Ġthen Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġshould Ġbe Ġgood Ġenough Ġfor Ġnow ... ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( any (), Ġany (), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġload Ġafter Ġa Ġspecified Ġdate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 1 8 9 9 8 4 0 0 ), Ġeq ( 1 5 2 5 6 5 1 2 0 0 ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġrefresh Ġtwice `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġrefresh Ġthe Ġcurrent Ġweek ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 1 8 9 9 8 4 0 0 ), Ġeq ( 1 5 2 5 6 5 1 2 0 0 ), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġwon 't Ġbother Ġupdating Ġagain Ġsince Ġthis Ġon Item At Front Loaded Ġwas Ġtriggered ĊĠĠĠĠĠĠĠ Ġ// Ġfrom Ġthe Ġrefresh ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( firebase ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġnot Ġrefresh Ġcurrent Ġweek Ġtwice `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġrefresh Ġthe Ġcurrent Ġweek ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 1 8 9 9 8 4 0 0 ), Ġeq ( 1 5 2 5 6 5 1 2 0 0 ), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcallback Ġwill Ġexpect Ġthis Ġbut Ġwe Ġwon 't Ġupdate Ġsince Ġthis Ġis Ġjust Ġfrom ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġupdate Ġof Ġthe Ġcurrent Ġweek ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( firebase ) ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġcall Ġagain Ġit Ġwill Ġnow Ġskip Ġthat Ġweek ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 1 9 6 0 3 2 0 0 ), Ġeq ( 1 5 2 6 2 5 6 0 0 0 ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġnext Ġpage Ġafter Ġrefresh ing Ġnot Ġincluding Ġcurrent Ġweek `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 8 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 8 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġsend Ġback Ġtwo Ġvalues Ġso Ġthat Ġthe Ġcallback Ġknows Ġwe Ġdidn 't Ġjust Ġrefresh Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġweek Ġand Ġthere Ġmay Ġbe Ġmore Ġdata Ġto Ġcome ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( listOf ( item , Ġitem ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġrefresh Ġthe Ġcurrent Ġweek ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 1 8 9 9 8 4 0 0 ), Ġeq ( 1 5 2 5 6 5 1 2 0 0 ), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġshould Ġskip Ġthe Ġcurrent Ġweek Ġand Ġmove Ġonto Ġthe Ġnext Ġone ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 1 9 6 0 3 2 0 0 ), Ġeq ( 1 5 2 6 2 5 6 0 0 0 ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġload Ġbefore Ġa Ġspecified Ġdate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 3 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 3 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġverify ( firebase ). top Art ists Per Week ( eq ( 1 5 4 6 2 1 4 4 0 0 ), Ġeq ( 1 5 5 2 8 6 7 2 0 0 ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġhandle Ġun authenticated Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġmock < Firebase Functions Exception >() ĊĠĠĠĠĠĠĠ Ġwhenever ( error . code ). thenReturn ( Firebase Functions Exception . Code . UN AUTHENT IC ATED ) ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getContent () Ġis ĠPlay History State . Logged Out ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġsend Ġno Ġdata Ġmessage Ġwhen Ġthere 's Ġnothing Ġavailable `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf < Artist Rank >() ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( expected )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Zero Items Loaded () ĊĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġit . unwrap State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġis ĠPlay History Network State . No Rows ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġloading Ġstate Ġcorrectly Ġwhen Ġretry ing Ġfrom Ġtop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( IOException (" "))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At Front Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġstate Ġthat Ġwas Ġsent ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġloading State . value ?. unwrap State () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlay History Network State . Failure At Top Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing Ġon Ġthe Ġnext Ġcall Ġso Ġthat Ġit Ġstays Ġin Ġthe Ġloading Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . retry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġit Ġgoes Ġinto Ġloading Ġfrom Ġbottom Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . unwrap State () Ġis ĠPlay History Network State . Loading From Top Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFail Ġif Ġwe Ġdidn 't Ġget Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . fail () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġloading Ġstate Ġcorrectly Ġwhen Ġretry ing Ġfrom Ġbottom `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( IOException (" "))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠArtist Rank ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 9 - 2 0 1 9 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse (" 2 0 1 9 - 0 2 - 2 5 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" P ine gro ve ", ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ar andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// ano th err andom url . net / img . png ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" spotify :// ar andom url . net / img . png " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Item At End Loaded ( item ) ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġstate Ġthat Ġwas Ġsent ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġloading State . value ?. unwrap State () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlay History Network State . Failure At Bottom Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing Ġon Ġthe Ġnext Ġcall Ġso Ġthat Ġit Ġstays Ġin Ġthe Ġloading Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . retry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġit Ġgoes Ġinto Ġloading Ġfrom Ġbottom Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . unwrap State () Ġis ĠPlay History Network State . Loading From Bottom Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFail Ġif Ġwe Ġdidn 't Ġget Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . fail () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġupdate Ġno Ġrows Ġstate Ġcorrectly Ġwhen Ġretry ing `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe 'll Ġmake Ġthe Ġmock Ġsend Ġback Ġan Ġerror ĊĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . failure ( IOException (" "))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġboundary Callback . on Zero Items Loaded () ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġstate Ġthat Ġwas Ġsent ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġloading State . value ?. unwrap State () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlay History Network State . Failure At Top Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġback Ġan Ġempty Ġresponse Ġto Ġensure Ġwe Ġwill Ġrespond Ġwith Ġno Ġrows Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( firebase . top Art ists Per Week ( any (), Ġany (), Ġany ())). then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Argument <( Result < List < Artist Rank >>) Ġ-> ĠUnit >( 2 )( Result . success ( listOf ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCall Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . retry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġit Ġgoes Ġinto Ġloading Ġfrom Ġbottom Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert HasValue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . unwrap State () Ġis ĠPlay History Network State . No Rows Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFail Ġif Ġwe Ġdidn 't Ġget Ġan Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTestCase . fail () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ