/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC . Ċ Ġ* Ċ Ġ* Ġ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 . core . designer news . data . login Ċ Ċ 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 . designer news . data . login . model . LoggedIn User Ċ import Ġjava . io . IOException Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertNull Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ Ċ /** Ċ Ġ* ĠTests Ġfor Ġ[ Login Repository ] Ġusing Ġshared Ġpreferences Ġfrom Ġinstrument ation Ġcontext Ċ Ġ* Ġfor Ġbuilding Ġthe Ġlocal Ġand Ġremote Ġdata Ġsources , Ġand Ġmocked ĠAPI Ġservice . Ċ Ġ*/ Ċ class ĠLogin Repository Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġusername Ġ= Ġ" user " ĊĠĠĠ Ġprivate Ġval Ġpass Ġ= Ġ" pass " ĊĠĠĠ Ġprivate Ġval Ġuser Ġ= ĠLog ged In User ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġ" Pl a ida ", ĊĠĠĠĠĠĠĠ ĠlastName Ġ= Ġ" Pl aid ich ", ĊĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġ" Pl a ida ĠP la id ich ", ĊĠĠĠĠĠĠĠ Ġpor trait Url Ġ= Ġ" www ", ĊĠĠĠĠĠĠĠ Ġup votes Ġ= ĠlistOf ( 1 L , Ġ 2 L , Ġ 4 4 4 L ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġlocal DataSource : ĠLogin Local DataSource Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġremote DataSource : ĠLogin Remote DataSource Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġrepository Ġ= ĠLogin Repository ( local DataSource , Ġremote DataSource ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġis Not LoggedIn _ by Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġno Ġuser Ġwas Ġlogged Ġin ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġlogged Ġin Ġrepository Ġflag Ġis Ġfalse ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository . is LoggedIn ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġis LoggedIn _ after Successful Login () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthat Ġthe Ġlogin Ġwill Ġbe Ġsuccessful ĊĠĠĠĠĠĠĠ Ġwith Login Successful ( username , Ġpass ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġlogging Ġin ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrepository . login ( username , Ġpass ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġsuccess Ġresult Ġis Ġreturned ĊĠĠĠĠĠĠĠ ĠassertEquals ( Result . Success ( user ), Ġresult ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġuser Ġis Ġlogged Ġin ĊĠĠĠĠĠĠĠ ĠassertTrue ( repository . is LoggedIn ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġuser Ġcached Ġis Ġthe Ġexpected Ġuser ĊĠĠĠĠĠĠĠ ĠassertEquals ( repository . user , Ġuser ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġuser Null _ by Default () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNull ( repository . user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlogout () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġlogging Ġout ĊĠĠĠĠĠĠĠ Ġrepository . logout () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġuser Ġis Ġnot Ġlogged Ġin ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository . is LoggedIn ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcached Ġuser Ġis Ġnull ĊĠĠĠĠĠĠĠ ĠassertNull ( repository . user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlogout _ after Login () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġlogged Ġin Ġuser ĊĠĠĠĠĠĠĠ Ġwith Login Successful ( username , Ġpass ) ĊĠĠĠĠĠĠĠ Ġrepository . login ( username , Ġpass ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġlogging Ġout ĊĠĠĠĠĠĠĠ Ġrepository . logout () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġuser Ġis Ġlogged Ġout ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository . is LoggedIn ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcached Ġuser Ġis Ġnull ĊĠĠĠĠĠĠĠ ĠassertNull ( repository . user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġis Not LoggedIn _ after Failed Login () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthat Ġthe Ġlogin Ġwill Ġfail ĊĠĠĠĠĠĠĠ Ġwith Login Failed ( username , Ġpass ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġlogging Ġin ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrepository . login ( username , Ġpass ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġerror Ġresult Ġis Ġreturned ĊĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠResult . Error ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġuser Ġis Ġnot Ġlogged Ġin ĊĠĠĠĠĠĠĠ ĠassertFalse ( repository . is LoggedIn ) ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcached Ġuser Ġis Ġnull ĊĠĠĠĠĠĠĠ ĠassertNull ( repository . user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwith Login Successful ( username : ĠString , Ġpass : ĠString ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠResult . Success ( user ) ĊĠĠĠĠĠĠĠ Ġwhenever ( remote DataSource . login ( username , Ġpass )). thenReturn ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwith Login Failed ( username : ĠString , Ġpass : ĠString ) Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( remote DataSource . login ( username , Ġpass )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Result . Error ( IOException (" error "))) ĊĠĠĠ Ġ} Ċ } Ċ