package Ġeu . j rie . put . w ti . big store . service Ċ Ċ import Ġeu . j rie . put . w ti . big store . model . User Ċ import Ġeu . j rie . put . w ti . big store . model . User Cache Ċ import Ġeu . j rie . put . w ti . big store . model . User Stats Ċ import Ġeu . j rie . put . w ti . big store . storage . User Cache Repository Ċ import Ġeu . j rie . put . w ti . big store . storage . UserRepository Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . co Verify Sequence Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . runs Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . Obsolete Cor outines Api Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . empty Flow Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNot Equals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNotNull Ċ import Ġorg . junit . jupiter . api . Assertions . assertNull Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . time . Instant Ċ import Ġjava . time . Instant . EPOCH Ċ import Ġjava . time . Instant . now Ċ Ċ @ Obsolete Cor outines Api Ċ @ Experimental Cor outines Api Ċ internal Ġclass ĠUser Cache Service Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcache Mock : ĠUser Cache Repository Ġ= Ġmock k () ĊĠĠĠ Ġprivate Ġval Ġrepository Mock : ĠUser Repository Ġ= Ġmock k () ĊĊĠĠĠ Ġprivate Ġval Ġservice Ġ= ĠUser Cache Service ( best Before , Ġstore Timeout , ĠGlobal Scope , Ġcache Mock , Ġrepository Mock ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġfresh Ġuser Ġfrom Ġcache `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstored Cache Ġ= Ġuser Cache () ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} Ġreturns Ġflow Of ( stored Cache ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( USER _ ID ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( stored Cache . user , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġunknown Ġuser Ġfrom Ġdb Ġand Ġupdate Ġcache `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} Ġreturns Ġempty Flow () ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . setUser ( any ()) Ġ} Ġjust Ġruns ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository Mock . find User ( USER _ ID ) Ġ} Ġreturns Ġuser Cache (). user ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( USER _ ID ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . getUser ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Mock . find User ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . setUser ( match Ġ{ Ġit . user . id Ġ== ĠUSER _ ID Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( USER _ ID , Ġresult !!. id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġexpired Ġuser Ġfrom Ġdb Ġand Ġupdate Ġcache `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstored Cache Ġ= Ġuser Cache ( EPOCH ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} Ġreturns Ġflow Of ( stored Cache ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . setUser ( any ()) Ġ} Ġjust Ġruns ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository Mock . find User ( USER _ ID ) Ġ} Ġreturns Ġuser Cache (). user ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( USER _ ID ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . getUser ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Mock . find User ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . setUser ( match Ġ{ Ġ( it . user . id Ġ== ĠUSER _ ID ) Ġand Ġ( it . updatedAt Ġ> Ġstored Cache . updatedAt ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( stored Cache . user , Ġresult ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stored Cache . user . id , Ġresult !!. id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġexpired Ġuser Ġfrom Ġcache Ġafter Ġtimeout `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstored Cache Ġ= Ġuser Cache ( EPOCH ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} Ġreturns Ġflow Of ( stored Cache ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . setUser ( any ()) Ġ} Ġjust Ġruns ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository Mock . find User ( USER _ ID ) Ġ} Ġco Answers Ġ{ Ġdelay ( store Timeout ); Ġuser Cache (). user Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( USER _ ID ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġdelay ( 1 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . getUser ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Mock . find User ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . setUser ( match Ġ{ Ġ( it . user . id Ġ== ĠUSER _ ID ) Ġand Ġ( it . updatedAt Ġ> Ġstored Cache . updatedAt ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( stored Cache . user , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġget Ġexpired Ġuser Ġfrom Ġcache Ġwhen Ġdb Ġdo Ġnot Ġhas Ġit `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġstored Cache Ġ= Ġuser Cache ( EPOCH ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} Ġreturns Ġflow Of ( stored Cache ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository Mock . find User ( USER _ ID ) Ġ} Ġthrows ĠNoSuch ElementException () ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( USER _ ID ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . getUser ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Mock . find User ( USER _ ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġco Verify Ġ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcache Mock . setUser ( any ()) Ġ} ĊĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stored Cache . user , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġreturn Ġnull Ġif Ġuser Ġis Ġnot Ġin Ġcache Ġand Ġnot Ġin Ġdb `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcache Mock . getUser ( USER _ ID ) Ġ} Ġreturns Ġempty Flow () ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository Mock . find User ( USER _ ID ) Ġ} Ġthrows ĠNoSuch ElementException () ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( USER _ ID ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Mock . getUser ( USER _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository Mock . find User ( USER _ ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġco Verify Ġ( exact ly Ġ= Ġ 0 ) Ġ{ Ġcache Mock . setUser ( any ()) Ġ} ĊĠĠĠĠĠĠĠ ĠassertNull ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSER _ ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġbest Before Ġ= Ġ 1 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġstore Timeout Ġ= Ġ 1 0 0 L ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġuser Cache ( updatedAt : ĠInstant Ġ= Ġnow ()) Ġ= ĠUser Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser ( USER _ ID , Ġempty Map (), Ġempty List (), ĠUser Stats ( updatedAt )), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠupdatedAt ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ