package Ġdev . al pas . tests . routing Ċ Ċ import Ġdev . al pas . Middleware Ċ import Ġdev . al pas . auth . middleware . Auth Only Middleware Ċ import Ġdev . al pas . auth . middleware . Guest Only Middleware Ċ import Ġdev . al pas . auth . middleware . Verified Email Only Middleware Ċ import Ġdev . al pas . http . Http Call Ċ import Ġdev . al pas . http . Method Ċ import Ġdev . al pas . routing . Controller Ċ import Ġdev . al pas . routing . Controller Handler Ċ import Ġdev . al pas . routing . dynamic Controller Factory Ċ import Ġdev . al pas . routing . middleware . Signed Request Middleware Ċ import Ġdev . al pas . tests . Test Controller Ċ import Ġdev . al pas . tests . controller Method Ċ import Ġdev . al pas . tests . with Router Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠRoutes Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` route Ġcan Ġbe Ġgiven Ġa Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġget Routes Ġ= Ġmap Of ("/ get _ test " Ġto Ġ" get _ test _ route ", Ġ"/ get _ test 1 " Ġto Ġ" get _ test 1 _ route ") ĊĠĠĠĠĠĠĠ Ġval Ġpost Routes Ġ= Ġmap Of ("/ post _ test " Ġto Ġ" post _ test _ route ", Ġ"/ post _ test 1 " Ġto Ġ" post _ test 1 _ route ") ĊĠĠĠĠĠĠĠ Ġval Ġpatch Routes Ġ= Ġmap Of ("/ patch _ test " Ġto Ġ" patch _ test _ route ", Ġ"/ patch _ test 1 " Ġto Ġ" patch _ test 1 _ route ") ĊĠĠĠĠĠĠĠ Ġval Ġdelete Routes Ġ= Ġmap Of ("/ delete _ test " Ġto Ġ" delete _ test _ route ", Ġ"/ delete _ test 1 " Ġto Ġ" delete _ test 1 _ route ") ĊĠĠĠĠĠĠĠ Ġval Ġall Routes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" get " Ġto Ġget Routes , Ġ" post " Ġto Ġpost Routes , Ġ" patch " Ġto Ġpatch Routes , Ġ" delete " Ġto Ġdelete Routes ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Routes . forEach Ġ{ Ġ( method , Ġroutes ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroutes . forEach Ġ{ Ġ( path , Ġname ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( path ) Ġ{} . name ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" post " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroutes . forEach Ġ{ Ġ( path , Ġname ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ( path ) Ġ{} . name ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" patch " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroutes . forEach Ġ{ Ġ( path , Ġname ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ( path ) Ġ{} . name ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" delete " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroutes . forEach Ġ{ Ġ( path , Ġname ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( path ) Ġ{} . name ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcombined Routes Ġ= Ġall Routes . values . reduce Ġ{ Ġacc , Ġmap Ġ-> Ġacc Ġ+ Ġmap Ġ} ĊĠĠĠĠĠĠĠ Ġcombined Routes . forEach Ġ{ Ġroute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( router . find Named Route ( route . value )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( route . key , Ġthis ?. path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( route . value , Ġthis ?. name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parent Ġroute Ġgroup Ġnames Ġare Ġpre pended Ġwith Ġa Ġroute 's Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroute Paths Ġ= Ġmap Of (" path _ one " Ġto Ġ" one ", Ġ" path _ two " Ġto Ġ" two ", Ġ" path _ three " Ġto Ġ" three ", Ġ" path _ four " Ġto Ġ" four ") ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute Paths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( it . key ) Ġ{} . name (" get _${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ( it . key ) Ġ{} . name (" post _${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ( it . key ) Ġ{} . name (" patch _${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( it . key ) Ġ{} . name (" delete _${ it . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. name (" group ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. name (" test ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroute Paths . forEach Ġ{ Ġroute Path Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" get ", Ġ" post ", Ġ" patch ", Ġ" delete "). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . find Named Route (" test . group .${ method }_${ route Path . value } "). also Ġ{ Ġroute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ("/ ${ route Path . key }", Ġroute ?. path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parent Ġroute Ġgroup Ġpaths Ġare Ġpre pended Ġwith Ġa Ġroute 's Ġpath `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroute Paths Ġ= ĠlistOf (" path _ one ", Ġ" path _ two ", Ġ" path _ three ", Ġ" path _ four ") ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" test ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" group ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute Paths . forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( path ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ( path ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ( path ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( path ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroute Paths . forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . routes . find Ġ{ Ġroute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute . path Ġ== Ġ"/ test / group /${ path }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` path Ġis Ġset Ġto Ġdefault Ġwhen Ġno Ġpath Ġis Ġprovided `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch () Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete () Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġroute Ġ-> Ġroute . method Ġ== Ġmethod Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ("/", Ġroute ?. path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` method Ġname Ġis Ġnot Ġconvention ally Ġderived Ġfor Ġa Ġdynamic Ġcontroller Ġroute `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Controller Factory Ġ= Ġ{ ĠTest Controller () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġ" Test Controller " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", Ġcontroller , Ġ" index ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", Ġcontroller , Ġ" store ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", Ġcontroller , Ġ" update ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", Ġcontroller , Ġ" delete ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET Ġto Ġ" index ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST Ġto Ġ" store ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH Ġto Ġ" update ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE Ġto Ġ" delete " ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġmethod Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġroute Ġ-> Ġroute . method Ġ== Ġmethod Entry . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( method Entry . value , Ġroute ?. controller Method ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` method Ġname Ġis Ġconvention ally Ġderived Ġfor Ġa Ġstrongly Ġtyped Ġcontroller Ġroute `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET Ġto Ġ" index ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST Ġto Ġ" store ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH Ġto Ġ" update ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE Ġto Ġ" delete " ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġmethod Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġroute Ġ-> Ġroute . method Ġ== Ġmethod Entry . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( method Entry . value , Ġroute ?. controller Method ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` must Be Authenticated () Ġmethod Ġadds Ġproper Ġmiddleware `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ no - auth ", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ). must Be Authenticated () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" auth ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. must Be Authenticated () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . routes . find Ġ{ Ġit . path Ġ== Ġ"/ no - auth " Ġ} ?. middleware ?. contains ( Auth Only Middleware :: class ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġauth Routes Ġ= Ġrouter . routes . filter Ġ{ Ġit . path Ġ!= Ġ"/ no - auth " Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġauth Routes . size ) ĊĠĠĠĠĠĠĠ Ġauth Routes . forEach Ġ{ Ġroute Ġ-> ĠassertTrue ( route . middleware . contains ( Auth Only Middleware :: class )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` must Be Guest () Ġmethod Ġadds Ġproper Ġmiddleware `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ no - guest ", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ). must Be Guest () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" guest ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. must Be Guest () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . routes . find Ġ{ Ġit . path Ġ== Ġ"/ no - guest " Ġ} ?. middleware ?. contains ( Guest Only Middleware :: class ) Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġguest Routes Ġ= Ġrouter . routes . filter Ġ{ Ġit . path Ġ!= Ġ"/ no - guest " Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġguest Routes . size ) ĊĠĠĠĠĠĠĠ Ġguest Routes . forEach Ġ{ Ġroute Ġ-> ĠassertTrue ( route . middleware . contains ( Guest Only Middleware :: class )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` must Be Verified () Ġmethod Ġadds Ġproper Ġmiddleware `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ no - verified ", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ). must Be Verified () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" verified ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. must Be Verified () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . routes . find Ġ{ Ġit . path Ġ== Ġ"/ no - verified " Ġ} ?. middleware ?. contains ( Verified Email Only Middleware :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġverified Routes Ġ= Ġrouter . routes . filter Ġ{ Ġit . path Ġ!= Ġ"/ no - verified " Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġverified Routes . size ) ĊĠĠĠĠĠĠĠ Ġverified Routes . forEach Ġ{ Ġroute Ġ-> ĠassertTrue ( route . middleware . contains ( Verified Email Only Middleware :: class )) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` must Be Signed () Ġmethod Ġadds Ġproper Ġmiddleware `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ no - signed ", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ). must Be Signed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" signed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. must Be Signed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouter . routes . find Ġ{ Ġit . path Ġ== Ġ"/ no - signed " Ġ} ?. middleware ?. contains ( Signed Request Middleware :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsigned Routes Ġ= Ġrouter . routes . filter Ġ{ Ġit . path Ġ!= Ġ"/ no - signed " Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġsigned Routes . size ) ĊĠĠĠĠĠĠĠ Ġsigned Routes . forEach Ġ{ Ġroute Ġ-> ĠassertTrue ( route . middleware . contains ( Signed Request Middleware :: class )) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġassign Ġan Ġauth Ġchannel Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ). must Be Authenticated (" test - channel ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup (" auth ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. must Be Authenticated (" test - channel ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrouter . routes . forEach Ġ{ Ġroute Ġ-> ĠassertEquals (" test - channel ", Ġroute . auth Channel ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġadd Ġmiddleware `() Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠTest Middleware 1 Ġ: ĠMiddleware < Http Call >() ĊĠĠĠĠĠĠĠ Ġclass ĠTest Middleware 2 Ġ: ĠMiddleware < Http Call >() ĊĠĠĠĠĠĠĠ Ġclass ĠTest Middleware 3 Ġ: ĠMiddleware < Http Call >() ĊĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ). middleware ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Middleware 3 :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Middleware 1 :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Middleware 2 :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup ( middleware Ġ= ĠTest Middleware 3 :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/", ĠTest Controller :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. middleware ( Test Middleware 1 :: class , ĠTest Middleware 2 :: class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrouter . routes . forEach Ġ{ Ġroute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute . middleware . contains All ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Middleware 1 :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Middleware 2 :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Middleware 3 :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġuse Ġstrongly Ġtyped Ġmethods Ġwithout Ġspecifying Ġthe Ġcontroller 's Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ( Typed Controller :: index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ( Typed Controller :: store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ( Typed Controller :: update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( Typed Controller :: delete ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET Ġto Ġ" index ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST Ġto Ġ" store ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH Ġto Ġ" update ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE Ġto Ġ" delete " ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġ( method , Ġname ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġit . method Ġ== Ġmethod Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( name , Ġroute ?. controller Method ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ("/", Ġroute ?. path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dev . al pas . tests . routing . Typed Controller ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( route ?. handler Ġas ĠController Handler )?. controller . qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġuse Ġgeneric Ġcontroller Ġwith Ġconvention al Ġnames `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget < Typed Controller >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost < Typed Controller >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch < Typed Controller >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete < Typed Controller >() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET Ġto Ġ" index ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST Ġto Ġ" store ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH Ġto Ġ" update ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE Ġto Ġ" delete " ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġ( method , Ġname ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġit . method Ġ== Ġmethod Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( name , Ġroute ?. controller Method ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ("/", Ġroute ?. path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dev . al pas . tests . routing . Typed Controller ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( route ?. handler Ġas ĠController Handler )?. controller . qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġoverride Ġpaths Ġfor Ġstrongly Ġtyped Ġcontroller Ġmethods `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ get ", ĠTyped Controller :: index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/ post ", ĠTyped Controller :: store ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch ("/ patch ", ĠTyped Controller :: update ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ("/ delete ", ĠTyped Controller :: delete ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġit . method Ġ== Ġmethod Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ("${ route ?. path ?. toLowerCase () }", Ġroute ?. path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġuse Ġdynamic Ġmethod Ġnames Ġfor Ġstrongly Ġtyped Ġcontrollers `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrouter Ġ= Ġwith Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget < Typed Controller >(" ", Ġ" test get ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost < Typed Controller >(" ", Ġ" test post ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatch < Typed Controller >(" ", Ġ" test patch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete < Typed Controller >(" ", Ġ" test delete ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . GET , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . POST , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . PATCH , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMethod . DELETE ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= Ġrouter . routes . find Ġ{ Ġit . method Ġ== Ġmethod Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( route ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ("${ route ?. path ?. toLowerCase () }", Ġroute ?. path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" test ${ method . toString (). toLowerCase () }", Ġ( route ?. handler Ġas ĠController Handler ). method ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dev . al pas . tests . routing . Typed Controller ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( route ?. handler Ġas ĠController Handler )?. controller . qualified Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTyped Controller Ġ: ĠController () Ġ{ ĊĠĠĠ Ġfun Ġindex ( call : ĠHttp Call ) Ġ{} ĊĠĠĠ Ġfun Ġstore ( call : ĠHttp Call ) Ġ{} ĊĠĠĠ Ġfun Ġupdate ( call : ĠHttp Call ) Ġ{} ĊĠĠĠ Ġfun Ġdelete ( call : ĠHttp Call ) Ġ{} Ċ } Ċ