/* Ċ Ġ* Ġ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 Ċ Ċ import Ġcom . n ha ar man . mockito _ kotlin . K Argument Captor Ċ import Ġcom . n ha ar man . mockito _ kotlin . argument Captor Ċ import Ġorg . hamcrest . Matchers . equalTo Ċ import Ġorg . hamcrest . Matchers . not Ċ import Ġorg . hamcrest . Matchers . notNull Value Ċ import Ġorg . hamcrest . Matchers . same Instance Ċ import Ġorg . junit . Assert . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito . verify Ċ import Ġorg . mockito . Mockito . verify Zero Interactions Ċ import Ġs ir . well ing ton . alchemy . collections . maps . Maps Ċ import Ġtech . sir well ing ton . alchemy . generator . Alchemy Generator . Get . one Ċ import Ġtech . sir well ing ton . alchemy . generator . Boolean Generators . Companion . b ooleans Ċ import Ġtech . sir well ing ton . alchemy . generator . Collection Generators Ċ import Ġtech . sir well ing ton . alchemy . generator . Number Generators . Companion . inte gers Ċ import Ġtech . sir well ing ton . alchemy . generator . Number Generators . Companion . small Positive Inte gers Ċ import Ġtech . sir well ing ton . alchemy . generator . String Generators . Companion . alphabet ic Strings Ċ import Ġtech . sir well ing ton . alchemy . generator . String Generators . Companion . hex adecimal String Ċ import Ġtech . sir well ing ton . alchemy . http . Alchemy Request Steps . On Success Ċ import Ġtech . sir well ing ton . alchemy . http . Alchemy Request Steps . Step 3 Ċ import Ġtech . sir well ing ton . alchemy . http . Generators . valid Urls Ċ import Ġtech . sir well ing ton . alchemy . test . junit . Throwable Assertion . assert Throws Ċ import Ġtech . sir well ing ton . alchemy . test . junit . runners . Alchemy TestRunner Ċ import Ġtech . sir well ing ton . alchemy . test . junit . runners . Dont Repeat Ċ import Ġtech . sir well ing ton . alchemy . test . junit . runners . Repeat Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author ĠS ir Well ing ton Ċ Ġ*/ Ċ @ RunWith ( Alchemy TestRunner :: class ) Ċ @ Repeat Ċ class ĠStep 3 Impl Test Ċ { ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstate Machine : ĠAl chemy Http StateMachine ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrequest : ĠHttpRequest ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrequest Captor : ĠK Argument Captor < HttpRequest > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠonSuccess : ĠOn Success < *> ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġurl : ĠURL ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinstance : ĠStep 3 ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġ@ Throws ( Malformed URLException :: class ) ĊĠĠĠ Ġfun ĠsetUp () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġurl Ġ= Ġone ( valid Urls ()) ĊĊĠĠĠĠĠĠĠ Ġrequest Ġ= ĠHttpRequest . Builder . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. using Url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġinstance Ġ= ĠStep 3 Impl ( state Machine , Ġrequest ) ĊĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( state Machine ) ĊĊĠĠĠĠĠĠĠ Ġrequest Captor Ġ= Ġargument Captor () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Using Header () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Edge ĠC ases ĊĠĠĠĠĠĠĠ ĠassertThrows Ġ{ Ġinstance . using Header ("", Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( IllegalArgumentException :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// Happy Ġcases ĊĠĠĠĠĠĠĠ Ġval Ġexpected Headers Ġ= ĠCollection Generators . map Of ( alphabet ic Strings (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhexadecimal String ( 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġexpected Headers ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . using Header ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinstance . at ( url ) ĊĊĠĠĠĠĠĠĠ Ġverify ( state Machine ). execute Sync ( request Captor . capture ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Made Ġ= Ġrequest Captor . first Value ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made , Ġnot NullValue ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made , Ġnot ( same Instance ( request ))) ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made . request Headers , ĠequalTo (( expected Headers ))) ĊĊĠĠĠĠĠĠĠ Ġ// Adding Ġan Ġempty Ġvalue Ġshould Ġbe Ġok Ġtoo ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġone ( alphabet ic Strings ()) ĊĠĠĠĠĠĠĠ Ġinstance . using Header ( key , Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Using QueryParam () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġamount Ġ= Ġone ( inte gers ( 5 , Ġ 2 0 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġstrings Ġ= ĠCollection Generators . map Of ( alphabet ic Strings (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhexadecimal String ( 1 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount ) ĊĊĠĠĠĠĠĠĠ Ġval Ġintegers Ġ= ĠCollection Generators . map Of ( alphabet ic Strings (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmall Positive Inte gers (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount ) ĊĊĠĠĠĠĠĠĠ Ġval Ġb ooleans Ġ= ĠCollection Generators . map Of ( alphabet ic Strings (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb ooleans (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġstrings ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . using QueryParam ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġintegers ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . using QueryParam ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġb ooleans ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . using QueryParam ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠMaps . mutable Copy Of ( strings ) ĊĠĠĠĠĠĠĠ Ġ// Put Ġthe Ġintegers ĊĠĠĠĠĠĠĠ Ġintegers . forEach Ġ{ Ġk , Ġv Ġ-> Ġexpected . put ( k , Ġv . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Put Ġthe Ġb ooleans Ġtoo ĊĠĠĠĠĠĠĠ Ġb ooleans . forEach Ġ{ Ġk , Ġv Ġ-> Ġexpected . put ( k , Ġv . toString ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġinstance . at ( url ) ĊĊĠĠĠĠĠĠĠ Ġverify ( state Machine ). execute Sync ( request Captor . capture ()) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Made Ġ= Ġrequest Captor . first Value ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made , Ġnot NullValue ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made . queryParams , ĠequalTo ( expected )) ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made , Ġnot ( same Instance ( request ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Dont Repeat ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Using QueryParam Edge Cases () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Edge Ġcases ĊĠĠĠĠĠĠĠ ĠassertThrows Ġ{ Ġinstance . using QueryParam ("", Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( IllegalArgumentException :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Follow Redirect s () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThrows Ġ{ Ġinstance . follow Redirect s (- 1 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( IllegalArgumentException :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . follow Redirect s () ĊĠĠĠĠĠĠĠ ĠassertThat ( instance , Ġnot NullValue ()) ĊĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġinstance . follow Redirect s ( 3 0 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( instance , Ġnot NullValue ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest At () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Edge ĠC ases ĊĠĠĠĠĠĠĠ ĠassertThrows Ġ{ Ġinstance . at ("") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( IllegalArgumentException :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġinstance . at ( url ) ĊĠĠĠĠĠĠĠ Ġverify ( state Machine ). execute Sync ( request Captor . capture ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Made Ġ= Ġrequest Captor . first Value ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made , Ġnot NullValue ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made . url , ĠequalTo ( url )) ĊĠĠĠĠĠĠĠ ĠassertThat ( request Made , Ġnot ( same Instance ( request ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Success () ĊĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinstance . on Success ( on Success Ġas ĠOn Success < HttpResponse >) ĊĊĠĠĠĠĠĠĠ Ġverify ( state Machine ). jump To Step 5 ( request , ĠHttpResponse :: class . java , ĠonSuccess Ġas ĠOn Success < HttpResponse >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Expecting () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// S ad ĠC ases ĊĠĠĠĠĠĠĠ ĠassertThrows Ġ{ Ġinstance . expect ing ( Void :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. isInstanceOf ( IllegalArgumentException :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// Happy Ġcases ĊĠĠĠĠĠĠĠ Ġval Ġexpected Class Ġ= ĠString :: class . java ĊĠĠĠĠĠĠĠ Ġinstance . expect ing ( expected Class ) ĊĠĠĠĠĠĠĠ Ġverify ( state Machine ). jump To Step 4 ( request , Ġexpected Class ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ