package Ġio . k orn at ow ic z . uit ests helper . rules Ċ Ċ import Ġcom . squareup . mos hi . Json Adapter Ċ import Ġcom . squareup . mos hi . Json Class Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġcom . squareup . mos hi . Types Ċ import Ġcom . squareup . mos hi . kotlin . reflect . Kotlin Json Adapter Factory Ċ import Ġorg . junit . rules . Test Watcher Ċ import Ġokhttp 3 . mock webserver . Dispatcher Ċ import Ġokhttp 3 . mock webserver . Mock Response Ċ import Ġokhttp 3 . mock webserver . Mock WebServer Ċ import Ġokhttp 3 . mock webserver . Re corded Request Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . runner . Description Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠMock Server Rule ( private Ġval Ġtest Name : Ġ() Ġ-> ĠString , Ġdispatcher : ĠDispatcher ? Ġ= Ġnull ): ĠTest Watcher () Ġ{ ĊĊĠĠĠ Ġvar Ġmocked Server : ĠList < Server Request > Ġ= Ġempty List () ĊĊĠĠĠ Ġprivate Ġvar ĠfileName : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠMock Server Data ( val Ġtest Name : ĠList < String >, Ġval Ġrequests : ĠList < Server Request >) ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠServer Request ( val Ġurl : ĠString , Ġval Ġresponses : ĠList < Server Response >, Ġvar Ġrequest Count : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget And Increment Request Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Count Ġ= Ġrequest Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprevious Count ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Json Class ( generate Adapter Ġ= Ġtrue ) ĊĠĠĠ Ġdata Ġclass ĠServer Response ( val Ġresponse Code : ĠInt , Ġval Ġresponse Body : ĠString , Ġval Ġdelay : ĠInt Ġ= Ġ 0 ) ĊĊĠĠĠ Ġfun Ġsetup Mock Server Data ( file : ĠString Ġ= Ġ" mock . json ") Ġ{ ĊĠĠĠĠĠĠĠ ĠfileName Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġfile Content Ġ= ĠreadFile ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġm oshi Ġ= ĠM oshi . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add ( Kotlin Json Adapter Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġadapter : ĠJson Adapter < List < Mock Server Data >> Ġ= Ġm oshi . adapter ( Types . new Parameterized Type ( Mutable List :: class . java , ĠMock Server Data :: class . java )) ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġadapter . fromJson ( file Content ) ĊĠĠĠĠĠĠĠ Ġval Ġdefault List Ġ= Ġjson !!. find Ġ{ Ġit . test Name . contains (" default ")} ĊĠĠĠĠĠĠĠ Ġval Ġtest List Ġ= Ġjson . find Ġ{ Ġit . test Name . contains ( test Name ()) } ĊĠĠĠĠĠĠĠ Ġmocked Server Ġ= Ġ( test List ?. requests ?. plus ( default List !!. requests )?. distinct By Ġ{ Ġit . url Ġ} Ġ?: Ġdefault List !!. requests ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġserver Ġ= ĠMock WebServer () ĊĠĠĠ Ġprivate Ġval Ġserver Port Ġ= Ġ 8 4 4 3 ĊĊĠĠĠ Ġprivate Ġval Ġserver Dispatcher Ġ= Ġdispatcher Ġ?: Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mock ed Ġdata Ġempty , Ġdid Ġyou Ġcall Ġsetup Mock Server Data Ġin Ġ@ Before Ġmethod Ġof Ġyour Ġtests ?", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmocked Server . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġrequest . path !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġresponse : ĠServer Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmocked Server . find Ġ{ Ġit . url Ġ== Ġpath Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Server Ġrequest Ġnot Ġfound Ġ- Ġdid Ġyou Ġadd Ġ$ path Ġto Ġ$ fileName ?", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġthis !!. responses [ get And Increment Request Count ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( response . response Code ). set Body ( response . response Body ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . delay Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body Delay ( response . delay . to Long (), ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Headers Delay ( response . delay . to Long (), ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠreadFile ( json FileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġthis :: class . java . getResource ("/ assets /$ json FileName ") ĊĠĠĠĠĠĠĠ Ġorg . junit . Assert . assertNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Have Ġyou Ġadded Ġthe Ġlocal Ġresource Ġcorrectly ?, ĠHint : Ġname Ġit Ġas : Ġ$ json FileName Ġand Ġput Ġin Ġ/ assets ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠinputStream ?. read Text () Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstarting ( description : ĠDescription ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġserver . dispatcher Ġ= Ġserver Dispatcher ĊĠĠĠĠĠĠĠ Ġserver . start ( server Port ) ĊĠĠĠĠĠĠĠ Ġsuper . starting ( description ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfinished ( description : ĠDescription ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġserver . close () ĊĠĠĠĠĠĠĠ Ġsuper . finished ( description ) ĊĠĠĠ Ġ} Ċ } Ċ