package Ġmob i . water dog . rest . template . tests . core . http handler Ċ Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . server . testing . Test Application Engine Ċ import Ġio . ktor . server . testing . handle Request Ċ import Ġio . ktor . server . testing . set Body Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġmob i . water dog . rest . template . database . Database Connection Ċ import Ġmob i . water dog . rest . template . pagination . Page Request Ċ import Ġmob i . water dog . rest . template . pagination . Page Response Ċ import Ġmob i . water dog . rest . template . pagination . Pagination Utils Ċ import Ġmob i . water dog . rest . template . tests . containers . Pg SQL Container Factory Ċ import Ġmob i . water dog . rest . template . tests . core . model . Car Ċ import Ġmob i . water dog . rest . template . tests . core . model . Car Save Command Ċ import Ġmob i . water dog . rest . template . tests . core . pers istance . Car Repository Ċ import Ġmob i . water dog . rest . template . tests . core . test App Ċ import Ġmob i . water dog . rest . template . tests . core . utils . json . Json Settings Ċ import Ġmob i . water dog . rest . template . tests . core . utils . version ing . ApiVersion Ċ import Ġorg . am sh ove . k lu ent .` should Ġbe Ġequal Ġto ` Ċ import Ġorg . am sh ove . k lu ent .` should Ġbe Ġgreater Ġthan ` Ċ import Ġorg . junit . jupiter . api . After Each Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . k oin . test . K oin Test Ċ import Ġorg . k oin . test . inject Ċ import Ġorg . test containers . junit . jupiter . Container Ċ import Ġorg . test containers . junit . jupiter . Test containers Ċ import Ġjava . util . UUID Ċ Ċ @ Test containers Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠTest Routes Ġ: ĠK oin Test Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Container ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdb Container Ġ= ĠP g SQL Container Factory . newInstance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠapiVersion Ġ= ĠApi Version . Latest ĊĠĠĠ Ġprivate Ġval Ġcar Repository : ĠCar Repository Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġdb c : ĠDatabase Connection Ġby Ġinject () ĊĊĠĠĠ Ġ@ After Each ĊĠĠĠ Ġfun Ġclean Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġdb c . query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcars Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar Repository . list ( Page Request ( page Ġ= Ġ 0 , Ġsize Ġ= ĠInt . MAX _ VALUE , Ġsort Ġ= ĠlistOf (), Ġfilter Ġ= ĠlistOf ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcars . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcar Repository . delete ( it . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar Repository . count () Ġ` should Ġbe Ġequal Ġto ` Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Fetching Ġa Ġcar Ġthat Ġdoes Ġnot Ġexists Ġreturns Ġa Ġ 4 0 4 ĠNot ĠFound `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ $ apiVersion / cars / 1 2 3 4 5 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . NotFound ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Fetching Ġa Ġcar Ġthat Ġexists Ġreturns Ġcorrectly `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Car Ġ= Ġinsert Car () ĊĊĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ $ apiVersion / cars /${ new Car . id } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcar : ĠCar Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . id Ġ` should Ġbe Ġequal Ġto ` Ġnew Car . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . brand Ġ` should Ġbe Ġequal Ġto ` Ġnew Car . brand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . model Ġ` should Ġbe Ġequal Ġto ` Ġnew Car . model ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Creating Ġa Ġnew Ġcar Ġreturns Ġcorrectly `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= ĠCar Save Command (" por sche ", Ġ" spy der ") ĊĊĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ $ apiVersion / cars ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( Json Settings . toJson ( cmd )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcar : ĠCar Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . id Ġ` should Ġbe Ġgreater Ġthan ` Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . brand Ġ` should Ġbe Ġequal Ġto ` Ġcmd . brand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . model Ġ` should Ġbe Ġequal Ġto ` Ġcmd . model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount C ars () Ġ` should Ġbe Ġequal Ġto ` Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Updating Ġa Ġcar Ġcorrectly `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= ĠCar Save Command (" por sche ", Ġ" spy der ") ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Car Ġ= Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Post , Ġ"/ $ apiVersion / cars ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( Json Settings . toJson ( cmd )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcar : ĠCar Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . id Ġ` should Ġbe Ġgreater Ġthan ` Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . brand Ġ` should Ġbe Ġequal Ġto ` Ġcmd . brand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . model Ġ` should Ġbe Ġequal Ġto ` Ġcmd . model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount C ars () Ġ` should Ġbe Ġequal Ġto ` Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Car Ġ= ĠCar Save Command ( new Car . brand , Ġnew Car . model Ġ+ Ġ"_ 2 ") ĊĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Put , Ġ"/ $ apiVersion / cars /${ new Car . id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , ĠContentType . Application . Json . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( Json Settings . toJson ( updated Car )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcar : ĠCar Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . id Ġ` should Ġbe Ġequal Ġto ` Ġnew Car . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . brand Ġ` should Ġbe Ġequal Ġto ` Ġupdated Car . brand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar . model Ġ` should Ġbe Ġequal Ġto ` Ġupdated Car . model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount C ars () Ġ` should Ġbe Ġequal Ġto ` Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" Test Ġcar Ġlisting : Ġfiltering Ġand Ġordering ") ĊĠĠĠ Ġinner Ġclass ĠTest Car List Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` The Ġlist Ġendpoint Ġworks Ġwithout Ġany Ġextra Ġparameters `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( handle Request ( HttpMethod . Get , Ġ"/ $ apiVersion / cars ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data . size Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Test Ġthat Ġthe Ġfirst Ġpage Ġof Ġthe Ġlist Ġhas Ġthe Ġappropriate Ġparameters `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data . size Ġ` should Ġbe Ġequal Ġto ` Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . sub List ( 0 , Ġ 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . page Ġ` should Ġbe Ġequal Ġto ` Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . size Ġ` should Ġbe Ġequal Ġto ` Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . total Elements Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . total Pages Ġ` should Ġbe Ġequal Ġto ` Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . first Ġ` should Ġbe Ġequal Ġto ` Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . last Ġ` should Ġbe Ġequal Ġto ` Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . first Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . prev Ġ` should Ġbe Ġequal Ġto ` Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . next Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 1 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . last Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 1 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Test Ġthat Ġthe Ġsecond Ġpage Ġof Ġthe Ġlist Ġhas Ġthe Ġappropriate Ġparameters `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 1 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data . size Ġ` should Ġbe Ġequal Ġto ` Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . sub List ( 3 , Ġ 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . page Ġ` should Ġbe Ġequal Ġto ` Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . size Ġ` should Ġbe Ġequal Ġto ` Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . total Elements Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . total Pages Ġ` should Ġbe Ġequal Ġto ` Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . first Ġ` should Ġbe Ġequal Ġto ` Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . last Ġ` should Ġbe Ġequal Ġto ` Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 1 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . first Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . prev Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . next Ġ` should Ġbe Ġequal Ġto ` Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . last Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 1 & ${ Pagination Utils . PAGE _ SIZE }= 3 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Request ing Ġa Ġnon - existing Ġpage Ġis Ġhandled Ġgrace fully `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 2 & ${ Pagination Utils . PAGE _ SIZE }= 5 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data . size Ġ` should Ġbe Ġequal Ġto ` Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . first Ġ` should Ġbe Ġequal Ġto ` Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . meta . last Ġ` should Ġbe Ġequal Ġto ` Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 2 & ${ Pagination Utils . PAGE _ SIZE }= 5 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . first Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 5 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . prev Ġ` should Ġbe Ġequal Ġto ` Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . next Ġ` should Ġbe Ġequal Ġto ` Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . last Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Results Ġare Ġcorrectly Ġsorted Ġin Ġascending Ġorder `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ SORT }[ id ]= asc " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . sorted By Ġ{ Ġit . id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ SORT }[ id ]= asc " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Results Ġare Ġcorrectly Ġsorted Ġin Ġdescending Ġorder `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ SORT }[ id ]= desc " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . sorted By Descending Ġ{ Ġit . id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ SORT }[ id ]= desc " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Results Ġare Ġcorrectly Ġsorted Ġby Ġmultiple Ġparameters `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ SORT }[ brand ]= asc & ${ Pagination Utils . PAGE _ SORT }[ model ]= desc " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . sorted With ( compare By < Car > Ġ{ Ġit . brand Ġ}. then By Descending Ġ{ Ġit . model Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ SORT }[ brand ]= asc & ${ Pagination Utils . PAGE _ SORT }[ model ]= desc " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Results Ġcan Ġbe Ġfiltered `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Car Ġ= Ġexpected C ars . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ FILTER }[ brand ]= ${ target Car . brand }& ${ Pagination Utils . PAGE _ FILTER }[ model ]= ${ target Car . model }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . filter Ġ{ Ġit . brand Ġ== Ġtarget Car . brand Ġ&& Ġit . model Ġ== Ġtarget Car . model Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ FILTER }[ brand ]= ${ target Car . brand }& ${ Pagination Utils . PAGE _ FILTER }[ model ]= ${ target Car . model }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Individual Ġfilters Ġmay Ġreference Ġmore Ġthan Ġone Ġvalue `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected C ars Ġ= Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġids Ġ= ĠlistOf ( expected C ars . first (). id , Ġexpected C ars . last (). id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠqueryParams Ġ= Ġids . join ToString (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ FILTER }[ id ] =$ queryParams " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` Ġexpected C ars . filter Ġ{ Ġit . id Ġin Ġids Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġpagination Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . links . self Ġ` should Ġbe Ġequal Ġto ` Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ FILTER }[ id ] =$ queryParams " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` Results Ġare Ġempty Ġwhen Ġthe Ġfilters Ġdo Ġnot Ġmatch Ġthe Ġdata `() Ġ= Ġtest App With Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate C ars ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ $ apiVersion / cars ? ${ Pagination Utils . PAGE _ NUMBER }= 0 & ${ Pagination Utils . PAGE _ SIZE }= 1 0 & ${ Pagination Utils . PAGE _ FILTER }[ brand ]= brand 0 0 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status () Ġ` should Ġbe Ġequal Ġto ` ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres : ĠPage Response < Car > Ġ= ĠJson Settings . fromJson ( response . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . data Ġ` should Ġbe Ġequal Ġto ` ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate C ars ( n : ĠInt ): ĠList < Car > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < Car > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġrepeat ( n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠUUID . randomUUID () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( insert Car ( brand Ġ= Ġ" B RAND : Ġ$ id ", Ġmodel Ġ= Ġ" MODEL : Ġ$ id ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert Car ( ĊĠĠĠĠĠĠĠ Ġbrand : ĠString Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠ Ġmodel : ĠString Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġ): ĠCar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb c . query Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Car Ġ= ĠCar Save Command ( brand , Ġmodel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcar Repository . save ( new Car ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcount C ars (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb c . query Ġ{ Ġcar Repository . count () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > Ġtest App With Config ( test : Ġsuspend ĠTest Application Engine . () Ġ-> ĠR ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest App ( db Container . config Info ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġtest () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ