package Ġcom . phot ot agger . datal ake . rest Ċ Ċ import Ġcom . github . kit tin un f . fuel . Fuel Ċ import Ġcom . github . kit tin un f . fuel . core . Fuel Manager Ċ import Ġcom . github . kit tin un f . fuel . core . Response Deserial izable Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . phot ot agger . datal ake .* Ċ import Ġcom . phot ot agger . datal ake . model . Photo Ċ import Ġio . jav al in . J aval in Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġorg . junit . jupiter . api . After Each Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Tag Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ const Ġval ĠPORT Ġ= Ġ 7 0 0 1 Ċ const Ġval ĠPATH _ PH OT OS Ġ= Ġ"/ photos " Ċ const Ġval ĠMIME _ TYPE _ JSON Ġ= Ġ" application / json " Ċ Ċ @ Tag (" rest ") Ċ class ĠRest Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice : ĠPhoto Service ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontroller : ĠRest Controller ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġserver : ĠJ aval in ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠF uel Manager . instance . basePath Ġ= Ġ" http :// localhost :$ PORT " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġinternal Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġservice Ġ= Ġmock k () ĊĠĠĠĠĠĠĠ Ġcontroller Ġ= ĠRest Controller ( PORT , Ġservice ) ĊĠĠĠĠĠĠĠ Ġserver Ġ= Ġcontroller . create Server () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Each ĊĠĠĠ Ġinternal Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġserver . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// region ĠPOST ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` POST Ġrespon ds Ġwith Ġ 2 0 1 Ġon Ġsuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphoto Ġ= ĠPhoto DTO ( byte ArrayOf ( 1 , Ġ 2 ), ĠlistOf (" tag 1 ", Ġ" tag 2 "), Ġ" example . com ") ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . save Photo ( any ()) Ġ} Ġreturns Ġ" 1 " ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . post ( PATH _ PH OT OS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( Photo Serializer (). serialize ( photo )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 1 , Ġresponse . statusCode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` POST Ġsucceeds Ġwith ĠLocation Ġin Ġresponse Ġheaders `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphoto Ġ= ĠPhoto DTO ( byte ArrayOf ( 1 , Ġ 2 ), ĠlistOf (" tag 1 ", Ġ" tag 2 "), Ġ" example . com ") ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . save Photo ( any ()) Ġ} Ġreturns Ġ" 1 " ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . post ( PATH _ PH OT OS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( Photo Serializer (). serialize ( photo )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġresponse . headers [" Location "] ĊĠĠĠĠĠĠĠ ĠassertEquals (" http :// localhost :$ PORT / photos / 1 ", Ġlocation ?. first OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` POST Ġsucceeds Ġwith Ġno Ġcontent Ġin Ġresponse `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphoto Ġ= ĠPhoto DTO ( byte ArrayOf ( 1 , Ġ 2 ), ĠlistOf (" tag 1 ", Ġ" tag 2 "), Ġ" example . com ") ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . save Photo ( any ()) Ġ} Ġreturns Ġ" 1 " ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . post ( PATH _ PH OT OS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( Photo Serializer (). serialize ( photo ). toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 1 , Ġresponse . statusCode ) ĊĠĠĠĠĠĠĠ Ġassert ( response . data . isEmpty ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĊĠĠĠ Ġ// region ĠGET ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠAll Ġrespon ds Ġwith Ġ 2 0 0 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . getAll () Ġ} Ġreturns Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . get ( PATH _ PH OT OS ). response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġresponse . statusCode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠAll Ġrespon ds Ġwith ĠJSON Ġcontent Ġtype `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . get ( PATH _ PH OT OS ). response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( MIME _ TYPE _ JSON , Ġresponse . headers [" Content - Type "] ?. first OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠAll Ġrespon ds Ġwith Ġlist Ġof Ġurls `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . getAll () Ġ} Ġreturns ĠlistOf (" 1 ", Ġ" 2 ", Ġ" 3 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġresult ) Ġ= ĠF uel . get ( PATH _ PH OT OS ). response Object ( object Ġ: ĠResponse Deserial izable < JsonArray > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( content : ĠString ): ĠJson Array ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGson (). fromJson ( content , ĠJson Array :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġresponse . statusCode ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( json Array , Ġ_) Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġval Ġurls Ġ= Ġjson Array ?. map Ġ{ Ġit . asString Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert ArrayEquals ( urls ?. to Typed Array (), ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// localhost :$ PORT / photos / 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// localhost :$ PORT / photos / 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// localhost :$ PORT / photos / 3 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠExisting Ġrespon ds Ġwith Ġ 2 0 0 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . get Photo (" 1 ") Ġ} Ġreturns ĠPhoto ( byte ArrayOf (), ĠlistOf (" tag 1 ", Ġ" tag 2 "), Ġ" example . com ", Ġ"/ tmp / 1 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . get ("$ PATH _ PH OT OS / 1 "). response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġresponse . statusCode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠExisting Ġrespon ds Ġwith ĠJSON Ġcontent Ġtype `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . get Photo (" 1 ") Ġ} Ġreturns ĠPhoto ( byte ArrayOf (), ĠlistOf (" tag 1 ", Ġ" tag 2 "), Ġ" example . com ", Ġ"/ tmp / 1 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . get ("$ PATH _ PH OT OS / 1 "). response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( MIME _ TYPE _ JSON , Ġresponse . headers [" Content - Type "] ?. first OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠExisting Ġrespon ds Ġwith Ġcontent `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . get Photo (" 1 ") Ġ} Ġreturns ĠPhoto ( byte ArrayOf ( 1 , Ġ 2 ), ĠlistOf (" tag 1 ", Ġ" tag 2 "), Ġ" example . com ", Ġ"/ tmp / 1 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġ( request , Ġresponse , Ġresult ) Ġ= ĠF uel . get ("$ PATH _ PH OT OS / 1 "). response Object ( Test Photo Deserializer ()) ĊĊĠĠĠĠĠĠĠ Ġprintln ( request ) ĊĠĠĠĠĠĠĠ Ġprintln ( response ) ĊĠĠĠĠĠĠĠ Ġprintln ( result ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( photo Dto , Ġ_) Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġprintln ( photo Dto ) ĊĊĠĠĠĠĠĠĠ Ġphoto Dto ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ArrayEquals ( byte ArrayOf ( 1 , Ġ 2 ), Ġphoto Dto . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ArrayEquals ( array Of (" tag 1 ", Ġ" tag 2 "), Ġphoto Dto . tags . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" example . com ", Ġphoto Dto . original Url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( photo Dto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` GET ĠNon existing Ġrespon ds Ġwith Ġ 4 0 4 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . get Photo (" 1 ") Ġ} Ġreturns Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . get ("$ PATH _ PH OT OS / 1 "). response () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 0 4 , Ġresponse . statusCode ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĊĠĠĠ Ġ// region ĠDELETE ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete Existing _ respon ds With 2 0 4 () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġservice . delete ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġresponse , Ġ_) Ġ= ĠF uel . delete ("$ PATH _ PH OT OS / 1 "). response () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 4 , Ġresponse . statusCode ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion Ċ } Ċ Ċ class ĠTest Photo Deserializer Ġ: ĠResponse Deserial izable < Photo DTO > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( content : ĠString ): ĠPhoto DTO ? Ġ= ĠPhoto Deserializer (). deserialize ( content ) Ċ }