package Ġcom . x inh . data . repository Ċ Ċ import ĠUnit Test Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . spy Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . x inh . data . repository . user . cloud . Authentication Service Ċ import Ġcom . x inh . data . repository . user . cloud . Login Request Ċ import Ġcom . x inh . data . repository . user . cloud . Login Token Request Ċ import Ġcom . x inh . data . repository . user . cloud . Logout Request Ċ import Ġcom . x inh . domain . functional . Either Ċ import Ġcom . x inh . domain . repository . UserRepository Ċ import Ġcom . x inh . facebook . model . Facebook User Ċ import Ġcom . x inh . facebook . service . Facebook Service Ċ import Ġcom . x inh . google . model . Google User Ċ import Ġcom . x inh . google . service . Google Service Ċ import Ġio . reactivex . Observable Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġjava . net . Http URLConnection . HTTP _ BAD _ REQUEST Ċ Ċ class ĠUser Repository Test Ġ: ĠUnit Test () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġuser Repository : ĠUser Repository ĊĊĠĠĠ Ġprivate Ġval Ġauthentication Service : ĠAuthentication Service Ġ= ĊĠĠĠĠĠĠĠ Ġcreate ( Authentication Service :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġspy Authentication Service Ġ= Ġspy ( authentication Service ) ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgoogle Service : ĠGoogle Service ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfacebook Service : ĠFacebook Service ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Repository Ġ= ĠUser Repository Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Service Ġ= Ġspy Authentication Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle Service Ġ= Ġgoogle Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfacebook Service Ġ= Ġfacebook Service ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` login Ġby Ġemail Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Response (" login Email _ when Success . json ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . login (" email ", Ġ" 1 2 3 "). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( spy Authentication Service ). login ( Login Request (" email ", Ġ" 1 2 3 ")) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` login Ġby Ġemail Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Response (" login Email _ when Fail . json ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . login (" email ", Ġ" 1 2 3 "). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( spy Authentication Service ). login ( Login Request (" email ", Ġ" 1 2 3 ")) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Left ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` login Ġby Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Response (" login Email _ when Success . json ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . login (" token "). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( spy Authentication Service ). login ( Login Token Request (" token ")) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` login Ġby Ġtoken Ġfail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Response (" login Email _ when Success . json ", ĠHTTP _ BAD _ REQUEST ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . login (" token "). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( spy Authentication Service ). login ( Login Token Request (" token ")) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Left ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` logout Ġby Ġtoken `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Response (" logout By Token _ when Success . json ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . logout (" token "). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( spy Authentication Service ). logout ( Logout Request (" token ")) ĊĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` login Ġby Ġfacebook `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( facebook Service . login ()). thenReturn ( Observable . just ( Facebook User ())) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . login Facebook (). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( facebook Service ). login () ĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` logout Ġby Ġfacebook `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( facebook Service . logout ()). thenReturn ( Observable . just ( true )) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . logout Facebook (). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( facebook Service ). logout () ĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` login Ġgoogle `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( google Service . login ()). thenReturn ( Observable . just ( Google User ())) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . login Google (). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( google Service ). login () ĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` logout Ġgoogle `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( google Service . logout ()). thenReturn ( Observable . just ( true )) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Ġ= Ġuser Repository . logout Google (). test () ĊĊĠĠĠĠĠĠĠ Ġverify ( google Service ). logout () ĊĠĠĠĠĠĠĠ Ġtest . assert Complete () ĊĠĠĠĠĠĠĠ Ġtest . assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġis ĠEither . Right ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }