/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 9 . ĠS ir ĠWell ing ton . Ċ Ġ* Ġ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 Ġtech . sir well ing ton . alchemy . http . mock Ċ Ċ import Ġcom . google . gson . Json Null Ċ import Ġjunit . framework . Assert . fail Ċ import Ġs ir . well ing ton . alchemy . collections . lists . Lists Ċ import Ġs ir . well ing ton . alchemy . collections . maps . Maps Ċ import Ġtech . sir well ing ton . alchemy . annotations . access . Internal Ċ import Ġtech . sir well ing ton . alchemy . annotations . arguments . Required Ċ import Ġtech . sir well ing ton . alchemy . annotations . design s . Step Machine Design Ċ import Ġtech . sir well ing ton . alchemy . annotations . design s . Step Machine Design . Role . MACHINE Ċ import Ġtech . sir well ing ton . alchemy . arguments . Alchemy Assertion Ċ import Ġtech . sir well ing ton . alchemy . arguments . Arguments . check That Ċ import Ġtech . sir well ing ton . alchemy . arguments . assertions . instance Of Ċ import Ġtech . sir well ing ton . alchemy . arguments . assertions . non Null Reference Ċ import Ġtech . sir well ing ton . alchemy . arguments . assertions . notNull Ċ import Ġtech . sir well ing ton . alchemy . http . Alchemy Http Ċ import Ġtech . sir well ing ton . alchemy . http . Alchemy Request Steps Ċ import Ġtech . sir well ing ton . alchemy . http . HttpResponse Ċ import Ġtech . sir well ing ton . alchemy . http . exceptions . Alchemy HttpException Ċ import Ġtech . sir well ing ton . alchemy . http . mock . Mock Request . Companion . ANY _ BODY Ċ import Ġtech . sir well ing ton . alchemy . http . mock . Mock Request . Companion . NO _ BODY Ċ import Ġjava . lang . String . format Ċ import Ġjava . util . concurrent . Callable Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠS ir Well ing ton Ċ Ġ*/ Ċ @ Internal Ċ @ Step Machine Design ( role Ġ= ĠM ACH INE ) Ċ internal Ġopen Ġclass ĠMock Alchemy Http ( expected Actions : ĠMap < Mock Request , ĠCallable <* >>) Ġ: ĠAl chemy Http Ċ { ĊĊĠĠĠ Ġprivate Ġval Ġexpected Actions : ĠMutable Map < Mock Request , ĠCallable <* >> Ġ= ĠMaps . create Synchron ized () ĊĊĠĠĠ Ġprivate Ġval Ġrequests Made Ġ= ĠLists . create < Mock Request >() ĊĊĠĠĠ Ġoverride Ġval Ġdefault Headers : ĠMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġ@ Required ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġempty Map () ĊĊĠĠĠ Ġinit ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck That ( expected Actions ). is A ( non Null Reference ()) ĊĠĠĠĠĠĠĠ Ġthis . expected Actions . put All ( expected Actions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Required ĊĠĠĠ Ġoverride Ġfun Ġusing Default Header ( key : ĠString , Ġvalue : ĠString ): ĠAl chemy Http ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgo (): ĠAl chemy Request Steps . Step 1 ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMock Steps . Mock Step 1 ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal ĊĠĠĠ Ġ@ Throws ( Alchemy HttpException :: class ) ĊĠĠĠ Ġopen Ġfun Ġget Response For ( request : ĠMock Request ): ĠHttpResponse ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck That ( request ). is A ( expected Request ()) ĊĊĠĠĠĠĠĠĠ Ġrequests Made . add ( request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġfind Matching Action For ( request ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠAny ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġaction . call () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( ex : ĠAl chemy HttpException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( ex : ĠException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAl chemy HttpException ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck That ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Message ( format (" Response ĠType ĠW anted : Ġ% s Ġbut Ġactual : Ġnull ", ĠHttpResponse :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is A ( notNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Message ( format (" Response ĠType ĠW anted : Ġ% s Ġbut Ġactual : Ġ% s ", ĠHttpResponse :: class . java , Ġresponse . java Class )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is A ( instance Of ( HttpResponse :: class . java )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresponse Ġas ĠHttpResponse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal ĊĠĠĠ Ġ@ Throws ( Alchemy HttpException :: class ) ĊĠĠĠ Ġopen Ġfun Ġ< T > Ġget Response For ( request : ĠMock Request , Ġexpected Class : ĠClass < T >): ĠT ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck That ( request , Ġexpected Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. are ( notNull ()) ĊĊĠĠĠĠĠĠĠ Ġrequests Made . add ( request ) ĊĊĠĠĠĠĠĠĠ Ġcheck That ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Message (" Unexpected ĠRequest : Ġ" Ġ+ Ġrequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is A ( expected Request ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= Ġfind Matching Action For ( request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Object : ĠAny ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Object Ġ= Ġoperation !!. call () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( ex : ĠAl chemy HttpException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( ex : ĠException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAl chemy HttpException ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġcheck That ( response Object ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Message ( format (" Response ĠType ĠW anted : Ġ% s Ġbut Ġactual : Ġ% s ", Ġresponse Object . java Class , Ġexpected Class )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is A ( instance Of ( expected Class )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresponse Object Ġas ĠT ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Internal ĊĠĠĠ Ġopen Ġfun Ġverify All Requests Made () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġexpected @ Ġfor Ġ( expected Request Ġin Ġexpected Actions . keys ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmade @ Ġfor Ġ( request Made Ġin Ġrequests Made ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requests Match ( expected Request , Ġrequest Made )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue @ expected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Re aching Ġhere Ġmeans Ġno Ġmatch Ġwas Ġfound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Request Ġnever Ġmade : Ġ" Ġ+ Ġexpected Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpected Request (): ĠAl chemy Assertion < Mock Request > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAl chemy Assertion Ġ{ Ġrequest Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck That ( request ). is A ( non Null Reference ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġfind Matching Action For ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck That ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Message (" request Ġwas Ġnot Ġexpected : Ġ[$ request ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is A ( non Null Reference ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Matching Action For ( request : ĠMock Request ): ĠCallable < *> ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfound In Map Ġ= Ġexpected Actions [ request ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( found In Map Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfound In Map ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġexpected Actions . keys ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requests Match ( element , Ġrequest )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpected Actions [ element ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequests Match ( expected : ĠMock Request , Ġactual : ĠMock Request ): ĠBoolean ĊĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expected . method Ġ!= Ġactual . method ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expected . queryParams Ġ!= Ġactual . queryParams ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// If Ġthe ĠURL Ġis Ġnull , Ġthis Ġmeans Ġany ĊĠĠĠĠĠĠĠ Ġif Ġ( expected . url Ġ!= ĠMock Request . ANY _ URL ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected . url . toString () Ġ!= Ġactual . url . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Now Ġcomparing Ġbodies ĊĊĠĠĠĠĠĠĠ Ġ// Any Ġbody Ġmatches Ġto Ġanything ĊĠĠĠĠĠĠĠ Ġif Ġ( expected . body Ġ=== ĠANY _ BODY ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( expected . body Ġ=== ĠNO _ BODY ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactual . body Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual . body Ġ=== ĠNO _ BODY Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual . body Ġ=== ĠJson Null . INSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Try Ġa Ġshallow Ġequality Ġfirst ĊĠĠĠĠĠĠĠ Ġif Ġ( expected . body Ġ=== Ġactual . body ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Then Ġfallback Ġto Ġequals () Ġif Ġall Ġelse Ġfails ĊĠĠĠĠĠĠĠ Ġreturn Ġexpected . body Ġ== Ġactual . body ĊĊĠĠĠ Ġ} ĊĊ Ċ } Ċ