package Ġnl . bj orn v ander la an . spring web flux kotlin functional . router Ċ Ċ import Ġcom . nin jas quad . spring mock k . Mock k Bean Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . every Ċ import Ġio . mock k . slot Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġnl . bj orn v ander la an . spring web flux kotlin functional . handler . Cat Handler Ċ import Ġnl . bj orn v ander la an . spring web flux kotlin functional . model . Cat Ċ import Ġnl . bj orn v ander la an . spring web flux kotlin functional . model . Cat Dto Ċ import Ġnl . bj orn v ander la an . spring web flux kotlin functional . model . to Dto Ċ import Ġnl . bj orn v ander la an . spring web flux kotlin functional . repository . Cat Repository Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . autoconfigure . web . reactive . Web Flux Test Ċ import Ġorg . springframework . context . annotation . Import Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . test . web . reactive . server . Web Test Client Ċ import Ġorg . springframework . test . web . reactive . server . expect Body Ċ import Ġorg . springframework . test . web . reactive . server . expect Body List Ċ import Ġorg . springframework . web . reactive . function . Body Inser ters . from Value ĊĊ Ċ @ Web Flux Test Ċ @ Import ( Cat Router Configuration :: class , ĠCat Handler :: class ) Ċ class ĠMock ed Repository IntegrationTest ( ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġclient : ĠWeb Test Client Ċ ) Ġ{ ĊĠĠĠ Ġ@ Mock k Bean ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠCat Repository ĊĊĠĠĠ Ġprivate Ġfun Ġa Cat ( ĊĠĠĠĠĠĠĠ Ġname : ĠString Ġ= Ġ" Ob i ", ĊĠĠĠĠĠĠĠ Ġtype : ĠString Ġ= Ġ" D utch ĠRing tail ", ĊĠĠĠĠĠĠĠ Ġage : ĠInt Ġ= Ġ 3 ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ ĠCat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġage Ġ= Ġage ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġanother Cat ( ĊĠĠĠĠĠĠĠ Ġname : ĠString Ġ= Ġ" Wan ", ĊĠĠĠĠĠĠĠ Ġtype : ĠString Ġ= Ġ" J apanese ĠBob tail ", ĊĠĠĠĠĠĠĠ Ġage : ĠInt Ġ= Ġ 5 ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ Ġa Cat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġage Ġ= Ġage ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Retrieve Ġall Ġcats `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findAll () ĊĠĠĠĠĠĠĠ Ġ} Ġreturns Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( aC at ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( another Cat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Ok ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Body List < Cat Dto >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Size ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains ( aC at (). to Dto (), Ġanother Cat (). to Dto ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Retrieve Ġcat Ġby Ġexisting Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Cat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Ok ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Body < Cat Dto >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( aC at (). to Dto ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Retrieve Ġcat Ġby Ġnon - existing Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns Ġnull ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is NotFound ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Add Ġa Ġnew Ġcat `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsaved Cat Ġ= Ġslot < Cat >() ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save ( capture ( saved Cat )) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Cat . captured ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body Value ( aC at (). to Dto ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Ok ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Body < Cat Dto >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( saved Cat . captured . to Dto ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Add Ġa Ġnew Ġcat Ġwith Ġempty Ġrequest Ġbody `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsaved Cat Ġ= Ġslot < Cat >() ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save ( capture ( saved Cat )) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Cat . captured ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( from Value ("{} ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is BadRequest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Update Ġa Ġcat `() Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Cat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsaved Cat Ġ= Ġslot < Cat >() ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . save ( capture ( saved Cat )) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Cat . captured ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Cat Ġ= Ġa Cat ( name Ġ= Ġ" New Ġfancy Ġname "). to Dto () ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body Value ( updated Cat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Ok ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Body < Cat Dto >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( updated Cat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Update Ġcat Ġwith Ġnon - existing Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequested Id Ġ= Ġslot < Long >() ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findById ( capture ( requested Id )) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnothing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġupdated Cat Ġ= Ġa Cat ( name Ġ= Ġ" New Ġfancy Ġname "). to Dto () ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body Value ( updated Cat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is NotFound ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Update Ġcat Ġwith Ġempty Ġrequest Ġbody Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Cat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( from Value ("{} ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is BadRequest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Delete Ġcat Ġwith Ġexisting Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . exists ById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . delete ById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnothing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is No Content ĊĊĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġrepository . delete ById ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Delete Ġcat Ġby Ġnon - existing Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . exists ById ( any ()) ĊĠĠĠĠĠĠĠ Ġ} Ġco Answers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. uri ("/ api / cats / 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exchange () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. expect Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is NotFound ĊĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġrepository . delete ById ( any ()) Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ