/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . example . android . architecture . blueprint s . todo app . data . source . local Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Medium Test Ċ import Ġcom . example . android . architecture . blueprint s . todo app . Main Coroutine Rule Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Result . Success Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . Task Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . source . Tasks DataSource Ċ import Ġcom . example . android . architecture . blueprint s . todo app . data . succeeded Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . hamcrest . Core Matchers .` is ` Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ /** Ċ Ġ* ĠIntegration Ġtest Ġfor Ġthe Ġ[ Tasks DataSource ]. Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Medium Test Ċ class ĠTasks Local DataSource Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlocal DataSource : ĠTasks Local DataSource ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase : ĠTo Do Database ĊĊĠĠĠ Ġ// ĠSet Ġthe Ġmain Ġcor outines Ġdispatcher Ġfor Ġunit Ġtesting . ĊĠĠĠ Ġ@ Experimental Cor outines Api ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġmain Coroutine Rule Ġ= ĠMain Coroutine Rule () ĊĊĠĠĠ Ġ// ĠExec utes Ġeach Ġtask Ġsynchronous ly Ġusing ĠArchitecture ĠComponents . ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġusing Ġan Ġin - memory Ġdatabase Ġfor Ġtesting , Ġsince Ġit Ġdoesn 't Ġsurv ive Ġk illing Ġthe Ġprocess ĊĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠRoom . in Memory Database Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Provider . getApplicationContext (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTo Do Database :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow MainThread Queries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġlocal DataSource Ġ= ĠTasks Local DataSource ( database . task Dao (), ĠDispatch ers . Main ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġclean Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Task _ retrie ves Task () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG IV EN Ġ- Ġa Ġnew Ġtask Ġsaved Ġin Ġthe Ġdatabase ĊĠĠĠĠĠĠĠ Ġval Ġnew Task Ġ= ĠTask (" title ", Ġ" description ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWHEN Ġ Ġ- ĠTask Ġretrieved Ġby ĠID ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlocal DataSource . get Task ( new Task . id ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTHEN Ġ- ĠSame Ġtask Ġis Ġreturned ĊĠĠĠĠĠĠĠ ĠassertThat ( result . succeeded , Ġ` is `( true )) ĊĠĠĠĠĠĠĠ Ġresult Ġas ĠSuccess ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . title , Ġ` is ` (" title ")) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . description , Ġ` is ` (" description ")) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . is Completed , Ġ` is `( true )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcomplete Task _ retrie ved Task Is Complete () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġnew Ġtask Ġin Ġthe Ġpersistent Ġrepository ĊĠĠĠĠĠĠĠ Ġval Ġnew Task Ġ= ĠTask (" title ") ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġcompleted Ġin Ġthe Ġpersistent Ġrepository ĊĠĠĠĠĠĠĠ Ġlocal DataSource . complete Task ( new Task ) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlocal DataSource . get Task ( new Task . id ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġtask Ġcan Ġbe Ġretrieved Ġfrom Ġthe Ġpersistent Ġrepository Ġand Ġis Ġcomplete ĊĠĠĠĠĠĠĠ ĠassertThat ( result . succeeded , Ġ` is `( true )) ĊĠĠĠĠĠĠĠ Ġresult Ġas ĠSuccess ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . title , Ġ` is `( new Task . title )) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . is Completed , Ġ` is `( true )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġactivate Task _ retrie ved Task IsActive () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġnew Ġcompleted Ġtask Ġin Ġthe Ġpersistent Ġrepository ĊĠĠĠĠĠĠĠ Ġval Ġnew Task Ġ= ĠTask (" Some Ġtitle ", Ġ" Some Ġdescription ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task ) ĊĊĠĠĠĠĠĠĠ Ġlocal DataSource . activate Task ( new Task ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġtask Ġcan Ġbe Ġretrieved Ġfrom Ġthe Ġpersistent Ġrepository Ġand Ġis Ġactive ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlocal DataSource . get Task ( new Task . id ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result . succeeded , Ġ` is `( true )) ĊĠĠĠĠĠĠĠ Ġresult Ġas ĠSuccess ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . title , Ġ` is ` (" Some Ġtitle ")) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . is Completed , Ġ` is `( false )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclear Completed Task _ task Not Retrie vable () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġ 2 Ġnew Ġcompleted Ġtasks Ġand Ġ 1 Ġactive Ġtask Ġin Ġthe Ġpersistent Ġrepository ĊĠĠĠĠĠĠĠ Ġval Ġnew Task 1 Ġ= ĠTask (" title ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Task 2 Ġ= ĠTask (" title 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Task 3 Ġ= ĠTask (" title 3 ") ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task 1 ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . complete Task ( new Task 1 ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task 2 ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . complete Task ( new Task 2 ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task 3 ) ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġcompleted Ġtasks Ġare Ġcleared Ġin Ġthe Ġrepository ĊĠĠĠĠĠĠĠ Ġlocal DataSource . clear Completed Tasks () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġcompleted Ġtasks Ġcannot Ġbe Ġretrieved Ġand Ġthe Ġactive Ġone Ġcan ĊĠĠĠĠĠĠĠ ĠassertThat ( local DataSource . get Task ( new Task 1 . id ). succeeded , Ġ` is `( false )) ĊĠĠĠĠĠĠĠ ĠassertThat ( local DataSource . get Task ( new Task 2 . id ). succeeded , Ġ` is `( false )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult 3 Ġ= Ġlocal DataSource . get Task ( new Task 3 . id ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result 3 . succeeded , Ġ` is `( true )) ĊĠĠĠĠĠĠĠ Ġresult 3 Ġas ĠSuccess ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result 3 . data , Ġ` is `( new Task 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete All Tasks _ empty ListOf Retrie ved Task () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa Ġnew Ġtask Ġin Ġthe Ġpersistent Ġrepository Ġand Ġa Ġmocked Ġcallback ĊĠĠĠĠĠĠĠ Ġval Ġnew Task Ġ= ĠTask (" title ") ĊĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġall Ġtasks Ġare Ġdeleted ĊĠĠĠĠĠĠĠ Ġlocal DataSource . delete All Tasks () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġretrieved Ġtasks Ġis Ġan Ġempty Ġlist ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlocal DataSource . get Tasks () Ġas ĠSuccess ĊĠĠĠĠĠĠĠ ĠassertThat ( result . data . isEmpty (), Ġ` is `( true )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Tasks _ retrieve Saved Tasks () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġ 2 Ġnew Ġtasks Ġin Ġthe Ġpersistent Ġrepository ĊĠĠĠĠĠĠĠ Ġval Ġnew Task 1 Ġ= ĠTask (" title ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Task 2 Ġ= ĠTask (" title ") ĊĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task 1 ) ĊĠĠĠĠĠĠĠ Ġlocal DataSource . save Task ( new Task 2 ) ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġtasks Ġcan Ġbe Ġretrieved Ġfrom Ġthe Ġpersistent Ġrepository ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġlocal DataSource . get Tasks () Ġas ĠSuccess < List < Task >> ĊĠĠĠĠĠĠĠ Ġval Ġtasks Ġ= Ġresults . data ĊĠĠĠĠĠĠĠ ĠassertThat ( tasks . size , Ġ` is `( 2 )) ĊĠĠĠ Ġ} Ċ } Ċ