/* Ċ Ġ* Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* Ġ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠP asc ual ĠMont es inos Ġhttp :// pas mode v . com Ċ Ġ* Ġ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* Ġ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ċ Ġ* Ġ Ġ* Ġ Ġ* Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ċ Ġ* Ġ Ġ* Ġ Ġ* Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ġinformation Ċ Ġ* Ġ Ġ* Ġ Ġ* Ġregarding Ġcopyright Ġownership . Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ċ Ġ* Ġ Ġ* Ġ Ġ* Ġto Ġyou Ġ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 Ġcom . pas mode v . data . repository Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . isNull Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . pas mode v . data . entity . User Entity Ċ import Ġcom . pas mode v . data . entity . mapper . User Entity To User Mapper Ċ import Ġcom . pas mode v . data . repository . datasource . User DataSource Ċ import Ġcom . pas mode v . domain . exception . User NotFoundException Ċ import Ġcom . pas mode v . domain . model . User Ċ import Ġcom . pas mode v . domain . repository . UserRepository Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . hamcrest . Core Matchers . equalTo Ċ import Ġorg . hamcrest . Core Matchers . instance Of Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Assert . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito Annotations Ċ import Ġjava . util .* Ċ import Ġorg . mockito . Mockito .` when ` Ġas Ġ_ when Ċ Ċ class ĠUser Repository Impl Test Ġ{ ĊĊĠĠĠ Ġ@ Mock Ġlateinit Ġvar Ġmock User DataSource : ĠUser DataSource ĊĠĠĠ Ġ@ Mock Ġlateinit Ġvar Ġmock User Entity To User Mapper : ĠUser Entity To User Mapper ĊĠĠĠ Ġ@ Mock Ġlateinit Ġvar Ġmock User Entity : ĠUser Entity ĊĠĠĠ Ġ@ Mock Ġlateinit Ġvar Ġmock User : ĠUser ĊĊĠĠĠ Ġlateinit Ġvar Ġuser Repository Ġ: ĠUser Repository ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . init Mocks ( this ) ĊĊĠĠĠĠĠĠĠ Ġuser Repository Ġ= ĠUser Repository Impl ( mock User DataSource , Ġmock User Entity To User Mapper ) ĊĊĠĠĠĠĠĠĠ Ġ_ when ( mock User Entity To User Mapper . map ( mock User Entity )). thenReturn ( mock User ) ĊĠĠĠĠĠĠĠ Ġ_ when ( mock User Entity To User Mapper . reverse Map ( mock User )). thenReturn ( mock User Entity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` given Ġexists Ġuser Ġwhen Ġget Ġuser Ġthen Ġreturn Ġuser ` (){ ĊĠĠĠĠĠĠĠ Ġexists User ( true ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult User : ĠUser ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult Error : ĠError ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getOne ( UUID . randomUUID (). toString ()) Ġ{ Ġuser , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify ( mock User DataSource ). get ( any (), Ġany ()) ĊĠĠĠĠĠĠĠ Ġverify ( mock User Entity To User Mapper ). map ( mock User Entity ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result User , ĠequalTo ( mock User )) ĊĠĠĠĠĠĠĠ ĠAssert . assertNull ( result Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` given Ġnot Ġexists Ġuser Ġwhen Ġget Ġuser Ġthen Ġfailure Ġby ĠUser NotFoundException `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexists User ( false ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult User : ĠUser ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult Error : ĠError ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . getOne ( UUID . randomUUID (). toString ()) Ġ{ Ġuser , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAssert . assertNull ( result User ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result Error ?. cause , Ġinstance Of ( User NotFoundException :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` given Ġnot Ġexists Ġuser Ġwhen Ġcreate Ġuser Ġthen Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġexists User ( false ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult User : ĠUser ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġresult Error : ĠError ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . save ( mock User ) Ġ{ Ġuser , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult User Ġ= Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Error Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify ( mock User Entity To User Mapper ). reverse Map ( mock User ) ĊĠĠĠĠĠĠĠ Ġverify ( mock User DataSource ). create ( any (), Ġany ()) ĊĠĠĠĠĠĠĠ Ġverify ( mock User Entity To User Mapper ). map ( mock User Entity ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result User , ĠequalTo ( mock User )) ĊĠĠĠĠĠĠĠ ĠassertThat ( result Error , Ġis Null ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexists User ( exists : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ when ( mock User DataSource . get ( any (), Ġany ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Answer Ġ{ Ġinvocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback : Ġ( user Entity : ĠUser Entity ?, Ġerror : ĠError ?) Ġ-> ĠUnit Ġ= Ġinvocation . get Argument < Any >( 1 ) Ġas Ġ( User Entity ?, ĠError ?) Ġ-> ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( mock User Entity , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( null , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊ Ċ }