/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġmar lon lom . Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . mar lon lom . apps . book bar . saved Ċ Ċ import Ġdev . mar lon lom . apps . book bar . detail . to Book Detail Entity Ċ import Ġdev . mar lon lom . apps . book bar . model . database . book _ detail . Book Detail Ċ import Ġdev . mar lon lom . apps . book bar . saved . Saved Books Contract . Local DataSource Ċ import Ġdev . mar lon lom . apps . book bar . saved . Saved Books Contract . Repository Ċ import Ġdev . mar lon lom . apps . book bar . utils . Remote Data Ċ import Ġjunit . framework . TestCase Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġorg . mockito . Mockito . mock Ċ import Ġorg . mockito . junit . Mockito JUnit Runner Ċ Ċ @ Experimental Cor outines Api Ċ @ RunWith ( Mockito JUnit Runner :: class ) Ċ class ĠRepository Test Ġ: ĠTestCase () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlocal DataSource : ĠLocal DataSource ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠRepository ĊĊĠĠĠ Ġprivate Ġval Ġsaved Books List : ĠList < Book Detail > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠRemote Data . saved Books ApiResponse . books . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Book Detail Entity ( it ). copy ( saved Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġpublic Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal DataSource Ġ= Ġmock ( Local DataSource :: class . java ) ĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠRepository ( local DataSource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġreturn Ġempty Ġlist Ġof Ġsaved Ġbooks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( local DataSource . list Saved ()). thenReturn ( flow Of ( emptyList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . retrieve Saved Books (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . is Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Saved Ġbooks Ġnot Ġfound .", Ġresponse . exception OrNull () !!. message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġreturn Ġa Ġlist Ġof Ġsaved Ġbooks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( local DataSource . list Saved ()). thenReturn ( flow Of ( saved Books List )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . retrieve Saved Books (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . is Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . get OrThrow (). isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( saved Books List . size , Ġresponse . get OrThrow (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġfind Ġa Ġsaved Ġbook Ġusing Ġsearch `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Flow Ġ= Ġflow Of ( saved Books List . filter Ġ{ Ġit . title . startsWith (" Kotlin ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( local DataSource . search Saved ( Mockito . any String ())). thenReturn ( results Flow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . search ("* kotlin * "). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . is Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . get OrThrow (). isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresponse . get OrThrow (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġreturn Ġcomplete Ġsaved Ġbooks Ġlist Ġafter Ġnot Ġfinding Ġsearch Ġresults `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( local DataSource . search Saved ( Mockito . any String ())). thenReturn ( flow Of ( emptyList ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( local DataSource . list Saved ()). thenReturn ( flow Of ( saved Books List )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . search ("* lo rem Ġipsum * "). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . is Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( response . get OrThrow (). isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( saved Books List . size , Ġresponse . get OrThrow (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġsave Ġbook Ġstate Ġfor Ġselected Ġis bn `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . toggle Saved (" 1 0 0 1 6 2 2 1 1 5 7 2 1 ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġun save Ġbook Ġstate Ġfor Ġselected Ġis bn `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . toggle Saved (" 1 0 0 1 6 2 2 1 1 5 7 2 1 ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }