package Ġcom . v ite kk or . socks Shop Ċ Ċ import Ġcom . v ite kk or . socks Shop . data . Operation Ċ import Ġcom . v ite kk or . socks Shop . data . S ocks Ċ import Ġcom . v ite kk or . socks Shop . data Base . S ocks Table Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . server . testing .* Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ import Ġorg . jetbrains . ex posed . sql . transactions . Transaction Manager Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . junit . jupiter . api .* Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . opent est 4 j . Assertion Failed Error Ċ import Ġjava . util .* Ċ import Ġkotlin . random . Random Ċ Ċ @ TestMethod Order ( Method Order er . Order Annotation :: class ) Ċ class ĠServer Kt Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġincoming Copy Ġ= Ġmutable ListOf < S ocks >() ĊĠĠĠĠĠĠĠ Ġval Ġincoming S ocks Ġ= Ġmutable ListOf < S ocks >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ocks ("${ Random . nextInt ( 0 , Ġ 1 0 1 )} ", ĠRandom . nextInt ( 0 , Ġ 1 0 1 ), ĠRandom . next Long ( 0 , Ġ 1 0 0 0 _ 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( socks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Copy . add ( socks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdb Ġ= ĠDatabase . connect (" jdbc : h 2 : mem :// test ; DB _ CLOSE _ DELAY =- 1 ", Ġdriver Ġ= Ġ" org . h 2 . Driver ") ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Order ( 6 ) ĊĠĠĠ Ġfun Ġclear Data Base () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction ( db ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Utils . drop ( S ocks Table ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTransaction Manager . close And Unregister ( db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġcreate Data Base () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction ( db ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Logger ( Std Out Sql Logger ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSchema Utils . create ( S ocks Table ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Order ( 1 ) ĊĠĠĠ Ġ@ kotlin x . serialization . Experimental Serialization Api ĊĠĠĠ Ġfun Ġtest Post Api S ocks Income () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbad Req Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{}", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ color : Ġ, Ġc ot ton Part : Ġ 4 2 , Ġquantity : Ġ 1 0 0 }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ cot ton Part : Ġ 4 2 , Ġquantity : Ġ 1 0 0 }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ color : Ġred , Ġc ot ton Part : Ġ 4 2 , Ġquantity : Ġ 1 0 0 , Ġfield : Ġvalue }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ color : Ġcolor , Ġc ot ton Part : Ġc ot ton Part , Ġquantity : Ġquantity }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ color : Ġcolor , Ġc ot ton Part : Ġ 1 4 6 , Ġquantity : Ġ 5 0 }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"{ color : Ġcolor , Ġc ot ton Part : Ġ 4 2 , Ġquantity : Ġ- 2 5 0 }", ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ Ġsock s Shop () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( bad Ġin Ġbad Req ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Json Request ( bad , Ġ"/ api / socks / income "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . BadRequest , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( socks Ġin Ġincoming S ocks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠJson . encode ToString ( socks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= Ġtransaction ( db ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ocks Table . select Ġ{ Ġ( S ocks Table . color Ġeq Ġsock s . color ) Ġand Ġ( S ocks Table . cot ton Part Ġeq Ġsock s . cot ton Part ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull ()?. get ( S ocks Table . quantity ) Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Json Request ( body , Ġ"/ api / socks / income "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Ġ= Ġtransaction ( db ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ocks Table . select Ġ{ Ġ( S ocks Table . color Ġeq Ġsock s . color ) Ġand Ġ( S ocks Table . cot ton Part Ġeq Ġsock s . cot ton Part ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull ()?. get ( S ocks Table . quantity ) Ġ?: Ġthrow ĠAssertion Failed Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( after Ġ- Ġbefore , Ġsock s . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Order ( 2 ) ĊĠĠĠ Ġfun ĠtestGet Api S ocks () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ Ġsock s Shop () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbad Req s Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color = red & operation = more & cot ton Part = 9 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color = blue & operation = equal & cot ton Part =", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" operation = more Than & cot ton Part = 9 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color = white & operation = less Than & cot ton Part = 9 0 & operation = equal ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color = red & operation = EQUAL & cot ton Part = 9 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color = col & operation = equal & cot ton Part = one ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" color = red & operation = more Than & cot ton Part = 9 0 & some Parameter = some Value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( bad Req Ġin Ġbad Req s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġ"/ api / socks ?$ bad Req "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . BadRequest , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 5 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġincoming S ocks [ Random . nextInt ( 0 , Ġincoming S ocks . size )]. color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ot ton Part Ġ= Ġincoming S ocks [ Random . nextInt ( 0 , Ġincoming S ocks . size )]. cot ton Part ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= ĠOperation . values ()[ Random . nextInt ( 0 , Ġ 3 )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. lowercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("_ t ", Ġ" T ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq Url Ġ= Ġ"/ api / socks ? color =$ color & operation =$ operation & cot ton Part =$ cot ton Part " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( HttpMethod . Get , Ġreq Url ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġincoming S ocks . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . color Ġ== Ġcolor Ġ&& Ġwhen Ġ( operation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" less Than " Ġ-> Ġit . cot ton Part Ġ< Ġc ot ton Part ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" more Than " Ġ-> Ġit . cot ton Part Ġ> Ġc ot ton Part ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġit . cot ton Part Ġ== Ġc ot ton Part ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( 0 L ) Ġ{ Ġacc , Ġsock s Ġ-> Ġacc Ġ+ Ġsock s . quantity Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( res , Ġresponse . content !!. to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Order ( 3 ) ĊĠĠĠ Ġ@ kotlin x . serialization . Experimental Serialization Api ĊĠĠĠ Ġfun Ġtest Post Api S ocks Outcome () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġ"/ api / socks / outcome " ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ Ġsock s Shop () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( incoming S ocks . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s Ġ= Ġincoming S ocks . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠJson . encode ToString ( socks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Random . next Boolean ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbad Ġ= Ġsock s . copy ( quantity Ġ= Ġsock s . quantity Ġ+ ĠRandom . nextInt ( 0 , Ġ 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Quantity Ġ= Ġincoming S ocks . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . color Ġ== Ġsock s . color Ġ&& Ġit . cot ton Part Ġ== Ġsock s . cot ton Part ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ( 0 L ) Ġ{ Ġa , Ġs Ġ-> Ġa Ġ+ Ġs . quantity Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Json Request ( Json . encode ToString ( bad ), Ġuri ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Quantity Ġ>= Ġbad . quantity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Json Request ( Json . encode ToString ( bad ), Ġ"/ api / socks / income "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . BadRequest , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Json Request ( body , Ġuri ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming S ocks . remove ( socks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Order ( 4 ) ĊĠĠĠ Ġfun Ġtest After Post Api S ocks Outcome () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Test Application ({ Ġsock s Shop () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( socks Ġin Ġincoming Copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( socks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ api / socks ? color =$ color & operation = equal & cot ton Part =$ cot ton Part " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( HttpStatusCode . OK , Ġresponse . status ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 L , Ġresponse . content !!. to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTest Application Engine . handle Json Request ( json : ĠString , Ġuri : ĠString ): ĠTest Application Call Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Request ( HttpMethod . Post , Ġuri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Headers . ContentType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContentType . Application . Json . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( json ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }