package Ġpl . set black . nee . example . tod olist Ċ Ċ import Ġcom . fasterxml . jackson . core . type . Type Reference Ċ import Ġio . kot est . core . spec . style . String Spec Ċ import Ġio . kot est . matchers . collections . should Contain All Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . kot est . matchers . types . shouldBe TypeOf Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . features . Content Neg otiation Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . jackson . Jack son Converter Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . server . testing . Test Application Engine Ċ import Ġio . ktor . server . testing . handle Request Ċ import Ġio . ktor . server . testing . with Test Application Ċ import Ġio . v avr . Tuple 2 Ċ import Ġio . v avr . collection . Seq Ċ import Ġpl . set black . nee . example . tod olist . framework . Json Mapper Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Offset Ċ Ċ class ĠTodo Server Test Ġ: ĠString Spec ({ ĊĊĠĠĠ Ġ" add Ġitem Ġshould Ġgive Ġan Ġid " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Post , Ġ"/ todo ? title = hello ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . content ĠshouldBe Ġ(" 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" added Ġitem Ġshould Ġbe Ġreturned Ġby Ġid " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo / 1 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĠTodo Item :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . title ĠshouldBe Ġ" hello " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" calling Ġget Ġwith Ġtext Ġid Ġreturns Ġerror " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo / z up ka ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () ĠshouldBe ĠHttpStatusCode . BadRequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" added Ġitem Ġshould Ġbe Ġin Ġfind Ġall " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < Seq < Tuple 2 < Todo Id Alt , ĠTodo Item >> >() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size () ĠshouldBe Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ 0 ]._ 2 . title ĠshouldBe Ġ(" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" added Ġthree Ġ Ġitems Ġshould Ġbe Ġin Ġfind Ġall " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġ 3 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Using POST (" hello _$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < Seq < Tuple 2 < Todo Id Alt , ĠTodo Item >> >() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size () ĠshouldBe Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . map Ġ{ Ġit ._ 2 . title Ġ} Ġshould Contain All Ġ(( 0 Ġuntil Ġ 3 ). map Ġ{ Ġ" hello _$ it " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" done Ġshould Ġmark Ġas Ġdone "{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ todo / done ? id =$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo /${ id } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġresponse . byte Content !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠJson Mapper . object Mapper . readValue ( content , ĠTodo Item :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . title ĠshouldBe Ġ" hello " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . shouldBe TypeOf < Todo Item . Done >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" done Ġtwice Ġon Ġsame Ġitem Ġshould Ġlead Ġto Ġ 4 0 9 "{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ todo / done ? id =$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Post , Ġ"/ todo / done ? id =$ id ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status (). shouldBe ( HttpStatusCode . Conflict ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" done Ġshould Ġnot Ġbe Ġon Ġtodo Ġlist " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ todo / done ? id =$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < Seq < Tuple 2 < Todo Id Alt , ĠTodo Item >> >() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size () ĠshouldBe Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" done Ġshould Ġ Ġbe Ġon Ġdone Ġlist " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ todo / done ? id =$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo / done ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < Seq < Tuple 2 < Todo Id Alt , ĠTodo Item >> >() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size () ĠshouldBe Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" cancelled Ġshould Ġnot Ġbe Ġon Ġtodo Ġlist " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Delete , Ġ"/ todo /$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < Seq < Tuple 2 < Todo Id Alt , ĠTodo Item >> >() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size () ĠshouldBe Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ" cancelled Ġshould Ġbe Ġon Ġcancelled Ġlist " Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo Rest () ĊĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġadd Item Using POST (" hello ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Delete , Ġ"/ todo /$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ todo / cancelled ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠJson Mapper . object Mapper . readValue ( response . byte Content !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠType Reference < Seq < Tuple 2 < Todo Id Alt , ĠTodo Item >> >() Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . size () ĠshouldBe Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconst Time Ġ= Ġsuspend Ġ{ ĠLocalDateTime . parse (" 2 0 2 1 - 0 3 - 1 4 T 1 0 : 1 0 : 1 0 "). to Instant ( Zone Offset . UTC ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtodo Rest : ĠApplication . () Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Content Neg otiation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister ( io . ktor . http . ContentType . Application . Json , ĠJack son Converter ( Json Mapper . object Mapper )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTodo Server . define Routing ( const Time ). r ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠTest Application Engine . addItem Using POST ( title : ĠString ): ĠInt Ġ= ĊĠĠĠ Ġwith ( handle Request ( HttpMethod . Post , Ġ"/ todo ? title =$ title ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse . content !!. toInt () ĊĠĠĠ Ġ} Ċ Ċ data Ġclass ĠTodo Id Alt ( val Ġid : ĠInt ) Ċ