package Ġtech . sim ter . reactive . web . web filter Ċ Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . test . context . Test Property Source Ċ import Ġorg . springframework . test . context . junit . jupiter . Spring JUnit Config Ċ import Ġorg . springframework . test . web . reactive . server . Web Test Client Ċ import Ġorg . springframework . test . web . reactive . server . Web Test Client . bind To Router Function Ċ import Ġorg . springframework . web . reactive . config . Enable Web Flux Ċ import Ġorg . springframework . web . reactive . function . server . Handler Function Ċ import Ġorg . springframework . web . reactive . function . server . Request Pred icates Ċ import Ġorg . springframework . web . reactive . function . server . Router Functions . route Ċ import Ġorg . springframework . web . reactive . function . server . Server Response Ċ import Ġtech . sim ter . jwt . Header Ċ import Ġtech . sim ter . jwt . JWT Ċ import Ġtech . sim ter . jwt . Payload Ċ import Ġtech . sim ter . reactive . context . System Context Ċ import Ġtech . sim ter . reactive . web . Utils . TEXT _ PLAIN _ UTF 8 Ċ import Ġtech . sim ter . reactive . web . web filter . Jwt Web Filter . Companion . JWT _ HEADER _ NAME Ċ import Ġtech . sim ter . reactive . web . web filter . Jwt Web Filter . Companion . JWT _ VALUE _ PREFIX Ċ import Ġjava . time . Z onedDateTime Ċ Ċ @ Spring JUnit Config ( Jwt Web Filter :: class ) Ċ @ Enable Web Flux Ċ @ Test Property Source ( properties Ġ= Ġ[ ĊĠ Ġ" sim ter . jwt . secret - key = jwt - test ", ĊĠ Ġ" sim ter . jwt . require - authorized = true " Ċ ]) Ċ class ĠJwt Web Filter Test Ġ@ Autowired Ġconstructor ( ĊĠ Ġprivate Ġval Ġjwt Web Filter : ĠJwt Web Filter , ĊĠ Ġ@ Value ("\ ${ sim ter . jwt . secret - key }") Ġprivate Ġval Ġsecret Key : ĠString Ċ ) Ġ{ ĊĠ Ġprivate Ġvar Ġurl Ġ= Ġ"/ test " ĊĠ Ġprivate Ġvar Ġrequest Predicate Ġ= ĠRequest Pred icates . POST ( url ) ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġwith Valid Jwt Header () Ġ{ ĊĠĠĠ Ġ// Ġcreate Ġthe Ġclient Ġwith Ġthe Ġjwt Web Filter ĊĠĠĠ Ġval Ġclient Ġ= Ġbind To Router Function ( route ( request Predicate , ĠHandler Function < Server Response > Ġ{ ĊĠĠĠĠĠ ĠSystem Context . get Authenticated User () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . Ġshould Ġget Ġthe Ġuser Ġcorrectly ĊĠĠĠĠĠĠĠĠĠ ĠassertEquals ( TEST _ USER , Ġit . get ()) ĊĠĠĠĠĠĠĠĠĠ ĠSystem Context . has All Role (* TEST _ RO LES . split ("," ). to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . Ġshould Ġhas Ġall Ġthe Ġroles ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠServer Response . no Content (). build () Ġ} ĊĠĠĠ Ġ})) ĊĠĠĠĠĠ Ġ. web Filter < Web Test Client . Router Function Spec >( jwt Web Filter ) Ġ Ġ// Ġregister ĠWeb Filter ĊĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ// Ġdo Ġrequest ĊĠĠĠ Ġclient . post (). uri ( url ) ĊĠĠĠĠĠ Ġ. header ( JWT _ HEADER _ NAME , Ġ"$ JWT _ VALUE _ PREFIX ${ create Jwt () }") Ġ// ĠAdd Ġjwt Ġheader ĊĠĠĠĠĠ Ġ. exchange (). expect Status (). is No Content ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġwith Invalid Jwt Header () Ġ{ ĊĠĠĠ Ġ// Ġcreate Ġthe Ġclient Ġwith Ġthe Ġjwt Web Filter ĊĠĠĠ Ġval Ġclient Ġ= Ġbind To Router Function ( route ( request Predicate , ĠHandler Function < Server Response > Ġ{ ĊĠĠĠĠĠ ĠServer Response . no Content (). build () ĊĠĠĠ Ġ})) ĊĠĠĠĠĠ Ġ. web Filter < Web Test Client . Router Function Spec >( jwt Web Filter ) Ġ Ġ// Ġregister ĠWeb Filter ĊĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ// Ġdo Ġrequest ĊĠĠĠ Ġval Ġresponse Body Ġ= Ġclient . post (). uri ( url ) ĊĠĠĠĠĠ Ġ. header ( JWT _ HEADER _ NAME , Ġ"$ JWT _ VALUE _ PREFIX Ġsomething - wrong ") Ġ// ĠAdd Ġjwt Ġheader ĊĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠ Ġ. expect Status (). is Unauthorized ĊĠĠĠĠĠ Ġ. expect Header (). contentType ( TEXT _ PLAIN _ UTF 8 ) ĊĠĠĠĠĠ Ġ. expect Body ( String :: class . java ) ĊĠĠĠĠĠ Ġ. return Result (). response Body ĊĠĠĠ ĠassertEquals (" Invalid ĠJWT ", Ġresponse Body ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġwithout Jwt Header () Ġ{ ĊĠĠĠ Ġ// Ġcreate Ġthe Ġclient Ġwith Ġthe Ġjwt Web Filter ĊĠĠĠ Ġval Ġclient Ġ= Ġbind To Router Function ( route ( request Predicate , ĠHandler Function < Server Response > Ġ{ ĊĠĠĠĠĠ ĠSystem Context . get Authenticated User () ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . Ġwithout Ġcontext Ġshould Ġreturn Ġnull Ġuser ĊĠĠĠĠĠĠĠĠĠ ĠassertThrows ( NoSuch ElementException :: class . java , Ġ{ Ġit . get () Ġ}) ĊĠĠĠĠĠĠĠĠĠ ĠSystem Context . has All Role (* TEST _ RO LES . split ("," ). to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . Ġshould Ġbe Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠServer Response . no Content (). build () Ġ} ĊĠĠĠ Ġ})) ĊĠĠĠĠĠ Ġ. web Filter < Web Test Client . Router Function Spec >( jwt Web Filter ) Ġ Ġ// Ġregister ĠWeb Filter ĊĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ// Ġdo Ġrequest ĊĠĠĠ Ġval Ġresponse Body Ġ= Ġclient . post (). uri ( url ). exchange () ĊĠĠĠĠĠ Ġ. expect Status (). is Unauthorized ĊĠĠĠĠĠ Ġ. expect Header (). contentType ( TEXT _ PLAIN _ UTF 8 ) ĊĠĠĠĠĠ Ġ. expect Body ( String :: class . java ) ĊĠĠĠĠĠ Ġ. return Result (). response Body ĊĠĠĠ ĠassertEquals (" No Ġvalid Ġjwt Ġ' Authorization ' Ġheader ", Ġresponse Body ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Jwt (): ĠString Ġ{ ĊĠĠĠ Ġval Ġheader Ġ= ĠHeader . DEFAULT ĊĠĠĠ Ġval Ġpayload Ġ= ĠPayload () ĊĊĠĠĠ Ġ// Ġset Ġsome Ġregistered Ġclaims ĊĠĠĠ Ġpayload . issuer Ġ= Ġ" sim ter " ĊĠĠĠ Ġpayload . audience Ġ= Ġ" tester " ĊĠĠĠ Ġpayload . iss ued At Ġ= ĠZ onedDateTime . now (). to Epoch Second () ĊĠĠĠ Ġpayload . expires Ġ= ĠZ onedDateTime . now (). plus Months ( 1 ). to Epoch Second () ĊĊĠĠĠ Ġ// Ġadd Ġyour Ġpublic / private Ġclaims ĊĠĠĠ Ġpayload . add (" user . id ", ĠTEST _ USER . id . toString ()) ĊĠĠĠ Ġpayload . add (" user . code ", ĠTEST _ USER . account ) ĊĠĠĠ Ġpayload . add (" user . name ", ĠTEST _ USER . name ) ĊĠĠĠ Ġpayload . add (" roles ", ĠTEST _ RO LES ) ĊĠĠĠ Ġreturn ĠJWT ( header , Ġpayload ). generate ( secret Key ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval ĠTEST _ USER Ġ= ĠSystem Context . User ( ĊĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠ Ġaccount Ġ= Ġ" tester ", ĊĠĠĠĠĠ Ġname Ġ= Ġ" Tester " ĊĠĠĠ Ġ) ĊĠĠĠ Ġconst Ġval ĠTEST _ RO LES Ġ= Ġ" ADMIN , COMMON , TEST " ĊĠ Ġ} Ċ }