package Ġcom . me . data . weather . datasource . local Ċ Ċ import Ġcom . me . data . base . App Database Ċ import Ġcom . me . data . weather . datasource . local . dao . I Weather Dao Ċ import Ġcom . me . data . weather . model . map To Domain Ċ import Ġcom . me . data . weather Log Data ĊĊ Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Single Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mockito .* Ċ Ċ class ĠWeather Cache DataSource Impl Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdataSource : ĠWeather Cache DataSource Impl ĊĊĠĠĠ Ġprivate Ġvar Ġmocked Database : ĠApp Database Ġ= Ġmock ( App Database :: class . java ) ĊĠĠĠ Ġprivate Ġvar Ġmocked Weather Dao : ĠI Weather Dao Ġ= Ġmock ( I Weather Dao :: class . java ) ĊĊĠĠĠ Ġprivate Ġval Ġdate Created Ġ= Ġweather Log Data . date Created ĊĊĠĠĠ Ġprivate Ġval Ġcache Item Ġ= Ġweather Log Data . copy ( name Ġ= Ġ" cached ") ĊĠĠĠ Ġprivate Ġval Ġcache List Ġ= ĠlistOf ( cache Item ) ĊĊĊĠĠĠ Ġprivate Ġval Ġthrowable Ġ= ĠThrowable () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Database . get Weather Dao ()). thenReturn ( mocked Weather Dao ) ĊĠĠĠĠĠĠĠ ĠdataSource Ġ= ĠWeather Cache DataSource Impl ( mocked Database ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġall Ġweather Logs Ġcache Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . getAll Weather Logs ()). thenReturn ( Flow able . just ( cache List )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . get Weather Logs (). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). getAll Weather Logs () ĊĠĠĠĠĠĠĠ Ġtest . assert Value ( cache List . map To Domain ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġall Ġweather Logs Ġcache Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . getAll Weather Logs ()). thenReturn ( Flow able . error ( throwable )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . get Weather Logs (). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). getAll Weather Logs () ĊĠĠĠĠĠĠĠ Ġtest . assert Error ( throwable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` set Ġall Ġweather Logs Ġcache Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . save All Weather Logs ( cache List )). thenReturn ( listOf ()) ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . getAll Weather Logs ()). thenReturn ( Flow able . just ( cache List )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . set Weather Logs ( cache List . map To Domain ()). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). save All Weather Logs ( cache List ) ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). getAll Weather Logs () ĊĊĠĠĠĠĠĠĠ Ġtest . assert Value ( cache List . map To Domain ()) ĊĠĠĠĠĠĠĠ Ġtest . assert No Errors () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` set Ġall Ġweather Logs Ġcache Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . save All Weather Logs ( cache List )). thenReturn ( listOf ()) ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . getAll Weather Logs ()). thenReturn ( Flow able . error ( throwable )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . set Weather Logs ( cache List . map To Domain ()). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). save All Weather Logs ( cache List ) ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). getAll Weather Logs () ĊĊĠĠĠĠĠĠĠ Ġtest . assert Error ( throwable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġweather Log Ġby Ġdate Ġcache Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . get Weather Log ( date Created )). thenReturn ( Single . just ( cache Item )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . get Weather Log ( date Created ). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). get Weather Log ( date Created ) ĊĠĠĠĠĠĠĠ Ġtest . assert Value ( cache Item . map To Domain ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get Ġweather Log Ġby Ġdate Ġcache Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . get Weather Log ( date Created )). thenReturn ( Single . error ( throwable )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . get Weather Log ( date Created ). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). get Weather Log ( date Created ) ĊĠĠĠĠĠĠĠ Ġtest . assert Error ( throwable ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` edit Ġweather Log Ġcache Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . update Weather Log ( cache Item )). thenReturn ( Comp letable . complete ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . edit Weather Log ( cache Item . map To Domain ()). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). update Weather Log ( cache Item ) ĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert No Errors () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` edit Ġweather Log Ġcache Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . update Weather Log ( cache Item )). thenReturn ( Comp letable . error ( throwable )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . edit Weather Log ( cache Item . map To Domain ()). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). update Weather Log ( cache Item ) ĊĠĠĠĠĠĠĠ Ġtest . assert Error ( throwable ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add Ġweather Log Ġcache Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . save Weather Log ( cache Item )). thenReturn ( 1 ) ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . get Weather Log ( cache Item . date Created )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . add Weather Log ( cache Item . map To Domain ()). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). save Weather Log ( cache Item ) ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). get Weather Log ( cache Item . date Created ) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert No Errors () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add Ġweather Log Ġcache Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . save Weather Log ( cache Item )). thenReturn ( 0 ) ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . get Weather Log ( cache Item . date Created )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . add Weather Log ( cache Item . map To Domain ()). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). save Weather Log ( cache Item ) ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). get Weather Log ( cache Item . date Created ) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Error ( throwable ) ĊĠĠĠ Ġ} ĊĊĊĊ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` delete Ġweather Log Ġcache Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . delete Weather Log ( date Created )). thenReturn ( Comp letable . complete ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . delete Weather Log ( date Created ). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). delete Weather Log ( date Created ) ĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert No Errors () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` delete Ġweather Log Ġcache Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġ` when `( mocked Weather Dao . delete Weather Log ( date Created )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= ĠdataSource . delete Weather Log ( date Created ). test () ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġverify ( mocked Weather Dao ). delete Weather Log ( date Created ) ĊĠĠĠĠĠĠĠ Ġtest . assert Error ( throwable ) ĊĠĠĠ Ġ} Ċ Ċ }