package Ġcom . mig uel . my application . repository Ċ Ċ import Ġandroidx . room . with Transaction Ċ import Ġcom . bridge international acade m ies . let sm ark . utils . Rx Scheduler Rule Ċ import Ġcom . bridge international acade m ies . let sm ark . utils . Test Exception Ċ import Ġcom . mig uel . my application . R Ċ import Ġcom . mig uel . my application . datasource . API _ ERROR Ċ import Ġcom . mig uel . my application . datasource . Resource Ċ import Ġcom . mig uel . my application . datasource . local . F ours quare Database Ċ import Ġcom . mig uel . my application . datasource . local . Venue Dao Ċ import Ġcom . mig uel . my application . datasource . local . entities . Venue Data Ċ import Ġcom . mig uel . my application . datasource . remote .* Ċ import Ġcom . mig uel . my application . repository . remote . Api Ven ues Ċ import Ġio . mock k .* Ċ import Ġio . reactivex . Single Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġokhttp 3 . MediaType Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġretrofit 2 . Response Ċ import Ġjava . net . Http URLConnection Ċ Ċ class ĠV en ues Repository Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġven ues Repository : ĠV en ues Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġ Ġdatabase : ĠF ours quare Database ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġven ues Api : ĠApi Ven ues ĊĊĠĠĠ Ġval Ġfake Error ResponseBody : ĠResponse Body Ġ= ĠResponse Body . create ( MediaType . parse (""), Ġ"") ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġtest Scheduler Rule Ġ= ĠRx Scheduler Rule () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġven ues Api Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġdatabase Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġven ues Repository Ġ= ĠV en ues Repository ( ven ues Api , Ġdatabase ) ĊĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this ) ĊĊĠĠĠĠĠĠĠ Ġmock k Static ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android x . room . Room Database Kt " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Lambda Ġ= Ġslot < suspend Ġ() Ġ-> ĠR >() ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġdatabase . with Transaction ( capture ( transaction Lambda )) Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Lambda . captured . invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ last Query Ven ues _ call (){ ĊĊĠĠĠĠĠĠĠ Ġval Ġven ues Dao : ĠV en ue Dao Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdatabase . venue Dao () Ġ} Ġreturns Ġven ues Dao ĊĊĠĠĠĠĠĠĠ Ġven ues Repository . last Query Ven ues () ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġven ues Dao . get Ven ues () Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ last Query Ven ues _ ok (){ ĊĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠList < Venue Data > Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġven ues Dao : ĠV en ue Dao Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdatabase . venue Dao () Ġ} Ġreturns Ġven ues Dao ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġven ues Dao . get Ven ues Cor outines () Ġ} Ġreturns Ġlist ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġven ues Repository . last Query Ven ues Cor outines () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġven ues Dao . get Ven ues Cor outines () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search Ven ues _ success () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Ġ= Ġ" city " ĊĠĠĠĠĠĠĠ Ġval Ġven ue Ġ= Ġ" venue " ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġ" address " ĊĠĠĠĠĠĠĠ Ġval Ġpost Code Ġ= Ġ" post Code " ĊĠĠĠĠĠĠĠ Ġval Ġmeta : ĠMeta Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġgeo code : ĠGeo code Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠLocation ( address = address , Ġpostal Code = post Code ) ĊĊĠĠĠĠĠĠĠ Ġval Ġven ue 1 = ĠV en ue ( name Ġ= Ġven ue , Ġlocation = location ) ĊĠĠĠĠĠĠĠ Ġval Ġven ue List Ġ= ĠlistOf ( venue 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġremote Response Ġ= Ġcom . mig uel . my application . datasource . remote . Response ( venue List , Ġgeo code ) ĊĠĠĠĠĠĠĠ Ġval Ġven ue Data Response Ġ= ĠV en ue Data Response ( meta , Ġremote Response ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠResponse . success ( venue Data Response ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Observable Ġ= ĠSingle . just ( response ) ĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= ĠResource . success ( venue Data Response ) ĊĠĠĠĠĠĠĠ Ġval Ġven ues Dao : ĠV en ue Dao Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġven ue Data Ġ= ĠV en ue Data ( name Ġ= Ġven ue , Ġaddress = address , Ġpost Code = post Code ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġven ues Api . search Ven ues ( near Ġ= Ġcity , Ġname = venue ) Ġ} Ġreturns Ġresponse Observable ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdatabase . venue Dao () Ġ} Ġreturns Ġven ues Dao ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġven ues Repository . search Ven ues ( city , Ġven ue ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġven ues Api . search Ven ues ( near Ġ= Ġcity , Ġname = venue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Test Ġ= Ġsingle . test () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert Complete () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert No Errors () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert Value ( resource ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġven ues Dao . insert Venue ( venue Data ) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search Ven ues _ exception () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Ġ= Ġ" city " ĊĠĠĠĠĠĠĠ Ġval Ġven ue Ġ= Ġ" venue " ĊĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠTest Exception () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Observable Ġ= ĠSingle . error < Response < Venue Data Response >>( exception ) ĊĠĠĠĠĠĠĠ Ġval Ġven ues Dao : ĠV en ue Dao Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġven ues Api . search Ven ues ( near Ġ= Ġcity , Ġname = venue ) Ġ} Ġreturns Ġresponse Observable ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdatabase . venue Dao () Ġ} Ġreturns Ġven ues Dao ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġven ues Repository . search Ven ues ( city , Ġven ue ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġven ues Api . search Ven ues ( near Ġ= Ġcity , Ġname = venue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Test Ġ= Ġsingle . test () ĊĠĠĠĠĠĠĠ Ġsingle Test . assertNot Complete () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert Error ( exception ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġven ues Dao . insert Venue ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search Ven ues _ error () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcity Ġ= Ġ" city " ĊĠĠĠĠĠĠĠ Ġval Ġven ue Ġ= Ġ" venue " ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error < Venue Data Response >( Http URLConnection . HTTP _ GATE WAY _ TIMEOUT , Ġfake Error ResponseBody ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Observable Ġ= ĠSingle . just ( response ) ĊĠĠĠĠĠĠĠ Ġval Ġresource Ġ= ĠResource . error < Venue Data Response >( API _ ERROR ) ĊĠĠĠĠĠĠĠ Ġval Ġven ues Dao : ĠV en ue Dao Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġven ues Api . search Ven ues ( near Ġ= Ġcity , Ġname = venue ) Ġ} Ġreturns Ġresponse Observable ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdatabase . venue Dao () Ġ} Ġreturns Ġven ues Dao ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġven ues Repository . search Ven ues ( city , Ġven ue ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġven ues Api . search Ven ues ( near Ġ= Ġcity , Ġname = venue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsingle Test Ġ= Ġsingle . test () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert Complete () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert No Errors () ĊĠĠĠĠĠĠĠ Ġsingle Test . assert Value ( resource ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġven ues Dao . insert Venue ( any ()) Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }