package Ġcom . che ise _ proj . data . repository Ċ Ċ import Ġcom . che ise _ proj . data . extension . as Entity Ċ import Ġcom . che ise _ proj . data . source . local . Local User Ċ import Ġcom . che ise _ proj . data . source . remote . Remote User Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġorg . mockito . Argument Matchers . any String Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . Mockito . times Ċ import Ġorg . mockito . Mockito Annotations Ċ import Ġutils . Fake User Ċ Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠUser Repository Impl Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ NAME Ġ= Ġ" any _ username " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ PASSWORD Ġ= Ġ" any _ password " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERROR _ MESSAGE Ġ= Ġ" an Ġerror Ġoccurred " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ TYPE Ġ= Ġ" STA FF " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġuser Repository Impl : ĠUser Repository Impl ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġlocal User : ĠLocal User ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġremote User : ĠRemote User ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . init Mocks ( this ) ĊĠĠĠĠĠĠĠ Ġuser Repository Impl Ġ= ĠUser Repository Impl ( remote Ġ= Ġremote User , Ġlocal Ġ= Ġlocal User ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġfetch Ġuser Ġdata Ġfrom Ġremote Ġand Ġsave Ġto Ġlocal `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFake User . getUser () ĊĊĠĠĠĠĠĠĠ ĠMockito .` when `( remote User . fetch User Token ( any String (), Ġany String (), Ġany String ())). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( user ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local User . getUser ( any String (), Ġany String (), Ġany String ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Single . just ( user )) ĊĊĊĠĠĠĠĠĠĠ Ġuser Repository Impl . getUser ( username Ġ= ĠUSER _ NAME , Ġpassword Ġ= ĠUSER _ PASSWORD , Ġtype Ġ= ĠUSER _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Values ( user . as Entity (), Ġuser . as Entity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Complete () ĊĊĠĠĠĠĠĠĠ ĠMockito . verify ( local User , Ġtimes ( 1 )). add User ( user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġuser Ġdata Ġfrom Ġlocal Ġwhen Ġremote Ġfails `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFake User . getUser () ĊĊĠĠĠĠĠĠĠ ĠMockito .` when `( remote User . fetch User Token ( any String (), Ġany String (), Ġany String ())). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . error ( Throwable ( ERROR _ MESSAGE )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local User . getUser ( any String (), Ġany String (), Ġany String ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Single . just ( user )) ĊĊĠĠĠĠĠĠĠ Ġuser Repository Impl . getUser ( username Ġ= ĠUSER _ NAME , Ġpassword Ġ= ĠUSER _ PASSWORD , Ġtype Ġ= ĠUSER _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value ( user . as Entity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Complete () ĊĊĠĠĠĠĠĠĠ ĠMockito . verify ( local User , Ġtimes ( 0 )). add User ( user ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġprofile Ġdata Ġwith Ġidentifier `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFake User . getUser () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠFake User . get Profile () ĊĊĠĠĠĠĠĠĠ ĠMockito .` when `( remote User . fetch Profile ( any String ())). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( actual ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local User . getUser ( Mockito . any Int ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Single . just ( user )) ĊĊĠĠĠĠĠĠĠ ĠMockito .` when `( local User . get Profile ( Mockito . any Int ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Single . just ( actual )) ĊĊĠĠĠĠĠĠĠ Ġuser Repository Impl . get Profile ( Mockito . any Int ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value At ( 0 , Ġactual . as Entity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value At ( 1 , Ġactual . as Entity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Complete () ĊĊĠĠĠĠĠĠĠ ĠMockito . verify ( local User , Ġtimes ( 1 )). getUser ( Mockito . any Int ()) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( remote User , Ġtimes ( 1 )). fetch Profile ( any String ()) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( local User , Ġtimes ( 1 )). add Profile ( actual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġprofile Ġdata Ġfrom Ġcache Ġon Ġremote Ġerror Ġwith Ġidentifier `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFake User . getUser () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠFake User . get Profile () ĊĊĠĠĠĠĠĠĠ ĠMockito .` when `( remote User . fetch Profile ( any String ())). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . error ( Throwable ( ERROR _ MESSAGE )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( local User . getUser ( Mockito . any Int ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Single . just ( user )) ĊĊĠĠĠĠĠĠĠ ĠMockito .` when `( local User . get Profile ( Mockito . any Int ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( Single . just ( actual )) ĊĊĠĠĠĠĠĠĠ Ġuser Repository Impl . get Profile ( Mockito . any Int ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Complete () ĊĊĠĠĠĠĠĠĠ ĠMockito . verify ( local User , Ġtimes ( 1 )). getUser ( Mockito . any Int ()) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( remote User , Ġtimes ( 1 )). fetch Profile ( any String ()) ĊĠĠĠ Ġ} Ċ Ċ }