package Ġcom . b ns an tos . offline . repository Ċ Ċ import Ġandroid . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġcom . b ns an tos . offline . db . Comment Dao Ċ import Ġcom . b ns an tos . offline . load From Resource Ċ import Ġcom . b ns an tos . offline . models . Comment Ċ import Ġcom . b ns an tos . offline . network . Comment Service Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġio . reactivex . Observable Ċ import Ġorg . hamcrest . core . Is .` is ` Ċ import Ġorg . hamcrest . core . IsNull Ċ import Ġorg . junit . Assert . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġorg . mockito . Matchers Ċ import Ġorg . mockito . Mockito .* Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠComment Repository Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Repo : ĠComments Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Dao : ĠComment Dao ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Service : ĠComment Service ĊĊĠĠĠ Ġ@ Rule Ġ@ Jvm Field Ġval Ġinstant Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġ@ Before Ġfun Ġinit (){ ĊĠĠĠĠĠĠĠ Ġm Dao Ġ= Ġmock ( Comment Dao :: class . java ) ĊĠĠĠĠĠĠĠ Ġm Service Ġ= Ġmock ( Comment Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġm Repo Ġ= ĠComments Repository ( m Dao , Ġm Service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest Empty (){ ĊĠĠĠĠĠĠĠ Ġval Ġdb Data Ġ= ĠMutable LiveData < List < Comment >>() ĊĠĠĠĠĠĠĠ Ġval Ġcomments Ġ= ĠArrayList < Comment >() ĊĠĠĠĠĠĠĠ Ġdb Data . value Ġ= Ġcomments ĊĠĠĠĠĠĠĠ Ġ` when `( m Dao . read ()). thenReturn ( db Data ) ĊĠĠĠĠĠĠĠ Ġ` when `( m Service . read ()). thenReturn ( Observable . just ( listOf ())) ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġmock ( Observer :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġm Repo . read () ĊĠĠĠĠĠĠĠ Ġlive Data . observe Fore ver ( observer Ġas ĠObserver < List < Comment >> ?) ĊĊĠĠĠĠĠĠĠ Ġverify < Comment Dao >( m Dao ). read () ĊĠĠĠĠĠĠĠ Ġverify < Comment Service >( m Service ). read () ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( m Service ) ĊĠĠĠĠĠĠĠ ĠassertThat ( live Data . value , ĠIs Null . notNull Value ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( live Data . value ?. size , Ġ` is `( 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest DB Empty (){ ĊĠĠĠĠĠĠĠ Ġval Ġdb Data Ġ= ĠMutable LiveData < List < Comment >>() ĊĠĠĠĠĠĠĠ Ġval Ġcomments Ġ= ĠArrayList < Comment >() ĊĠĠĠĠĠĠĠ Ġdb Data . value Ġ= Ġcomments ĊĠĠĠĠĠĠĠ Ġ` when `( m Dao . read ()). thenReturn ( db Data ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġload From Resource < List < Comment >> (" read - all - comments . json ", Ġthis @ Comment Repository Test . java Class . class Loader , Ġobject Ġ: ĠType Token < List < Comment >>() Ġ{ Ġ}. type ) ĊĠĠĠĠĠĠĠ Ġ` when `( m Service . read ()). thenReturn ( Observable . just ( data )) ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġmock ( Observer :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġm Repo . read () ĊĠĠĠĠĠĠĠ Ġlive Data . observe Fore ver ( observer Ġas ĠObserver < List < Comment >> ?) ĊĊĠĠĠĠĠĠĠ Ġverify < Comment Dao >( m Dao ). read () ĊĠĠĠĠĠĠĠ Ġverify < Comment Service >( m Service ). read () ĊĠĠĠĠĠĠĠ Ġverify < Comment Dao >( m Dao ). insert ( Matchers . any ListOf ( Comment :: class . java )) ĊĠĠĠĠĠĠĠ Ġdb Data . value Ġ= Ġdata Ġ// Sim ulating Ġinsert ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( m Service ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( live Data . value , ĠIs Null . notNull Value ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( live Data . value ?. size , Ġ` is `( data . size )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest DB Api More (){ ĊĠĠĠĠĠĠĠ Ġval Ġdb Data Ġ= ĠMutable LiveData < List < Comment >>() ĊĠĠĠĠĠĠĠ Ġval Ġcomments Ġ= ĠArrayList < Comment >() ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġload From Resource < List < Comment >> (" read - all - comments . json ", Ġthis @ Comment Repository Test . java Class . class Loader , Ġobject Ġ: ĠType Token < List < Comment >>() Ġ{ Ġ}. type ) ĊĠĠĠĠĠĠĠ Ġcomments . add ( data [ 0 ]) ĊĠĠĠĠĠĠĠ Ġdb Data . value Ġ= Ġcomments ĊĠĠĠĠĠĠĠ Ġ` when `( m Dao . read ()). thenReturn ( db Data ) ĊĠĠĠĠĠĠĠ Ġ` when `( m Service . read ()). thenReturn ( Observable . just ( data )) ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġmock ( Observer :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= Ġm Repo . read () ĊĠĠĠĠĠĠĠ Ġlive Data . observe Fore ver ( observer Ġas ĠObserver < List < Comment >> ?) ĊĊĠĠĠĠĠĠĠ Ġverify < Comment Dao >( m Dao ). read () ĊĠĠĠĠĠĠĠ Ġverify < Comment Service >( m Service ). read () ĊĠĠĠĠĠĠĠ Ġverify < Comment Dao >( m Dao ). insert ( Matchers . any ListOf ( Comment :: class . java )) ĊĠĠĠĠĠĠĠ Ġdb Data . value Ġ= Ġdata Ġ// Sim ulating Ġinsert ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( m Service ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( live Data . value , ĠIs Null . notNull Value ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( live Data . value ?. size , Ġ` is `( data . size )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠ Ġfun Ġ< T > ĠgetValue ( live Data : ĠLive Data < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠarrayOf Null s < Any >( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġobject Ġ: ĠObserver < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ 0 ] Ġ= Ġo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlive Data . observe Fore ver ( observer ) ĊĠĠĠĠĠĠĠ Ġl atch . await ( 2 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata [ 0 ] Ġas ĠT ĊĠĠĠ Ġ} Ċ }