/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 2 1 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . server . application Ċ Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . server . response .* Ċ import Ġio . ktor . server . routing .* Ċ import Ġio . ktor . server . testing .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠHooks Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Custom Hook Executed () Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠHook Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcalled : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġexecuted : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Handler Ġ= ĠHook Handler () ĊĊĠĠĠĠĠĠĠ Ġval Ġmy Hook Ġ= Ġobject Ġ: ĠHook < Hook Handler . () Ġ-> ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠApplication Call Pipeline , Ġhandler : ĠHook Handler . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Handler . apply ( handler ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . intercept ( Application Call Pipeline . Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Handler . executed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Plugin Ġ= Ġcreate Application Plugin (" Test Plugin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ( my Hook ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( current Handler . called ) ĊĊĠĠĠĠĠĠĠ Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( test Plugin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( current Handler . executed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ("/") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( current Handler . executed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( current Handler . called ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Shutdown Hook () Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġshutdown Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠState () ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Handler Ġ= Ġcreate Application Plugin (" Shutdown Handler ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Shutdown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . shutdown Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( shutdown Handler ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" OK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ("/") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( state . shutdown Called ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( state . shutdown Called ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest On Call Failed Hook () Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfail : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠState () ĊĊĠĠĠĠĠĠĠ Ġval Ġfailed Handler Ġ= Ġcreate Application Plugin (" Failed Handler ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ( Call Failed ) Ġ{ Ġ_, Ġcause Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . fail Ġ= Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( failed Handler ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Failure ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( state . fail ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ("/") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( state . fail ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Failure ", Ġstate . fail ?. message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Hook With Routing Plugin () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠOn Call Hook Ġ= Ġobject Ġ: ĠHook < () Ġ-> ĠUnit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall ( pipeline : ĠApplication Call Pipeline , Ġhandler : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline . intercept ( Application Call Pipeline . Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmy Output Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġfun Ġmy Println ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Output Ġ+= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠMy Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmy Value : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠMy Route Plugin Ġ= Ġcreate Route Scoped Plugin (" My Route Plugin ", Ġ:: My Config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ( On Call Hook ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Println ( plugin Config . my Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute ("/ 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( My Route Plugin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Value Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond (" Hello - 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute ("/ 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( My Route Plugin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Value Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond (" Hello - 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ 3 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond (" Hello - 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Ġfun ĠApplication Test Builder . assert Output ( request Path : ĠString , Ġexpected Output : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Output . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . get ( request Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Content Equals ( expected Output . to Typed Array (), Ġmy Output . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Output ("/ 1 ", ĠlistOf ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Output ("/ 2 ", ĠlistOf ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Output ("/ 3 ", Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ