package Ġbirthday _ k ata Ċ Ċ import Ġbirthday _ k ata . core . Birth day G reeting Service Ċ import Ġbirthday _ k ata . core . Email Response Ċ import Ġbirthday _ k ata . core . Response Ċ import Ġbirthday _ k ata . core . Send Birth day Emails For Today Error Ċ import Ġbirthday _ k ata . core . domain . DomainName Ċ import Ġbirthday _ k ata . core . domain . EmailAddress Ċ import Ġbirthday _ k ata . core . domain . Email Client Ċ import Ġbirthday _ k ata . core . domain . Employee Ċ import Ġbirthday _ k ata . core . domain . Employee Repo Ċ import Ġbirthday _ k ata . core . domain . Extension Ċ import Ġio . kot est . assertions . arrow . core . shouldBe Left Ċ import Ġio . kot est . assertions . arrow . core . shouldBe Right Ċ import Ġjava . time . LocalDate Ċ import Ġjava . util . UUID ĊĊ Ċ private Ġfun Ġd ou g ( dob : ĠLocalDate ): ĠEmployee Ġ= ĊĠĠĠ ĠEmployee ( ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠ Ġdate OfBirth Ġ= Ġdo b , ĊĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġ" D ou g ", ĊĠĠĠĠĠĠĠ ĠlastName Ġ= Ġ" D ou gson ", ĊĠĠĠĠĠĠĠ Ġemail Address Ġ= ĠEmail Address (" dou g ", ĠDomain Name (" business ", ĠExtension . COM )) ĊĠĠĠ Ġ) Ċ Ċ private Ġfun Ġt rix ie ( dob : ĠLocalDate ): ĠEmployee Ġ= ĊĠĠĠ ĠEmployee ( ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠ Ġdate OfBirth Ġ= Ġdo b , ĊĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġ" T rix ie ", ĊĠĠĠĠĠĠĠ ĠlastName Ġ= Ġ" Tang ", ĊĠĠĠĠĠĠĠ Ġemail Address Ġ= ĠEmail Address (" t rix ie ", ĠDomain Name (" business ", ĠExtension . COM )) ĊĠĠĠ Ġ) Ċ Ċ private Ġfun Ġfr an ( dob : ĠLocalDate ): ĠEmployee Ġ= ĊĠĠĠ ĠEmployee ( ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠ Ġdate OfBirth Ġ= Ġdo b , ĊĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġ" Fr an ", ĊĠĠĠĠĠĠĠ ĠlastName Ġ= Ġ" Fr and ott ir ", ĊĠĠĠĠĠĠĠ Ġemail Address Ġ= ĠEmail Address (" fr an ", ĠDomain Name (" business ", ĠExtension . COM )) ĊĠĠĠ Ġ) Ċ Ċ private Ġfun Ġt ia ( dob : ĠLocalDate ): ĠEmployee Ġ= ĊĠĠĠ ĠEmployee ( ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠ Ġdate OfBirth Ġ= Ġdo b , ĊĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġ" T ia ", ĊĠĠĠĠĠĠĠ ĠlastName Ġ= Ġ" Ti ara ", ĊĠĠĠĠĠĠĠ Ġemail Address Ġ= ĠEmail Address (" t ia ", ĠDomain Name (" business ", ĠExtension . COM )) ĊĠĠĠ Ġ) Ċ Ċ data Ġclass ĠGiven ( ĊĠĠĠ Ġval Ġemployee Repo : ĠEmployee Repo Ġ= ĠIn Memory Employee Repo ( mutable ListOf ()), ĊĠĠĠ Ġval Ġemail Client : ĠEmail Client Ġ= ĠStub bed Email Client , ĊĠĠĠ Ġval Ġtoday : ĠLocalDate Ġ= ĠLocalDate . now (), Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġ` No Ġemployees `() Ġ= ĊĠĠĠĠĠĠĠ Ġthis . copy ( employee Repo Ġ= ĠIn Memory Employee Repo ( mutable ListOf ())) ĊĊĠĠĠ Ġsuspend Ġfun Ġ` D ou g , Ġwho Ġturns Ġ 4 5 Ġtoday ` (): ĠGiven Ġ{ ĊĠĠĠĠĠĠĠ Ġemployee Repo . save ( dou g ( today . minus Years ( 4 5 ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ` T rix ie , Ġwho Ġturns Ġ 7 2 Ġtoday ` (): ĠGiven Ġ{ ĊĠĠĠĠĠĠĠ Ġemployee Repo . save ( t rix ie ( today . minus Years ( 7 2 ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ` Fr an , Ġwho Ġturned Ġ 3 6 Ġyesterday ` (): ĠGiven Ġ{ ĊĠĠĠĠĠĠĠ Ġemployee Repo . save ( fr an ( today . minus Days ( 1 ). minus Years ( 3 6 ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ` T ia , Ġwho Ġturns Ġ 2 5 Ġtomorrow ` (): ĠGiven Ġ{ ĊĠĠĠĠĠĠĠ Ġemployee Repo . save ( t ia ( today . plus Days ( 1 ). minus Years ( 2 5 ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ` a Ġpersistent Ġconnection Ġfailure Ġwhen Ġconnecting Ġto Ġthe ĠEmployee Ġdatabase ` (): ĠGiven Ġ= ĊĠĠĠĠĠĠĠ Ġthis . copy ( employee Repo Ġ= ĠConnection Failure Employee Repo ) ĊĊĠĠĠ Ġsuspend Ġfun Ġ` when Ġbirthday Ġemails Ġare Ġsent Ġfor Ġtoday ` (): ĠResponse Ġ= ĠB irth day G reeting Service ( ĊĠĠĠĠĠĠĠ Ġemail Client Ġ= Ġemail Client , ĊĠĠĠĠĠĠĠ Ġemployee Repo Ġ= Ġemployee Repo , ĊĠĠĠ Ġ). send Birth day Emails For Today ( today ) Ċ } Ċ Ċ fun ĠResponse .` then ĠD ou g Ġand ĠT rix ie Ġshould Ġreceive Ġemails `() Ġ= ĊĠĠĠ Ġthis . also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . shouldBe Right ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġ" Happy ĠB irth day !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġ" dou g @ business . com ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġ" De ar ĠD ou g , ĠH appy ĠB irth day !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġ" Happy ĠB irth day !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġ" t rix ie @ business . com ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġ" De ar ĠT rix ie , ĠH appy ĠB irth day !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ fun ĠResponse .` then Ġonly ĠD ou g Ġshould Ġreceive Ġan Ġemail `() Ġ= ĊĠĠĠ Ġthis . also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . shouldBe Right ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmail Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġ" Happy ĠB irth day !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġ" dou g @ business . com ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġ" De ar ĠD ou g , ĠH appy ĠB irth day !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ fun ĠResponse .` then Ġno Ġone Ġshould Ġreceive Ġan Ġemail `() Ġ= ĊĠĠĠ Ġthis . also Ġ{ Ġit . shouldBe Right ( emptyList ()) Ġ} Ċ Ċ fun ĠResponse .` then Ġan Ġemployee Ġlookup Ġfailed Ġerror Ġshould Ġbe Ġreturned `() Ġ= ĊĠĠĠ Ġthis . also Ġ{ Ġit . shouldBe Left ( Send Birth day Emails For Today Error . Employee Lookup Failed ) Ġ}