/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 1 9 ĠO A AT 's Ġauthor Ġ: ĠF red ĠMont ari ol . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġcom . oa at . web Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . oa at . entities . Role Ċ import Ġcom . oa at . entities . Role . ROLE _ ADMIN Ċ import Ġcom . oa at . entities . Role . ROLE _ USER Ċ import Ġcom . oa at . entities . User Ċ import Ġcom . oa at . security . JWT Util Ċ import Ġio . netty . handler . ssl . Ssl Context Builder Ċ import Ġio . netty . handler . ssl . util . In secure Trust ManagerFactory Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . autoconfigure . rest docs . Auto Configure Rest Docs Ċ import Ġorg . springframework . boot . test . context . SpringBootTest Ċ import Ġorg . springframework . boot . web . server . Local Server Port Ċ import Ġorg . springframework . http . HttpHeaders Ċ import Ġorg . springframework . http . client . reactive . Reactor Client Http Connector Ċ import Ġorg . springframework . http . codec . json . Jack son 2 Json Decoder Ċ import Ġorg . springframework . http . codec . json . Jack son 2 Json Encoder Ċ import Ġorg . springframework . rest docs . Rest Documentation Context Provider Ċ import Ġorg . springframework . rest docs . Rest Documentation Extension Ċ import Ġorg . springframework . rest docs . constraints . Constraint Descriptions Ċ import Ġorg . springframework . rest docs . operation . preprocess . Pre processors . pretty Print Ċ import Ġorg . springframework . rest docs . payload . Payload Documentation . field With Path Ċ import Ġorg . springframework . rest docs . snippet . Attributes . key Ċ import Ġorg . springframework . rest docs . web test client . Web Test Client Rest Documentation . documentation Configuration Ċ import Ġorg . springframework . test . context . junit . jupiter . Spring Extension Ċ import Ġorg . springframework . test . web . reactive . server . Web Test Client Ċ import Ġorg . springframework . util . StringUtils Ċ import Ġorg . springframework . web . reactive . function . client . Exchange Str ategies Ċ import Ġreactor . netty . http . client . HttpClient ĊĊ Ċ internal Ġtype alias ĠServer ResponseError Ġ= ĠMap < String , ĠAny > Ċ Ċ @ Extend With ( ĊĠĠĠĠĠĠĠ ĠRest Documentation Extension :: class , ĊĠĠĠĠĠĠĠ ĠSpring Extension :: class Ċ ) Ċ @ SpringBootTest ( web Environment Ġ= ĠSpring Boot Test . Web Environment . RANDOM _ PORT ) Ċ @ Auto Configure Rest Docs ( ĊĠĠĠĠĠĠĠ Ġuri Scheme Ġ= Ġ" https ", ĊĠĠĠĠĠĠĠ Ġuri Port Ġ= Ġ 8 4 4 3 Ċ ) Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ internal Ġabstract Ġclass ĠApi Test Ġ{ ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġclient : ĠWeb Test Client ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġjwt Util : ĠJWT Util ĊĊĠĠĠ Ġ@ Before All ĊĠĠĠ Ġfun Ġbefore ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Autowired Ġjwt Util : ĠJWT Util , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Autowired Ġrest Documentation : ĠRest Documentation Context Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Autowired ĠobjectMapper : ĠObjectMapper , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Local Server Port Ġport : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . jwt Util Ġ= Ġjwt Util ĊĠĠĠĠĠĠĠ Ġval Ġssl Context Ġ= ĠS sl Context Builder . for Client () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trust Manager ( In secure Trust ManagerFactory . INSTANCE ). build () ĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠHttpClient . create (). secure { Ġt Ġ-> Ġt . ssl Context ( ssl Context ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġhttp Connector Ġ= ĠRe actor Client Http Connector ( httpClient ) ĊĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠWeb Test Client . bind ToServer ( http Connector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl (" https :// localhost :$ port ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange Str ategies ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExchange Str ategies . builder (). code cs Ġ{ Ġcodecs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefaults Ġ= Ġcodecs . default Code cs () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefaults . jackson 2 Json Encoder ( Jack son 2 Json Encoder ( object Mapper )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefaults . jackson 2 Json Decoder ( Jack son 2 Json Decoder ( object Mapper )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( documentation Configuration ( rest Documentation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. operation Pre processors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Request Defaults ( pretty Print ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Response Defaults ( pretty Print ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Auth Header ( role : ĠRole ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġwhen ( role ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠROLE _ USER Ġ-> ĠUser (" F red ", Ġ" password ", Ġ" f red @ mail . com ", Ġauthor ities Ġ= Ġmutable ListOf ( ROLE _ USER ), Ġenabled Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠROLE _ ADMIN Ġ-> ĠUser (" Boss ", Ġ" sec ured _ password ", Ġ" boss @ mail . com ", Ġauthor ities Ġ= Ġmutable ListOf ( ROLE _ ADMIN ), Ġenabled Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjwt Token Ġ= Ġjwt Util . generate Token ( user ) ĊĠĠĠĠĠĠĠ Ġprintln (" generating Ġjwt Ġtoken Ġ: Ġ$ jwt Token ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Bearer Ġ$ jwt Token " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtension Ġfunction Ġto Ġ[ Web Test Client . Request Headers Spec ] Ġallowing Ġto Ġadd ĊĠĠĠĠ Ġ* Ġa Ġjwt Ġtoken ĠHTTP ĠHeader Ġ-> ĠAuthorization Ġ: ĠBearer ĠJwt Token ĊĠĠĠĠ Ġ* ĠCan Ġbe Ġused Ġonly Ġin ĠTests Ġextending Ġ[ Api Test ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun ĠWeb Test Client . Request Headers Spec <* >. add Auth Header ( role : ĠRole Ġ= ĠROLE _ USER ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . header ( HttpHeaders . AUTHORIZATION , Ġbuild Auth Header ( role )) ĊĊĠĠĠ Ġprotected Ġclass ĠCon str ained Fields Ġinternal Ġconstructor ( input : ĠClass <* >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconstraint Descriptions Ġ= ĠConstraint Descriptions ( input ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġwith Path ( path : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield With Path ( path ). attributes ( key (" constraints "). value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStringUtils . collection To Delimit edString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . constraint Descriptions . descriptions For Property ( path ), Ġ"\ n ", Ġ"* Ġ", Ġ" "))) ĊĠĠĠ Ġ} Ċ } Ċ