package Ġdev . g ler oy . iv an ache ss . api Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . at Least Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġdev . g ler oy . iv an ache ss . api . security . Authentication Service Ċ import Ġdev . g ler oy . iv an ache ss . api . security . Jwt Ċ import Ġdev . g ler oy . iv an ache ss . api . security . UserDetails Adapter Ċ import Ġdev . g ler oy . iv an ache ss . core .* Ċ import Ġdev . g ler oy . iv an ache ss . io .* Ċ import Ġio . kot lint est . matchers . boolean . shouldBe True Ċ import Ġio . kot lint est . matchers . types . should Not BeNull Ċ import Ġio . kot lint est . shouldBe Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . mock . mockito . Mock Bean Ċ import Ġorg . springframework . http . HttpMethod Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . mock . web . Mock HttpServletResponse Ċ import Ġorg . springframework . security . crypto . bcrypt . BC rypt Password Encoder Ċ import Ġorg . springframework . test . web . servlet . MockMvc Ċ import Ġorg . springframework . test . web . servlet . request Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . time . Zone Offset Ċ import Ġjavax . servlet . http . Cookie Ċ Ċ internal Ġabstract Ġclass ĠAbstract Controller Test Ġ{ ĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġauth Service : ĠAuthentication Service ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar ĠuserService : ĠUserService ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġgame Service : ĠGame Service ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġmatch making Queue : ĠMatch making Queue ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġweb Socket Sender : ĠWebSocket Sender ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġpassword Encoder : ĠBC rypt Password Encoder ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġclock : ĠClock ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġuser Converter : ĠUser Converter ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġmove Converter : ĠMove Converter ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġgame Converter : ĠGame Converter ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġmatch Converter : ĠMatch Converter ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġpage Converter : ĠPage Converter ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġprops : ĠProperties ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġmapper : ĠObjectMapper ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġm vc : ĠMock Mvc ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠEndpoint Test Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġsimple User Ġ= ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpseudo Ġ= Ġ" simple ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġ" simple @ iv an ache ss . loc ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Date Ġ= ĠOffset DateTime . now (). with Offset Same Instant ( Zone Offset . UTC ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbcrypt Password Ġ= Ġ"\ $ 2 y \$ 1 2 \$ 0 jk / kp EJ fu u VJ Sh p ge Zh Yu TY AV j 5 sa u 2 W 2 qt FT MM Iw Pct m L WV XH SS ", ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġadmin User Ġ= ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpseudo Ġ= Ġ" admin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġ" admin @ iv an ache ss . loc ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Date Ġ= ĠOffset DateTime . now (). with Offset Same Instant ( Zone Offset . UTC ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbcrypt Password Ġ= Ġ"\ $ 2 y \$ 1 2 \$ 0 jk / kp EJ fu u VJ Sh p ge Zh Yu TY AV j 5 sa u 2 W 2 qt FT MM Iw Pct m L WV XH SS ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= ĠUser . Role . Admin , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġsuper Admin User Ġ= ĠUser ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpseudo Ġ= Ġ" super _ admin ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġ" super _ admin @ iv an ache ss . loc ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Date Ġ= ĠOffset DateTime . now (). with Offset Same Instant ( Zone Offset . UTC ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbcrypt Password Ġ= Ġ"\ $ 2 y \$ 1 2 \$ 0 jk / kp EJ fu u VJ Sh p ge Zh Yu TY AV j 5 sa u 2 W 2 qt FT MM Iw Pct m L WV XH SS ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= ĠUser . Role . Super Admin , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġabstract Ġval Ġmethod : ĠHttpMethod ĊĠĠĠĠĠĠĠ Ġprotected Ġabstract Ġval Ġpath : ĠString ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġbuild String ( size : ĠInt ) Ġ= Ġ( 0 Ġuntil Ġsize ). map Ġ{ Ġ' a ' Ġ}. fold ("") Ġ{ Ġacc , Ġstr Ġ-> Ġ"$ acc $ str " Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Authentication Cookie ( jwt : ĠJwt ) Ġ= ĠCookie ( props . auth . cookie . name , Ġjwt . token ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Empty Parameter Error Representation ( parameter : ĠString ) Ġ= ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" must Ġnot Ġbe Ġempty " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Malformed Parameter Error Representation ( parameter : ĠString , Ġregex : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" must Ġmatch Ġ\"$ regex \"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Missing Parameter Error Representation ( parameter : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" must Ġnot Ġbe Ġnull " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Invalid Email Parameter Error Representation ( parameter : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" must Ġbe Ġa Ġwell - formed Ġemail Ġaddress " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Invalid Size Parameter Error Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax : ĠInt Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" size Ġmust Ġbe Ġbetween Ġ$ min Ġand Ġ$ max " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Too High Parameter Error Representation ( parameter : ĠString , Ġmax : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" must Ġbe Ġless Ġthan Ġor Ġequal Ġto Ġ$ max " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcreate Too Low Parameter Error Representation ( parameter : ĠString , Ġmin : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Representation . Invalid Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" must Ġbe Ġgreater Ġthan Ġor Ġequal Ġto Ġ$ min " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status : ĠHttpStatus Ġ= ĠHttpStatus . OK , ĊĠĠĠĠĠĠĠ Ġ): ĠMock HttpServletResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġexecute Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookies Ġ= Ġcookies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= Ġexpected Status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content As ByteArray . isEmpty (). shouldBe True () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġ< T > Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status : ĠHttpStatus Ġ= ĠHttpStatus . OK , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody : ĠT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse ResponseBody : Ġ( ByteArray ) Ġ-> ĠT ĊĠĠĠĠĠĠĠ Ġ): ĠMock HttpServletResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġexecute Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookies Ġ= Ġcookies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= Ġexpected Status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġparse ResponseBody ( response . content As ByteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Body ĠshouldBe Ġexpected ResponseBody ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġexecute Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status : ĠHttpStatus Ġ= ĠHttpStatus . OK , ĊĠĠĠĠĠĠĠ Ġ): ĠMock HttpServletResponse Ġ= Ġm vc . request ( method , Ġpath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ(_, Ġvalues ) Ġ-> Ġvalues . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( name , Ġvalues ) Ġ-> Ġparam ( name , Ġ* values . to Typed Array ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cookies . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookie (* cookies . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠMediaType . APPLICATION _ JSON ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġmapper . writeValue As Bytes ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do Ġ{ Ġprint () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect Ġ{ Ġstatus Ġ{ Ġis EqualTo ( expected Status . value ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andReturn () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. response ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġshould Return Entity NotFoundError Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookies Ġ= Ġcookies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= ĠHttpStatus . NOT _ FOUND , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody Ġ= ĠError Representation . Entity NotFound , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmapper . readValue ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġshould Return Forbidden Error Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookies Ġ= Ġcookies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= ĠHttpStatus . FOR BID DEN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody Ġ= ĠError Representation . Forbidden , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmapper . readValue ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġshould Return Unauthorized () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= ĠHttpStatus . UN AUTHORIZ ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody Ġ= ĠError Representation . Unauthorized , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmapper . readValue ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġshould Return ValidationError Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody : ĠAny ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody : ĠError Representation . Validation ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookies Ġ= Ġcookies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġbody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= ĠHttpStatus . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody Ġ= Ġexpected ResponseBody , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmapper . readValue ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġwith Authentication ( user : ĠUser Ġ= Ġsimple User , Ġblock : Ġ( Jwt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjwt Ġ= ĠJwt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpseudo Ġ= Ġuser . pseudo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Date Ġ= ĠOffset DateTime . now (). plus Days ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġ" token " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( auth Service . parse Jwt ( jwt . token )). thenReturn ( jwt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( auth Service . load User By Username ( user . pseudo )). thenReturn ( UserDetails Adapter ( user )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( jwt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( auth Service , Ġat Least ( 1 )). parse Jwt ( jwt . token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( auth Service , Ġat Least ( 1 )). load User By Username ( user . pseudo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠPag inated Endpoint Test Ġ: ĠEndpoint Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġ` should Ġreturn Ġvalidation _ error Ġif Ġpage Ġparameters Ġare Ġnegative `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Return ValidationError Representation If Page Parameters Are Invalid (- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġ` should Ġreturn Ġvalidation _ error Ġif Ġpage Ġparameters Ġare Ġ 0 `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Return ValidationError Representation If Page Parameters Are Invalid ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġ< T Ġ: ĠRepresentation > Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Opts : ĠPage Options , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcookies : ĠList < Cookie > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status : ĠHttpStatus Ġ= ĠHttpStatus . OK , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody : ĠPage Representation < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse ResponseBody : Ġ( ByteArray ) Ġ-> ĠPage Representation < T >, ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorts Ġ= Ġpage Opts . sort s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġsort Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sort . order Ġ== ĠItem Sort . Order . Ascending ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsort . field . label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- ${ sort . field . label }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams Ġ+ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . Page Ġto ĠlistOf ("${ page Opts . number } "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . PageSize Ġto ĠlistOf ("${ page Opts . size } "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . Sort Ġto Ġsorts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . Filter Ġto Ġpage Opts . filters . map Ġ{ Ġ"${ it . field . label }:${ it . value }" Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcookies Ġ= Ġcookies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Status Ġ= Ġexpected Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody Ġ= Ġexpected ResponseBody , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ResponseBody Ġ= Ġparse ResponseBody , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġshould Return ValidationError Representation If Page Parameters Are Invalid ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠList < String >> Ġ= Ġempty Map () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Return ValidationError Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams Ġ+ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . Page Ġto ĠlistOf ("$ value "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . PageSize Ġto ĠlistOf ("$ value "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ResponseBody Ġ= ĠError Representation . Validation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Too Low Parameter Error Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . QueryParams . Page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . Constraints . Min Page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Too Low Parameter Error Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Ġ= ĠApi Constants . QueryParams . PageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= ĠApi Constants . Constraints . Min PageSize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠCookie ?. shouldBe Authentication Cookie ( value : ĠString , Ġmax Age : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Not BeNull () ĊĠĠĠĠĠĠĠ Ġdomain ĠshouldBe Ġprops . auth . cookie . domain ĊĠĠĠĠĠĠĠ Ġsecure ĠshouldBe Ġprops . auth . cookie . secure ĊĠĠĠĠĠĠĠ Ġis Http Only ĠshouldBe Ġprops . auth . cookie . http Only ĊĠĠĠĠĠĠĠ Ġthis . max Age ĠshouldBe Ġmax Age ĊĠĠĠĠĠĠĠ Ġthis . value ĠshouldBe Ġvalue ĊĠĠĠ Ġ} Ċ } Ċ