/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠSIP 3 . IO , ĠCorp . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . sip 3 . twig . ce . controller Ċ Ċ import Ġio . sip 3 . twig . ce . Mockito Extension . any Ċ import Ġio . sip 3 . twig . ce . domain . Address Mapping Ċ import Ġio . sip 3 . twig . ce . domain . Host Ċ import Ġio . sip 3 . twig . ce . service . host . Host Service Ċ import Ġorg . hamcrest . Matchers .` is ` Ċ import Ġorg . hamcrest . collection . Is Collection With Size Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . mockito . BDD Mockito .* Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . autoconfigure . web . servlet . Web Mvc Test Ċ import Ġorg . springframework . boot . test . mock . mockito . Mock Bean Ċ import Ġorg . springframework . dao . Duplicate Key Exception Ċ import Ġorg . springframework . dao . Empty Result Data AccessException Ċ import Ġorg . springframework . http . MediaType Ċ import Ġorg . springframework . mock . web . Mock Multipart File Ċ import Ġorg . springframework . test . context . junit . jupiter . Spring Extension Ċ import Ġorg . springframework . test . web . servlet . MockMvc Ċ import Ġorg . springframework . test . web . servlet . request . MockMvc Request Builders .* Ċ import Ġorg . springframework . test . web . servlet . result . MockMvc Result Handlers . print Ċ import Ġorg . springframework . test . web . servlet . result . MockMvc Result Matchers . json Path Ċ import Ġorg . springframework . test . web . servlet . result . MockMvc Result Matchers . status Ċ Ċ @ Extend With ( Spring Extension :: class ) Ċ @ Web Mvc Test ( Host Controller :: class ) Ċ class ĠHost Controller Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠHOST _ 1 Ġ= ĠHost ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" id 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" host 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 ", Ġ" 1 0 . 1 0 . 1 0 . 0 / 2 8 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Address Mapping (" 1 0 . 0 . 0 . 1 ", Ġ" 1 0 . 0 . 0 . 1 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of (" proxy ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠHOST _ 2 Ġ= ĠHost ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" id 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" host 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" 1 0 . 1 0 . 2 0 . 0 : 5 0 6 0 ", Ġ" 1 0 . 1 0 . 2 0 . 0 / 2 8 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Address Mapping (" 1 0 . 0 . 0 . 1 ", Ġ" 1 0 . 0 . 0 . 1 ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmock Mvc : ĠMock Mvc ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhost Service : ĠHost Service ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Get Ġall Ġhosts `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . list ()). willReturn ( set Of ( HOST _ 1 , ĠHOST _ 2 )) ĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( get ("/ hosts ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( print ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ ", ĠIs Collection With Size . has Size < Any >( 2 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ [ 0 ]. id "). does NotExist ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ [ 0 ]. name ", Ġ` is `( HOST _ 1 . name ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ [ 0 ]. addr ", Ġ` is `( HOST _ 1 . addr ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ [ 0 ]. mapping [ 0 ]. source ", Ġ` is `( HOST _ 1 . mapping . first (). source ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ [ 0 ]. mapping [ 0 ]. target ", Ġ` is `( HOST _ 1 . mapping . first (). target ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path ("$ [ 0 ]. feature [ 0 ]", Ġ` is `( HOST _ 1 . feature . first ()))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Get Ġhost Ġby Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . get ByName (" host 1 ")). willReturn ( HOST _ 1 ) ĊĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( get ("/ hosts / host 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( print ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. name ", Ġ` is `( HOST _ 1 . name ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Get Ġhost Ġnot Ġpersisted Ġyet Ġby Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . get ByName (" host 3 ")). will Throw ( Empty Result Data AccessException ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( get ("/ hosts / host 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Add Ġvalid Ġhost `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . create ( any ())). willReturn ( HOST _ 2 ) ĊĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/ hosts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" {" name ": Ġ" host 2 ", Ġ" addr ": Ġ[" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 "], Ġ" mapping ": Ġ[{" source ": Ġ" 1 0 . 0 . 0 . 1 "," target ": Ġ" 1 0 . 0 . 0 . 1 "}]} """) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Add Ġhost Ġwith Ġbad Ġmapping Ġaddress `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/ hosts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" {" name ": Ġ" host 2 ", Ġ" addr ": Ġ[" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 "], Ġ" mapping ": Ġ[{" source ": Ġ" 1 0 . 0 . 0 . 1 0 2 4 "," target ": Ġ" 1 0 . 0 . 0 . 1 "}]} """) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Add Ġhost Ġalready Ġpersisted `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . create ( any ())). will Throw ( Duplicate Key Exception ("")) ĊĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost ("/ hosts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" {" name ": Ġ" host 2 ", Ġ" addr ": Ġ[" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 "], Ġ" mapping ": Ġ[{" source ": Ġ" 1 0 . 0 . 0 . 1 "," target ": Ġ" 1 0 . 0 . 0 . 1 "}]} """) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Conflict ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Update Ġvalid Ġhost `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . create ( any ())). willReturn ( HOST _ 2 ) ĊĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ("/ hosts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" {" name ": Ġ" host 2 ", Ġ" addr ": Ġ[" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 "], Ġ" mapping ": Ġ[{" source ": Ġ" 1 0 . 0 . 0 . 1 "," target ": Ġ" 1 0 . 0 . 0 . 1 "}]} """) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Update Ġhost Ġwith Ġbad Ġmedia Ġaddress `() Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ("/ hosts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" {" name ": Ġ" host 2 ", Ġ" addr ": Ġ[" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 "], Ġ" mapping ": Ġ[{" source ": Ġ" 1 0 . 0 . 0 . 1 / 2 8 0 "," target ": Ġ" 1 0 . 0 . 0 . 1 "}]} """) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Update Ġhost Ġnot Ġpersisted Ġyet `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . update ( any ())). will Throw ( Empty Result Data AccessException ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ("/ host /") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" {" name ": Ġ" host 2 ", Ġ" addr ": Ġ[" 1 0 . 1 0 . 1 0 . 0 : 5 0 6 0 "], Ġ" mapping ": Ġ[{" source ": Ġ" 1 0 . 0 . 0 . 1 "," target ": Ġ" 1 0 . 0 . 0 . 1 "}]} """) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Delete Ġpersisted Ġhost Ġby Ġname `() Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . mock Mvc . perform ( delete ("/ hosts / host 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is No Content ) ĊĊĠĠĠĠĠĠĠ Ġverify ( host Service , Ġonly ()). delete ByName ( any ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Delete Ġhost Ġby Ġname Ġnot Ġpersisted Ġyet `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven ( host Service . delete ByName ( any ())). will Throw ( Empty Result Data AccessException ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġthis . mock Mvc . perform ( delete ("/ hosts / host 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Upload ĠJSON Ġfile `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHost Controller Test :: class . java . getResource AsStream ("/ json / hosts / correct Host List . json "). use Ġ{ Ġfile Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Mock Ġ= ĠMock Multipart File (" file ", Ġ" hosts . json ", Ġnull , Ġfile Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultipart ("/ hosts / import ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. file ( file Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). andExpect ( status (). is No Content ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify ( host Service , Ġonly ()). save All ( any ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Upload ĠJSON Ġfile Ġwith Ġinvalid Ġhost `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHost Controller Test :: class . java . getResource AsStream ("/ json / hosts / incorrect Address Host List . json "). use Ġ{ Ġfile Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Mock Ġ= ĠMock Multipart File (" file ", Ġ" hosts . json ", Ġnull , Ġfile Stream ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultipart ("/ hosts / import ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. file ( file Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Upload ĠJSON Ġfile Ġwith Ġduplicate Ġhost `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHost Controller Test :: class . java . getResource AsStream ("/ json / hosts / d uplicated Host List . json "). use Ġ{ Ġfile Stream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Mock Ġ= ĠMock Multipart File (" file ", Ġ" hosts . json ", Ġnull , Ġfile Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Mvc . perform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultipart ("/ hosts / import ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. file ( file Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ