/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠExp edia , ĠInc Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . exp edi ag roup . graphql . client . spring Ċ Ċ import Ġcom . exp edi ag roup . graphql . client . GraphQL Client Request Ċ import Ġcom . exp edi ag roup . graphql . types . Graph Q LError Ċ import Ġcom . exp edi ag roup . graphql . types . GraphQL Response Ċ import Ġcom . exp edi ag roup . graphql . types . Source Location Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . github . tom ake hur st . wire mock . Wire Mock Server Ċ import Ġcom . github . tom ake hur st . wire mock . client . Mapping Builder Ċ import Ġcom . github . tom ake hur st . wire mock . client . Wire Mock Ċ import Ġcom . github . tom ake hur st . wire mock . core . Wire Mock Configuration Ċ import Ġcom . github . tom ake hur st . wire mock . matching . EqualTo Pattern Ċ import Ġio . netty . channel . Channel Option Ċ import Ġio . netty . handler . timeout . Read TimeoutException Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . After All Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . http . client . reactive . Client Http Connector Ċ import Ġorg . springframework . http . client . reactive . Reactor Client Http Connector Ċ import Ġorg . springframework . web . reactive . function . client . Web Client Ċ import Ġorg . springframework . web . reactive . function . client . Web Client RequestException Ċ import Ġorg . springframework . web . reactive . function . client . Web ClientResponse Exception Ċ import Ġreactor . netty . http . client . HttpClient Ċ import Ġjava . time . Duration Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertNull Ċ Ċ class ĠGraphQL Web Client Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġj ack son ObjectMapper Ġ= Ġj ack son ObjectMapper () ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠWire Mock . reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ver ifies Ġspring Ġweb Ġclient Ġcan Ġretrieve Ġdata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Response Ġ= ĠGraphQL Response < HelloWorld Result >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠHello World Result (" Hello ĠWorld ! "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraph Q LError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" hello World Ġis Ġalso Ġthrowing Ġan Ġexception ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocations Ġ= ĠlistOf ( Source Location ( 1 , Ġ 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= ĠlistOf (" hello World "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextensions Ġ= Ġmap Of (" exception Extension Key " Ġto Ġ" J unit Custom Value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextensions Ġ= Ġmap Of (" extension Key " Ġto Ġ" JUnit Value ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠWire Mock . stub For ( stub Response ( expected Response )) ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠGraphQL Web Client ( url Ġ= Ġ"${ wire Mock Server . baseUrl () }/ graphql ") ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠGraphQL Response < HelloWorld Result > Ġ= Ġclient . execute ( HelloWorld Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . data ?. hello World , Ġresult . data ?. hello World ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . errors ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresult . errors ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= Ġexpected Response . errors ?. first () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġresult . errors ?. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( actual Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Error . message , Ġactual Error . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual Error . locations ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Error . locations ?. first OrNull ()?. column , Ġactual Error . locations ?. first OrNull ()?. column ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Error . locations ?. first OrNull ()?. line , Ġactual Error . locations ?. first OrNull ()?. line ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactual Error . path ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" hello World ", Ġactual Error . path ?. first OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" J unit Custom Value ", Ġactual Error . extensions ?. get (" exception Extension Key ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . extensions ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" JUnit Value ", Ġresult . extensions ?. get (" extension Key ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ver ifies Ġspring Ġweb Ġclient Ġinstance Ġcan Ġbe Ġcustomized `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Response Ġ= ĠGraphQL Response ( data Ġ= ĠHello World Result (" Hello ĠWorld ! ")) ĊĠĠĠĠĠĠĠ ĠWire Mock . stub For ( stub Response ( response Ġ= Ġexpected Response , Ġdelay Millis Ġ= Ġ 5 0 )) ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient : ĠHttpClient Ġ= ĠHttpClient . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. option ( Channel Option . CONNECT _ TIMEOUT _ M ILL IS , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. response Timeout ( Duration . of Millis ( 1 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġconnector : ĠClient Http Connector Ġ= ĠRe actor Client Http Connector ( httpClient . wire tap ( true )) ĊĠĠĠĠĠĠĠ Ġval Ġweb Client Builder Ġ= ĠWeb Client . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. client Connector ( connector ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠGraphQL Web Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"${ wire Mock Server . baseUrl () }/ graphql ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ= Ġweb Client Builder ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġassert Fails With ( Web Client RequestException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . execute < GraphQL Response < HelloWorld Result >>( HelloWorld Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( exception . cause Ġis ĠRead TimeoutException ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ver ifies Ġindividual Ġspring Ġweb Ġclient Ġrequests Ġcan Ġbe Ġcustomized `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Response Ġ= ĠGraphQL Response ( data Ġ= ĠHello World Result (" Hello ĠWorld ! ")) ĊĠĠĠĠĠĠĠ Ġval Ġcustom Header Name Ġ= Ġ" X - Custom - Header " ĊĠĠĠĠĠĠĠ Ġval Ġcustom HeaderValue Ġ= Ġ" My - Custom - Header - Value " ĊĠĠĠĠĠĠĠ ĠWire Mock . stub For ( stub Response ( expected Response ). with Header ( custom Header Name , ĠEqual To Pattern ( custom HeaderValue ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠGraphQL Web Client ( url Ġ= Ġ"${ wire Mock Server . baseUrl () }/ graphql ") ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠGraphQL Response < HelloWorld Result > Ġ= Ġclient . execute ( HelloWorld Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( custom Header Name , Ġcustom HeaderValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . data ?. hello World , Ġresult . data ?. hello World ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . errors ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . extensions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ver ifies ĠNon - OK ĠHTTP Ġresponses Ġwill Ġthrow Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ ĠWire Mock . stub For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWire Mock . post ("/ graphql ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. willReturn ( Wire Mock . a Response (). with Status ( 5 0 0 ). with Body (" Internal Ġserver Ġerror ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠGraphQL Web Client ( url Ġ= Ġ"${ wire Mock Server . baseUrl () }/ graphql ") ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġassert Fails With < Web ClientResponse Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . execute < HelloWorld Result >( HelloWorld Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 0 , Ġerror . raw StatusCode ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Internal Ġserver Ġerror ", Ġerror . response Body AsString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ver ifies Ġresponse Ġwith Ġempty Ġbody Ġwill Ġthrow Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ ĠWire Mock . stub For ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWire Mock . post ("/ graphql ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. willReturn ( Wire Mock . a Response (). with Status ( 2 0 4 )) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠGraphQL Web Client ( url Ġ= Ġ"${ wire Mock Server . baseUrl () }/ graphql ") ĊĠĠĠĠĠĠĠ Ġassert Fails With < NoSuch ElementException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . execute < HelloWorld Result >( HelloWorld Request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstub Response ( response : ĠGraphQL Response <* >, Ġdelay Millis : ĠInt Ġ= Ġ 0 ): ĠMapping Builder Ġ= ĊĠĠĠĠĠĠĠ ĠWire Mock . post ("/ graphql ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. willReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWire Mock . a Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Status ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Header (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Body ( jackson ObjectMapper . writeValue AsString ( response )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Fixed Delay ( delay Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠHello World Result ( val Ġhello World : ĠString ) ĊĊĠĠĠ Ġobject ĠHello World Request Ġ: ĠGraphQL Client Request ( ĊĠĠĠĠĠĠĠ Ġquery Ġ= Ġ" query ĠHello World Query Ġ{ Ġhello World Ġ} ", ĊĠĠĠĠĠĠĠ Ġoperation Name Ġ= Ġ" HelloWorld " ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresponse Type (): ĠClass < HelloWorld Result > Ġ= ĠHello World Result :: class . java ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġwire Mock Server : ĠWire Mock Server Ġ= ĠWire Mock Server ( Wire Mock Configuration . wire Mock Config (). dynamic Port ()) ĊĊĠĠĠĠĠĠĠ Ġ@ Before All ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġone Time Setup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwire Mock Server . start () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWire Mock . configure For ( wire Mock Server . port ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ After All ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġone Time Tear Down () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwire Mock Server . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ