package Ġdev . ne effect . nee . ctx . web Ċ Ċ import Ġio . kot est . core . spec . style . Behavior Spec Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . routing . get Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . server . testing . Test Application Engine Ċ import Ġio . ktor . server . testing . create Test Environment Ċ import Ġio . ktor . server . testing . handle Request Ċ import Ġio . v avr . collection . List Ċ import Ġdev . ne effect . nee . N ee Ċ import Ġdev . ne effect . nee . effects . jdbc . JDBC Provider Ċ import Ġdev . ne effect . nee . security . UserRole Ċ import Ġdev . ne effect . nee . security . test . Test DB Ċ import Ġkotlin . test . assertEquals Ċ Ċ fun ĠApplication . main ( w ctx Provider : ĠJDBC Based Web Context Provider ) Ġ{ ĊĊĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠN ee . const P ( w ctx Provider . fx (). tx ) Ġ{ Ġweb Ctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Ctx . getConnection (). getResource () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. prepareStatement (" select Ġ 4 1 Ġfrom Ġdual "). use Ġ{ Ġprepared Statement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepared Statement . executeQuery (). use Ġ{ ĠresultSet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resultSet . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠresultSet . getString ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Hello ! ĠResult Ġis Ġ$ result " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Bad Ġresult " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. any Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw ctx Provider . create ( call ). serve Text ( function , ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget ("/ sec ured ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠN ee . const P ( w ctx Provider . fx (). sec ured ( List . of ( UserRole (" b admin ")) )) Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Secret Ġmessage " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. any Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw ctx Provider . create ( call ). serve Text ( function , ĠUnit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSimple Application Test Ġ: ĠBehavior Spec ({ ĊĠĠĠ ĠGiven (" Test Ġk tor Ġapp ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġengine Ġ= ĠTest Application Engine ( create Test Environment ()) ĊĊĠĠĠĠĠĠĠ ĠTest DB (). initialize Db (). use Ġ{ Ġtest Db Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Db . add User (" test ", Ġ" test ", ĠList . of (" b admin ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctx Provider Ġ= Ġobject Ġ: ĠJDBC Based Web Context Provider () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġjdbc Provider : ĠJDBC Provider Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJDBC Provider ( test Db . connection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . start ( wait Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġengine . application . main ( ctx Provider ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen (" requested ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" db Ġconnection Ġworks ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . handle Request ( HttpMethod . Get , Ġ"/ "). let Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Hello ! ĠResult Ġis Ġ 4 1 ", Ġcall . response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen (" request Ġwith Ġauthentication ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" db Ġconnection Ġworks ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . handle Request ( HttpMethod . Get , Ġ"/ sec ured ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( Basic Auth . authorization Header , Ġ" Basic Ġd GV zd Dp 0 ZX N 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Secret Ġmessage ", Ġcall . response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen (" request Ġwith Ġinvalid Ġauthentication ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" db Ġconnection Ġworks ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġengine . handle Request ( HttpMethod . Get , Ġ"/ sec ured ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( Basic Auth . authorization Header , Ġ" Basic Ġbl abl ador ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . Unauthorized , Ġcall . response . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ