/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . ĠChristian ĠGr ach Ġ< ch rist ian . gr ach @ cm g apps . com > Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . cm g apps . android . cur riculum vit ae . repository Ċ Ċ import Ġandroidx . datastore . core . DataStore Ċ import Ġcom . cm g apps . android . cur riculum vit ae . data . datastore . Profile Ċ import Ġcom . cm g apps . android . cur riculum vit ae . infra . Cv ApiService Ċ import Ġcom . cm g apps . android . cur riculum vit ae . test . Main Dispatcher Extension Ċ import Ġcom . cm g apps . android . cur riculum vit ae . test . Stub DataStore Profile Ċ import Ġcom . cm g apps . android . cur riculum vit ae . test . Stub Domain Profile Ċ import Ġcom . cm g apps . android . cur riculum vit ae . test . Stub Network Profile Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . flow . single Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . hamcrest . Matcher Assert . assertThat Ċ import Ġorg . hamcrest . Matchers .` is ` Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġorg . mockito . Mockito . any Ċ import Ġorg . mockito . Mockito . verify Ċ import Ġorg . mockito . junit . jupiter . Mockito Extension Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ @ Extend With ( value Ġ= Ġ[ Mockito Extension :: class , ĠMain Dispatcher Extension :: class ]) Ċ internal Ġclass ĠProfile Repository Should Ġ{ ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġapi Service : ĠC v ApiService ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġdata Store : ĠData Store < Profile ?> ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠProfile Repository ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġbefore () Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when `( data Store . data ). thenReturn ( flow Of ( Stub DataStore Profile ())) ĊĠĠĠĠĠĠĠ Ġrepository Ġ= ĠProfile Repository ( api Service , Ġdata Store , ĠTest Coroutine Dispatcher ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" profile Ġflow ") ĊĠĠĠ Ġinternal Ġinner Ġclass ĠProfile Flow Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` emit Ġemploy ments `() Ġ= Ġrun Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrepository . profile . single () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` is `( Stub Domain Profile ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" refresh ĠProfile ") ĊĠĠĠ Ġ@ Extend With ( Main Dispatcher Extension :: class ) ĊĠĠĠ Ġinternal Ġinner Ġclass ĠRefresh Profile Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` call Ġget Profile `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( api Service . get Profile ()). thenReturn ( Stub Network Profile ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . refresh Profile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( api Service ). get Profile () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ` update Ġdata Ġstore `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( api Service . get Profile ()). thenReturn ( Stub Network Profile ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . refresh Profile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( data Store ). update Data ( any ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ