package Ġcom . j erry h anks . far im oney test . data Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . j erry h anks . fa irm oney test . Main Coroutine Rule Ċ import Ġcom . j erry h anks . fa irm oney test . TestUtils Ċ import Ġcom . j erry h anks . fa irm oney test . run Blocking Test Ċ import Ġcom . j erry h anks . far im oney test . data . db . App Database Ċ import Ġcom . j erry h anks . far im oney test . data . db . da os . User Dao Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . first OrNull Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠAuthor : ĠJ erry Ċ Ġ* ĠProject : ĠF air money Test Ċ Ġ*/ Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Experimental Cor outines Api Ċ class ĠUsers Dao Test Ġ{ ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġmain Coroutine Rule Ġ= ĠMain Coroutine Rule () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapp Database : ĠApp Database ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġusers Dao : ĠUser Dao ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġinit DB () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠInstrument ation Registry . get Instrumentation (). target Context ĊĠĠĠĠĠĠĠ Ġapp Database Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoom . in Memory Database Builder ( context , ĠApp Database :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allow MainThread Queries (). build () ĊĠĠĠĠĠĠĠ Ġusers Dao Ġ= Ġapp Database . user Dao () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert Users S aves Data () Ġ= Ġmain Coroutine Rule . run Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġusers Ġ= ĠTestUtils . mock Users (). map Ġ{ Ġit . to User Entity () Ġ} ĊĠĠĠĠĠĠĠ Ġusers Dao . insert All ( users ) ĊĊĠĠĠĠĠĠĠ Ġ// read ĊĠĠĠĠĠĠĠ Ġval Ġfirst User Ġ= Ġusers Dao . get Users (). first OrNull () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( first User ). isNotNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( first User ). isNotNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( first User ?. size ). isEqualTo ( 1 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( first User ?. first ()?. id ). isEqualTo ( TestUtils . FIRST _ USER _ ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete All User Clear s Db Record () Ġ= Ġmain Coroutine Rule . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusers Ġ= ĠTestUtils . mock Users (). map Ġ{ Ġit . to User Entity () Ġ} ĊĠĠĠĠĠĠĠ Ġusers Dao . insert All ( users ) ĊĊĠĠĠĠĠĠĠ Ġ// read ĊĠĠĠĠĠĠĠ Ġval Ġfirst Read Ġ= Ġusers Dao . get Users (). first OrNull () ĊĊĠĠĠĠĠĠĠ Ġ// Verify Ġwe Ġhave Ġsaved Ġdata ĊĠĠĠĠĠĠĠ ĠassertThat ( first Read ?. size ). isEqualTo ( 1 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// delete ĊĠĠĠĠĠĠĠ Ġusers Dao . delete All Users () ĊĊĠĠĠĠĠĠĠ Ġ// read ĊĠĠĠĠĠĠĠ Ġval Ġsecond Read Ġ= Ġusers Dao . get Users (). first OrNull () ĊĊĠĠĠĠĠĠĠ Ġ// verify Ġempty ĊĠĠĠĠĠĠĠ ĠassertThat ( second Read ). isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetUser Returns User Record () Ġ= Ġmain Coroutine Rule . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusers Ġ= ĠTestUtils . mock Users (). map Ġ{ Ġit . to User Entity () Ġ} ĊĠĠĠĠĠĠĠ Ġusers Dao . insert All ( users ) ĊĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġusers Dao . getUser ( TestUtils . FIRST _ USER _ ID ). first OrNull () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( user ). isNotNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( user ?. id ). isEqualTo ( TestUtils . FIRST _ USER _ ID ) ĊĠĠĠĠĠĠĠ ĠassertThat ( user ?. email ). isEqualTo ( TestUtils . FIRST _ USER _ EMAIL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġclose DB () Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Database . close () ĊĠĠĠ Ġ} Ċ }