/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠZ UP ĠIT ĠSER V IC OS ĠEM ĠT EC NO LOG IA ĠE ĠIN OV AC AO ĠSA Ċ Ġ* Ċ Ġ* Ġ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 Ġbr . com . z up . be agle . android . data Ċ Ċ import Ġbr . com . z up . be agle . android . Base Test Ċ import Ġbr . com . z up . be agle . android . cache . Be agle Cache Ċ import Ġbr . com . z up . be agle . android . cache . CacheManager Ċ import Ġbr . com . z up . be agle . android . data . serializer . Be agle Serializer Ċ import Ġbr . com . z up . be agle . android . networking . Request Data Ċ import Ġbr . com . z up . be agle . android . networking . ResponseData Ċ import Ġbr . com . z up . be agle . android . testutil . Random Data Ċ import Ġbr . com . z up . be agle . core . Server D riven Component Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Sequence Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ private Ġval ĠURL Ġ= ĠRandom Data . string () Ċ private Ġval ĠREQUEST _ DATA Ġ= ĠRequest Data ( url Ġ= ĠURL ) Ċ Ċ @ DisplayName (" Given Ġa ĠComponent ĠRequest er ") Ċ @ Experimental Cor outines Api Ċ class ĠComponent Request er Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbe agle Api : ĠBe agle Api Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġserializer : ĠBe agle Serializer Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġcache Manager : ĠCache Manager Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġbe agle Cache Ġ= Ġmock k < Be agle Cache >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcomponent Request er : ĠComponent Request er ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setUp () ĊĊĠĠĠĠĠĠĠ Ġcomponent Request er Ġ= ĠComponent Request er ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe agle Api , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Manager ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" When Ġbe agle Cache Ġis Ġnot Ġexpired ") ĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠBe agle Cache IsNot Expired Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Then Ġshould Ġdeserialize Ġcached Ġjson ") ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtest Deserialize Cached Json () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġmock k < Server D riven Component >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Mock Ġ= Ġ" json Mock " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Manager . restore Be agle Cache For Url ( REQUEST _ DATA . url !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġbe agle Cache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbe agle Cache . is Expired () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbe agle Cache . json Ġ} Ġreturns Ġjson Mock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġserializer . deserialize Component ( json Mock ) Ġ} Ġreturns Ġcomponent ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Component Ġ= Ġcomponent Request er . fetch Component ( REQUEST _ DATA ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġserializer . deserialize Component ( json Mock ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( component , Ġactual Component ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" When Ġbe agle Cache Ġis Ġexpired ") ĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠBe agle Cache Is Expired Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Then Ġso h uld Ġfetch Ġfrom Ġapi Ġand Ġdeserialize Ġthis Ġnew Ġjson ") ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġtest Deserialize Cached Json () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Request Data Mock Ġ= Ġmock k < Request Data >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Mock Ġ= Ġmock k < Request Data >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Data Mock Ġ= Ġmock k < ResponseData >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Json Mock Ġ= Ġ" new Json Mock " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġmock k < Server D riven Component >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcache Manager . restore Be agle Cache For Url ( REQUEST _ DATA . url !! ) Ġ} Ġreturns Ġbe agle Cache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbe agle Cache . is Expired () Ġ} Ġreturns Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcache Manager . request Data With Cache ( REQUEST _ DATA , Ġbe agle Cache ) Ġ} Ġreturns Ġnew Request Data Mock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġbe agle Api . fetch Data ( new Request Data Mock ) Ġ} Ġreturns Ġresponse Data Mock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcache Manager . handle ResponseData ( REQUEST _ DATA . url !! , Ġbe agle Cache , Ġresponse Data Mock ) Ġ} Ġreturns Ġnew Json Mock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġserializer . deserialize Component ( new Json Mock ) Ġ} Ġreturns Ġexpected ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcomponent Request er . fetch Component ( REQUEST _ DATA ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Then ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Manager . restore Be agle Cache For Url ( REQUEST _ DATA . url !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Manager . request Data With Cache ( REQUEST _ DATA , Ġbe agle Cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbe agle Api . fetch Data ( new Request Data Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Manager . handle ResponseData ( REQUEST _ DATA . url !! , Ġbe agle Cache , Ġresponse Data Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . deserialize Component ( new Json Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ