package Ġcom . hex agon kt . http . test . examples Ċ Ċ import Ġcom . hex agon kt . core . require Ċ import Ġcom . hex agon kt . http . client . HttpClient Port Ċ import Ġcom . hex agon kt . http . model . Client Error Status .* Ċ import Ġcom . hex agon kt . http . model . HttpMethod .* Ċ import Ġcom . hex agon kt . http . model . HttpMethod . Companion . ALL Ċ import Ġcom . hex agon kt . http . model . Success Status . CREATED Ċ import Ġcom . hex agon kt . http . server . HttpServer Port Ċ import Ġcom . hex agon kt . http . server . HttpServer Settings Ċ import Ġcom . hex agon kt . http . server . handlers . Path Handler Ċ import Ġcom . hex agon kt . http . server . handlers . Server Handler Ċ import Ġcom . hex agon kt . http . server . handlers . path Ċ import Ġcom . hex agon kt . http . test . Base Test Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ @ Suppress (" FunctionName ") Ġ// ĠThis Ġclass 's Ġfunctions Ġare Ġintended Ġto Ġbe Ġused Ġonly Ġin Ġtests Ċ abstract Ġclass ĠBooks Test ( ĊĠĠĠ Ġfinal Ġoverride Ġval Ġclient Adapter : Ġ() Ġ-> ĠHttpClient Port , ĊĠĠĠ Ġfinal Ġoverride Ġval Ġserver Adapter : Ġ() Ġ-> ĠHttp Server Port , ĊĠĠĠ Ġfinal Ġoverride Ġval Ġserver Settings : ĠHttp Server Settings Ġ= ĠHttp Server Settings (), Ċ ) Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġ// Ġbooks ĊĠĠĠ Ġdata Ġclass ĠBook ( val Ġauthor : ĠString , Ġval Ġtitle : ĠString ) ĊĊĠĠĠ Ġprivate Ġval Ġbooks : ĠMutable Map < Int , ĠBook > Ġ= Ġlinked Map Of ( ĊĠĠĠĠĠĠĠĠ 1 0 0 Ġto ĠBook (" M ig uel Ġde ĠC er v antes ", Ġ" Don ĠQu ix ote "), ĊĠĠĠĠĠĠĠĠ 1 0 1 Ġto ĠBook (" W illiam ĠSh akes pe are ", Ġ" Ham let "), ĊĠĠĠĠĠĠĠĠ 1 0 2 Ġto ĠBook (" Hom er ", Ġ" The ĠO d ys sey ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġpath : ĠPath Handler Ġ= Ġpath Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpost ("/ books ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= Ġquery Parameters [" author "] Ġ?: Ġreturn @ post Ġbad Request (" Missing Ġauthor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġquery Parameters [" title "] Ġ?: Ġreturn @ post Ġbad Request (" Missing Ġtitle ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ( books . keys . max OrNull () Ġ?: Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ+= Ġid Ġto ĠBook ( author , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ( id . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ books /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Title : Ġ${ book . title }, ĠAuthor : Ġ${ book . author }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġput ("/ books /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ+= Ġbook Id Ġto Ġbook . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġquery Parameters [" author "] Ġ?: Ġbook . author , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġquery Parameters [" title "] Ġ?: Ġbook . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Book Ġwith Ġid Ġ'$ book Id ' Ġupdated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdelete ("/ books /{ id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ-= Ġbook Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Book Ġwith Ġid Ġ'$ book Id ' Ġdeleted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMat ches Ġpath 's Ġrequests Ġwith Ġ* any * ĠHTTP Ġmethod Ġas Ġa Ġfallback Ġ( return Ġ 4 0 4 Ġinstead Ġ 4 0 5 ) ĊĠĠĠĠĠĠĠ Ġafter ( ALL Ġ- ĠDELETE Ġ- ĠPUT Ġ- ĠGET , Ġ"/ books /{ id }", Ġstatus Ġ= ĠNOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( METHOD _ NOT _ ALLOWED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ books ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok ( books . keys . join ToString (" Ġ", Ġtransform Ġ= ĠInt :: toString )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġbooks ĊĊĠĠĠ Ġprivate Ġval Ġpath Alternative : ĠPath Handler Ġ= Ġpath ("/ books ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= Ġquery Parameters [" author "] Ġ?: Ġreturn @ post Ġbad Request (" Missing Ġauthor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġquery Parameters [" title "] Ġ?: Ġreturn @ post Ġbad Request (" Missing Ġtitle ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ( books . keys . max OrNull () Ġ?: Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ+= Ġid Ġto ĠBook ( author , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ( id . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget ("/ { id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Title : Ġ${ book . title }, ĠAuthor : Ġ${ book . author }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġput ("/ { id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ+= Ġbook Id Ġto Ġbook . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġquery Parameters [" author "] Ġ?: Ġbook . author , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġquery Parameters [" title "] Ġ?: Ġbook . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Book Ġwith Ġid Ġ'$ book Id ' Ġupdated ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdelete ("/ { id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ-= Ġbook Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Book Ġwith Ġid Ġ'$ book Id ' Ġdeleted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMat ches Ġpath 's Ġrequests Ġwith Ġ* any * ĠHTTP Ġmethod Ġas Ġa Ġfallback Ġ( return Ġ 4 0 4 Ġinstead Ġ 4 0 5 ) ĊĠĠĠĠĠĠĠ Ġafter ( ALL Ġ- ĠDELETE Ġ- ĠPUT Ġ- ĠGET , Ġ"/ { id }", Ġstatus Ġ= ĠNOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( METHOD _ NOT _ ALLOWED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok ( books . keys . join ToString (" Ġ", Ġtransform Ġ= ĠInt :: toString )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpath Alternative 2 : ĠPath Handler Ġ= Ġpath ("/ books ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= Ġquery Parameters [" author "] Ġ?: Ġreturn @ post Ġbad Request (" Missing Ġauthor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġquery Parameters [" title "] Ġ?: Ġreturn @ post Ġbad Request (" Missing Ġtitle ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ( books . keys . max OrNull () Ġ?: Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ+= Ġid Ġto ĠBook ( author , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated ( id . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpath ("/ { id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Title : Ġ${ book . title }, ĠAuthor : Ġ${ book . author }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ+= Ġbook Id Ġto Ġbook . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġquery Parameters [" author "] Ġ?: Ġbook . author , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġquery Parameters [" title "] Ġ?: Ġbook . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Book Ġwith Ġid Ġ'$ book Id ' Ġupdated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Id Ġ= Ġpath Parameters . require (" id "). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġbooks [ book Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbooks Ġ-= Ġbook Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( book Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok (" Book Ġwith Ġid Ġ'$ book Id ' Ġdeleted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Found (" Book Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMat ches Ġpath 's Ġrequests Ġwith Ġ* any * ĠHTTP Ġmethod Ġas Ġa Ġfallback Ġ( return Ġ 4 0 4 Ġinstead Ġ 4 0 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter ( ALL Ġ- ĠDELETE Ġ- ĠPUT Ġ- ĠGET , Ġstatus Ġ= ĠNOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( METHOD _ NOT _ ALLOWED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġok ( books . keys . join ToString (" Ġ", Ġtransform Ġ= ĠInt :: toString )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġhandler : ĠServer Handler Ġ= Ġpath Ġ{ ĊĠĠĠĠĠĠĠ Ġpath ("/ a ", Ġpath ) ĊĠĠĠĠĠĠĠ Ġpath ("/ b ", Ġpath Alternative ) ĊĠĠĠĠĠĠĠ Ġpath ("/ c ", Ġpath Alternative 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Create Ġbook Ġreturns Ġ 2 0 1 Ġand Ġnew Ġbook ĠID `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . post ("$ it / books ? author = V lad im ir % 2 0 N ab ok ov & title = L ol ita ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( Integer . valueOf ( result . body Ġas ĠString ) Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( CREATED , Ġresult . status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Create Ġbook Ġreturns Ġ 4 0 0 Ġif Ġa Ġparameter Ġis Ġmissing `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . post ("$ p / books ? title = L ol ita "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Missing Ġauthor ", Ġit . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( BAD _ REQUEST , Ġit . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . post ("$ p / books ? author = V lad im ir % 2 0 N ab ok ov "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Missing Ġtitle ", Ġit . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( BAD _ REQUEST , Ġit . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` List Ġbooks Ġcontains Ġall Ġbooks ĠIDs `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . get ("$ it / books ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result , Ġ" 1 0 0 ", Ġ" 1 0 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Get Ġbook Ġreturns Ġall Ġbook 's Ġfields `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . get ("$ it / books / 1 0 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result , Ġ" W illiam ĠSh akes pe are ", Ġ" Ham let ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Update Ġbook Ġoverrides Ġexisting Ġbook Ġdata `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Put Ġ= Ġclient . put ("$ it / books / 1 0 0 ? title = Don % 2 0 Qu ix ote ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result Put , Ġ" 1 0 0 ", Ġ" updated ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Get Ġ= Ġclient . get ("$ it / books / 1 0 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result Get , Ġ" M ig uel Ġde ĠC er v antes ", Ġ" Don ĠQu ix ote ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Update Ġnot Ġfound Ġbook Ġreturns Ġa Ġ 4 0 4 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . put ("$ it / books / 9 9 9 9 ? title = Don % 2 0 Qu ix ote ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result , ĠNOT _ FOUND , Ġ" not Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Delete Ġbook Ġreturns Ġthe Ġdeleted Ġrecord ĠID `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreate Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . post ("$ it / books ? author = K en % 2 0 F ol lett & title = The % 2 0 P ill ars % 2 0 of % 2 0 the % 2 0 Earth ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠInteger . valueOf ( create Result . body Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( id Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( CREATED , Ġcreate Result . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . delete ("$ it / books /$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result , Ġid . toString (), Ġ" deleted ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Delete Ġnot Ġfound Ġbook Ġreturns Ġa Ġ 4 0 4 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . delete ("$ it / books / 9 9 9 9 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result , ĠNOT _ FOUND , Ġ" not Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Book Ġnot Ġfound Ġreturns Ġa Ġ 4 0 4 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . get ("$ it / books / 9 9 9 9 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Response Contains ( result , ĠNOT _ FOUND , Ġ" not Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Invalid Ġmethod Ġreturns Ġ 4 0 5 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . options ("$ it / books / 9 9 9 9 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( METHOD _ NOT _ ALLOWED , Ġresult . status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Not Ġhandled Ġmethod Ġreturns Ġ 4 0 4 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ("/ a ", Ġ"/ b ", Ġ"/ c "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . options ("$ it / books ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( NOT _ FOUND , Ġresult . status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ