package Ġwild . monitor . projects . web Ċ Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ 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 . http . MediaType Ċ 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 . post Ċ import Ġorg . springframework . test . web . servlet . result . MockMvc Result Matchers . json Path Ċ import Ġorg . springframework . test . web . servlet . result . MockMvc Result Matchers . status Ċ import Ġwild . monitor . helpers . Is ISO DateTime Close To . Companion . is ISO DateTime Close To Ċ import Ġwild . monitor . projects . Create Project UseCase Ċ import Ġwild . monitor . projects . No ProjectName Supp lied Exception Ċ import Ġwild . monitor . projects . Project Ċ import Ġwild . monitor . projects . ProjectName Taken Exception Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ @ Extend With ( Spring Extension :: class ) Ċ @ Web Mvc Test ( Create New Project Controller :: class ) Ċ class ĠCreate New Project Controller Test Ġ{ ĊĠĠĠ Ġ@ Test Configuration ĊĠĠĠ Ġclass ĠTest Config Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Bean ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Project UseCase (): ĠCreate Project UseCase < Project Response > Ġ= Ġmock k () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġmock Mvc : ĠMock Mvc ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġlateinit Ġvar Ġcreate New Project UseCase : ĠCreate Project UseCase < Project Response > ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcreate New Project _ when Provided A Name _ should Return Project Details () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠprojectName Ġ= Ġ" My ĠProject ĠNick name " ĊĠĠĠĠĠĠĠ Ġval Ġnew Project Ġ= ĠProject ( projectName ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Project Response Ġ= ĠProject Response . from Project ( new Project ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcreate New Project UseCase . create Project ( projectName ) Ġ} Ġreturns Ġnew Project Response ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" projectName ": Ġ"$ projectName " Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġthis . mock Mvc . perform ( post ("/ projects ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( request Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON _ UTF 8 _ VALUE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is Ok ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. id "). value ( new Project . id . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. project Key "). value ( new Project . project Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. projectName "). value ( projectName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. created On ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( is ISO DateTime Close To ( LocalDateTime . now (). format ( DateTime Formatter . ISO _ DATE _ TIME )))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcreate New Project _ when Provided AD uplicate ProjectName _ should Return BadRequest () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" projectName ": Ġ" Duplicate " Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcreate New Project UseCase . create Project ( any ()) Ġ} Ġthrows ĠProject Name Taken Exception () ĊĊĠĠĠĠĠĠĠ Ġthis . mock Mvc . perform ( post ("/ projects ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( request Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON _ UTF 8 _ VALUE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. message "). value (" Project Ġname Ġhas Ġalready Ġbeen Ġtaken .")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcreate New Project _ when ProjectName IsNot Supp lied _ should Return BadRequest () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" projectName ": Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcreate New Project UseCase . create Project ("") Ġ} Ġthrows ĠNo ProjectName Supp lied Exception () ĊĊĠĠĠĠĠĠĠ Ġthis . mock Mvc . perform ( post ("/ projects ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content ( request Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. contentType ( MediaType . APPLICATION _ JSON _ UTF 8 _ VALUE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( status (). is BadRequest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. message "). value (" Project Ġname Ġwas Ġnot Ġsupplied .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. andExpect ( json Path (" $. how To Rect ify "). value (" Please Ġprovide Ġa Ġunique Ġproject Ġname .")) ĊĠĠĠ Ġ} Ċ }