package Ġlibrary . service . api . books Ċ Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġlibrary . service . business . books . Book Collection Ċ import Ġlibrary . service . business . books . domain . Book Record Ċ import Ġlibrary . service . business . books . domain . comp os ites . Book Ċ import Ġlibrary . service . business . books . domain . states . Borrow ed Ċ import Ġlibrary . service . business . books . domain . types . Book Id Ċ import Ġlibrary . service . business . books . domain . types . Borrow er Ċ import Ġlibrary . service . business . books . exceptions . Book Already Borrow ed Exception Ċ import Ġlibrary . service . business . books . exceptions . Book Already Returned Exception Ċ import Ġlibrary . service . business . books . exceptions . Book NotFoundException Ċ import Ġlibrary . service . correlation . Correlation Id Holder Ċ import Ġlibrary . service . security . User Context Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . autoconfigure . rest docs . Auto Configure Rest Docs Ċ import Ġorg . springframework . boot . test . autoconfigure . web . servlet . Web Mvc Test Ċ import Ġorg . springframework . boot . test . context . Test Configuration Ċ import Ġorg . springframework . context . annotation . Bean Ċ 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 Matchers . content Ċ import Ġorg . springframework . test . web . servlet . result . MockMvc Result Matchers . status Ċ import Ġutils . Books Ċ import Ġutils . Reset Mocks After Each Test Ċ import Ġutils . classification . IntegrationTest Ċ import Ġutils . document Ċ import Ġjava . time . Offset DateTime ĊĊ Ċ @ IntegrationTest Ċ @ Reset Mocks After Each Test Ċ @ Web Mvc Test ( Books Controller :: class ) Ċ @ Auto Configure Rest Docs (" build / generated - snippets / books ") Ċ internal Ġclass ĠBooks Controller Doc Test ( ĊĠĠĠ Ġ@ Autowired Ġval Ġbook Collection : ĠBook Collection , ĊĠĠĠ Ġ@ Autowired Ġval Ġm vc : ĠMock Mvc Ċ ) Ġ{ ĊĊĠĠĠ Ġ@ Test Configuration ĊĠĠĠ Ġclass ĠAdditional Beans Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Bean Ġfun Ġcorrelation Id Holder () Ġ= ĠCorre lation Id Holder () ĊĠĠĠĠĠĠĠ Ġ@ Bean Ġfun Ġbook Resource Assembler () Ġ= ĠBook Resource Assembler ( User Context ()) ĊĠĠĠĠĠĠĠ Ġ@ Bean Ġfun Ġbook Collection (): ĠBook Collection Ġ= Ġmock k () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPOST Ġon Ġ/ api / books ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` post Ġbook Ġ- Ġcreated `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreated Book Ġ= Ġavailable Book () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . add Book ( any ()) Ġ} Ġreturns Ġcreated Book ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġpost ("/ api / books ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" isbn ": Ġ"${ created Book . book . isbn }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" title ": Ġ"${ created Book . book . title }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Created ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / hal + json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" post Book - created ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` post Ġbook Ġ- Ġbad Ġrequest `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġpost ("/ api / books ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" Ġ{} Ġ"" ") ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" error - example ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPUT Ġon Ġ/ api / books /{ book Id }/ authors ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` put Ġbook Ġauthors Ġ- Ġok `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= ĠBooks . CLEAN _ CODE ĊĠĠĠĠĠĠĠ Ġval Ġbook Record Ġ= Ġavailable Book ( book Ġ= Ġbook ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . update Book ( any (), Ġany ()) Ġ} Ġreturns Ġbook Record ĊĊĠĠĠĠĠĠĠ Ġval Ġauthors Value Ġ= Ġbook . authors . join ToString ( prefix Ġ= Ġ"\" ", Ġseparator Ġ= Ġ"\ ", Ġ\" ", Ġpostfix Ġ= Ġ"\" ") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġput ("/ api / books / 3 c 1 5 6 4 1 e - 2 5 9 8 - 4 1 f 5 - 9 0 9 7 - b 3 7 e 2 d 7 6 8 be 5 / authors ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" { Ġ" authors ": Ġ[$ authors Value ] Ġ} """) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / hal + json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" put Book Authors - ok ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDELETE Ġon Ġ/ api / books /{ book Id }/ authors ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` delete Ġbook Ġauthors Ġ- Ġok `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= ĠBooks . CLEAN _ CODE . copy ( authors Ġ= Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġval Ġbook Record Ġ= Ġavailable Book ( book Ġ= Ġbook ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . update Book ( any (), Ġany ()) Ġ} Ġreturns Ġbook Record ĊĊĠĠĠĠĠĠĠ Ġm vc . perform ( delete ("/ api / books / 3 c 1 5 6 4 1 e - 2 5 9 8 - 4 1 f 5 - 9 0 9 7 - b 3 7 e 2 d 7 6 8 be 5 / authors ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / hal + json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" delete Book Authors - ok ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPUT Ġon Ġ/ api / books /{ book Id }/ numberOf Pages ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` put Ġbook Ġnumber Ġof Ġpages Ġ- Ġok `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= ĠBooks . CLEAN _ CODE ĊĠĠĠĠĠĠĠ Ġval Ġbook Record Ġ= Ġavailable Book ( book Ġ= Ġbook ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . update Book ( any (), Ġany ()) Ġ} Ġreturns Ġbook Record ĊĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Pages Ġ= Ġbook . numberOf Pages ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġput ("/ api / books / 3 c 1 5 6 4 1 e - 2 5 9 8 - 4 1 f 5 - 9 0 9 7 - b 3 7 e 2 d 7 6 8 be 5 / numberOf Pages ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" { Ġ" numberOf Pages ": Ġ$ numberOf Pages Ġ} """) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / hal + json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" put Book NumberOf Pages - ok ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDELETE Ġon Ġ/ api / books /{ book Id }/ numberOf Pages ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` delete Ġbook Ġnumber Ġof Ġpages Ġ- Ġok `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= ĠBooks . CLEAN _ CODE . copy ( numberOf Pages Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġbook Record Ġ= Ġavailable Book ( book Ġ= Ġbook ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . update Book ( any (), Ġany ()) Ġ} Ġreturns Ġbook Record ĊĊĠĠĠĠĠĠĠ Ġm vc . perform ( delete ("/ api / books / 3 c 1 5 6 4 1 e - 2 5 9 8 - 4 1 f 5 - 9 0 9 7 - b 3 7 e 2 d 7 6 8 be 5 / numberOf Pages ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / hal + json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" delete Book NumberOf Pages - ok ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPUT Ġon Ġ/ api / books /{ book Id }/ title ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` put Ġbook Ġtitle Ġ- Ġok `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= ĠBooks . CLEAN _ CODE ĊĠĠĠĠĠĠĠ Ġval Ġbook Record Ġ= Ġavailable Book ( book Ġ= Ġbook ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . update Book ( any (), Ġany ()) Ġ} Ġreturns Ġbook Record ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġbook . title ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġput ("/ api / books / 3 c 1 5 6 4 1 e - 2 5 9 8 - 4 1 f 5 - 9 0 9 7 - b 3 7 e 2 d 7 6 8 be 5 / title ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" { Ġ" title ": Ġ"$ title " Ġ} """) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( content (). contentType (" application / hal + json ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" put Book Title - ok ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGET Ġon Ġ/ api / books ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` getting Ġall Ġbooks Ġ- Ġ 0 Ġbooks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . getAll Books () Ġ} Ġreturns Ġempty List () ĊĠĠĠĠĠĠĠ Ġm vc . perform ( get ("/ api / books ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" getAll Books - 0 Books ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` getting Ġall Ġbooks Ġ- Ġ 2 Ġbooks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . getAll Books () Ġ} Ġreturns ĠlistOf ( available Book (), Ġborrow ed Book ()) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( get ("/ api / books ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" getAll Books - 2 Books ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGET Ġon Ġ/ api / books /{ id } ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` getting Ġbook Ġby ĠID Ġ- Ġfound Ġavailable `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġavailable Book () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . get Book ( book . id ) Ġ} Ġreturns Ġbook ĊĠĠĠĠĠĠĠ Ġm vc . perform ( get ("/ api / books /${ book . id } ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" get Book ById - found Available ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` getting Ġbook Ġby ĠID Ġ- Ġfound Ġborrow ed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġborrow ed Book () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . get Book ( book . id ) Ġ} Ġreturns Ġbook ĊĠĠĠĠĠĠĠ Ġm vc . perform ( get ("/ api / books /${ book . id } ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" get Book ById - found Borrow ed ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` getting Ġbook Ġby ĠID Ġ- Ġnot Ġfound `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . get Book ( id ) Ġ} Ġthrows ĠBook NotFoundException ( id ) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( get ("/ api / books /$ id ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" get Book ById - not Found ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDELETE Ġon Ġ/ api / books /{ id } ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` de leting Ġbook Ġby ĠID Ġ- Ġfound `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . remove Book ( id ) Ġ} Ġreturns ĠUnit ĊĠĠĠĠĠĠĠ Ġm vc . perform ( delete ("/ api / books /$ id ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is No Content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" delete Book ById - found ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` de leting Ġbook Ġby ĠID Ġ- Ġnot Ġfound `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . remove Book ( id ) Ġ} Ġthrows ĠBook NotFoundException ( id ) ĊĠĠĠĠĠĠĠ Ġm vc . perform ( delete ("/ api / books /$ id ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" delete Book ById - not Found ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPOST Ġon Ġ/ api / books /{ id }/ borrow ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` borrow ing Ġbook Ġby ĠID Ġ- Ġfound Ġavailable `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġborrow ed Book () ĊĠĠĠĠĠĠĠ Ġval Ġborrow er Ġ= Ġ( book . state Ġas ĠB orrow ed ). by ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . borrow Book ( book . id , Ġborrow er ) Ġ} Ġreturns Ġbook ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġpost ("/ api / books /${ book . id }/ borrow ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" Ġ{ Ġ" borrow er ": Ġ"$ borrow er " Ġ} Ġ"" ") ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" borrow Book ById - found Available ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` borrow ing Ġbook Ġby ĠID Ġ- Ġfound Ġalready Ġborrow ed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġval Ġborrow er Ġ= Ġborrow er () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . borrow Book ( id , Ġborrow er ) Ġ} Ġthrows ĠBook Already Borrow ed Exception ( id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġpost ("/ api / books /$ id / borrow ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" Ġ{ Ġ" borrow er ": Ġ"$ borrow er " Ġ} Ġ"" ") ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Conflict ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" borrow Book ById - found Already Borrow ed ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` borrow ing Ġbook Ġby ĠID Ġ- Ġnot Ġfound `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġval Ġborrow er Ġ= Ġborrow er () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . borrow Book ( id , Ġborrow er ) Ġ} Ġthrows ĠBook NotFoundException ( id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġpost ("/ api / books /$ id / borrow ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType (" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content (""" Ġ{ Ġ" borrow er ": Ġ"$ borrow er " Ġ} Ġ"" ") ĊĠĠĠĠĠĠĠ Ġm vc . perform ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" borrow Book ById - not Found ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPOST Ġon Ġ/ api / books /{ id }/ return ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` return ing Ġbook Ġby ĠID Ġ- Ġfound Ġborrow ed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbook Ġ= Ġavailable Book () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . return Book ( book . id ) Ġ} Ġreturns Ġbook ĊĊĠĠĠĠĠĠĠ Ġm vc . perform ( post ("/ api / books /${ book . id }/ return ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" return Book ById - found Borrow ed ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` return ing Ġbook Ġby ĠID Ġ- Ġfound Ġalready Ġborrow ed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . return Book ( id ) Ġ} Ġthrows ĠBook Already Returned Exception ( id ) ĊĊĠĠĠĠĠĠĠ Ġm vc . perform ( post ("/ api / books /$ id / return ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Conflict ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" return Book ById - found Already Returned ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` return ing Ġbook Ġby ĠID Ġ- Ġnot Ġfound `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠBook Id . generate () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġbook Collection . return Book ( id ) Ġ} Ġthrows ĠBook NotFoundException ( id ) ĊĊĠĠĠĠĠĠĠ Ġm vc . perform ( post ("/ api / books /$ id / return ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is NotFound ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Do ( document (" return Book ById - not Found ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġutility Ġmethods ĊĊĠĠĠ Ġprivate Ġfun Ġborrow ed Book ( id : ĠBook Id Ġ= ĠBook Id . generate ()): ĠBook Record Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġborrow edBy Ġ= Ġborrow er () ĊĠĠĠĠĠĠĠ Ġval Ġborrow ed On Ġ= ĠOffset DateTime . parse (" 2 0 1 7 - 0 8 - 2 1 T 1 2 : 3 4 : 5 6 . 7 8 9 Z ") ĊĠĠĠĠĠĠĠ Ġreturn Ġavailable Book ( id ). borrow ( borrow edBy , Ġborrow ed On ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġborrow er () Ġ= ĠB orrow er (" sl u ") ĊĊĠĠĠ Ġprivate Ġfun Ġavailable Book ( ĊĠĠĠĠĠĠĠ Ġid : ĠBook Id Ġ= ĠBook Id . generate (), ĊĠĠĠĠĠĠĠ Ġbook : ĠBook Ġ= ĠBooks . CLEAN _ CODE ĊĠĠĠ Ġ) Ġ= ĠBook Record ( id , Ġbook ) Ċ Ċ }