package Ġcom . kh . service Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . kh . api . config . AppConfig Ċ import Ġcom . kh . api . request . Reservation Params Ċ import Ġcom . kh . api . request . Search Train Params Ċ import Ġcom . kh . api . request . Skill Payload Ċ import Ġcom . kh . deprecated Occ upy ing . K or ail Ċ import Ġcom . kh . util . RequestBody Creator Ċ import Ġcom . kh . util . Secret Properties Ċ import Ġcom . kh . util . map To Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . mockito . BDD Mockito Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . test . context . SpringBootTest Ċ import Ġorg . springframework . boot . test . mock . mockito . Mock Bean Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ @ SpringBootTest ( classes Ġ= Ġ[ AppConfig :: class ]) Ċ internal Ġclass ĠBackground Executor Test Ġ{ ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbackground Executor : ĠBackground Executor ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġkor ail : ĠK or ail ĊĊĠĠĠ Ġ@ Mock Bean ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġalarm Sender : ĠAlarm Sender ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrequest Body Creator : ĠRequest Body Creator ĊĊĠĠĠ Ġprivate Ġval Ġsecret Properties Ġ= ĠSecret Properties () ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġinternal Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Body Creator Ġ= ĠRequest Body Creator ( kor ail ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġsend Ġsuccess Ġmail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġrequest Body Creator . reservation Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Date Ġ= ĠLocalDate . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ( DateTime Formatter . of Pattern (" yyyy MM dd ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Time Ġ= Ġ" 0 7 0 0 0 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Station Ġ= Ġ" ìĦľ ìļ ¸ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Station Ġ= Ġ" ë¶Ģ ìĤ° ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġsecret Properties . kor ail . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw Ġ= Ġsecret Properties . kor ail . pw , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġsecret Properties . email . id ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġskill Payload Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. readValue ( body , ĠSkill Payload :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Extra Ġ= Ġskill Payload . action . client Extra . or Empty () ĊĠĠĠĠĠĠĠ Ġval Ġsearch Payload Ġ= Ġclient Extra ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To < Search Train Params >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Search Params () ĊĠĠĠĠĠĠĠ Ġval Ġtrain No Ġ= Ġclient Extra [" train - no "]. toString () ĊĠĠĠĠĠĠĠ Ġval Ġreservation Payload Ġ= Ġskill Payload . action . params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To < Reservation Params >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠ Ġbackground Executor . reserve Train ( search Payload , Ġtrain No , Ġreservation Payload ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ ĠB DD Mockito . verify ( alarm Sender ). send Success Message ( secret Properties . email . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` given Ġwrong Ġid Ġand Ġpw Ġshould Ġsend Ġfail Ġmail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġrequest Body Creator . reservation Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Date Ġ= ĠLocalDate . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ( DateTime Formatter . of Pattern (" yyyy MM dd ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Time Ġ= Ġ" 0 7 0 0 0 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepart ure Station Ġ= Ġ" ìĦľ ìļ ¸ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Station Ġ= Ġ" ë¶Ģ ìĤ° ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ" test ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw Ġ= Ġ" test ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġsecret Properties . email . id ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġskill Payload Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. readValue ( body , ĠSkill Payload :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Extra Ġ= Ġskill Payload . action . client Extra . or Empty () ĊĠĠĠĠĠĠĠ Ġval Ġsearch Payload Ġ= Ġclient Extra ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To < Search Train Params >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Search Params () ĊĠĠĠĠĠĠĠ Ġval Ġtrain No Ġ= Ġclient Extra [" train - no "]. toString () ĊĠĠĠĠĠĠĠ Ġval Ġreservation Payload Ġ= Ġskill Payload . action . params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To < Reservation Params >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct ĊĠĠĠĠĠĠĠ Ġbackground Executor . reserve Train ( search Payload , Ġtrain No , Ġreservation Payload ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert ĊĠĠĠĠĠĠĠ ĠB DD Mockito . verify ( alarm Sender ). send Fail Message ( secret Properties . email . id ) ĊĠĠĠ Ġ} Ċ }