package Ġio . real world . domain . article Ċ Ċ import Ġio . quarkus . test . junit . Qu ark us Test Ċ import Ġio . quarkus . test . junit . mockito . Inject Mock Ċ import Ġio . real world . domain . exception . Article NotFoundException Ċ import Ġio . real world . domain . profile . Follow Relationship Repository Ċ import Ġio . real world . support . factory . Article Factory Ċ import Ġio . real world . support . factory . User Factory Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNot Equals Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġorg . mockito . kotlin . any Ċ import Ġorg . mockito . kotlin . verify Ċ import Ġjava . util .* Ċ Ċ @ Qu ark us Test Ċ internal Ġclass ĠArticle Service Test Ġ{ ĊĠĠĠ Ġ@ Inject Mock ĊĠĠĠ Ġlateinit Ġvar Ġrepository : ĠArticle Repository ĊĠĠĠ Ġ@ Inject Mock ĊĠĠĠ Ġlateinit Ġvar Ġfavorite Relationship Repository : ĠF avorite Relationship Repository ĊĠĠĠ Ġ@ Inject Mock ĊĠĠĠ Ġlateinit Ġvar Ġfollow Relationship Repository : ĠFollow Relationship Repository ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġservice : ĠArticle Service ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġinternal Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġservice Ġ= ĠArticle Service ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavorite Relationship Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfollow Relationship Repository ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa Ġexisting Ġarticle , Ġwhen Ġarticle Ġrequested Ġby Ġslug , Ġthen Ġservice Ġshould Ġreturn Ġcorrect ĠArticle Response `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Article Ġ= ĠArticle Factory . create () ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . findById ( existing Article . slug )). thenReturn ( existing Article ) ĊĊĠĠĠĠĠĠĠ Ġexisting Article . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( favorite Relationship Repository . f avor ited Count ( slug )). thenReturn ( 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġservice . get ( existing Article . slug ) ĊĊĠĠĠĠĠĠĠ Ġresult . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArticle Response . build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Ġ= Ġexisting Article , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Count Ġ= Ġ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis F avor ited Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Following Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa Ġnew Ġarticle Ġrequest , Ġwhen Ġservice Ġcreate Ġarticle , Ġthen Ġservice Ġshould Ġpersist Ġand Ġreturn Ġcorrect ĠArticle Response `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogged In User Ġ= ĠUser Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġarticle Request Ġ= ĠArticle Factory . create (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArticle CreateRequest ( title , Ġdescription , Ġbody , Ġtag List . map Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Entity Ġ= Ġarticle Request . to Entity ( logged In User . username ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Response Ġ= ĠArticle Response . build ( expected Entity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġservice . create ( article Request , Ġlogged In User . username ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . title , Ġactual . title ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . body , Ġactual . body ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . description , Ġactual . description ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . author . username , Ġactual . author . username ) ĊĊĠĠĠĠĠĠĠ Ġverify ( repository ). persist ( any < Article >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġan Ġarticle Ġupdate Ġrequest Ġfor Ġan Ġarticle Ġthat Ġdoes Ġnot Ġexist , Ġwhen Ġservice Ġtries Ġto Ġupdate Ġarticle , Ġthen Ġservice Ġshould Ġthrow ĠArticle NotFoundException `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinvalid Id Ġ= ĠUUID . randomUUID () ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . findById ( invalid Id )). thenReturn ( null ) ĊĊĠĠĠĠĠĠĠ ĠassertThrows < Article NotFoundException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . update ( invalid Id , ĠArticle Update Request ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġan Ġarticle Ġupdate Ġrequest Ġwith Ġa Ġnew Ġtitle , Ġwhen Ġservice Ġupdate Ġarticle , Ġthen Ġservice Ġshould Ġpersist , Ġchange Ġslug , Ġand Ġreturn Ġcorrect ĠArticle Response `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Article Ġ= ĠArticle Factory . create () ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . findById ( existing Article . slug )). thenReturn ( existing Article ) ĊĊĠĠĠĠĠĠĠ Ġval Ġupdate Request Ġ= Ġexisting Article . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArticle Update Request ( title , Ġdescription ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Updated Entity Ġ= Ġupdate Request . apply Changes To ( existing Article ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Response Ġ= ĠArticle Response . build ( expected Updated Entity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġservice . update ( existing Article . slug , Ġupdate Request ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġtitle Ġis Ġupdated , Ġthen Ġa Ġnew Ġslug Ġshould Ġbe Ġgenerated ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( existing Article . slug , Ġactual . slug ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . title , Ġactual . title ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . body , Ġactual . body ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . description , Ġactual . description ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Response . author . username , Ġactual . author . username ) ĊĊĠĠĠĠĠĠĠ Ġverify ( repository ). persist ( any < Article >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġan Ġarticle Ġdelete Ġrequest Ġfor Ġan Ġarticle Ġthat Ġdoes Ġnot Ġexist , Ġwhen Ġservice Ġtries Ġto Ġdelete Ġarticle , Ġthen Ġservice Ġshould Ġthrow ĠArticle NotFoundException `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinvalid Id Ġ= ĠUUID . randomUUID () ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . delete ById ( invalid Id )). thenReturn ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertThrows < Article NotFoundException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . delete ( invalid Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa Ġlogged - in Ġuser Ġthat Ġfollows Ġa Ġset Ġof Ġauthors , Ġwhen Ġfeed Ġis Ġrequested , Ġthen Ġservice Ġshould Ġreturn Ġcorrect ĠArticles Response `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogged In User Ġ= ĠUser Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġarticles With Authors LoggedIn User Follow s Ġ= ĠArticle Factory . create ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . findBy The Authors A User Follow s ( userId Ġ= Ġlogged In User . username )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( articles With Authors LoggedIn User Follow s ) ĊĊĠĠĠĠĠĠĠ Ġarticles With Authors LoggedIn User Follow s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( favorite Relationship Repository . f avor ited Count ( it . slug )). thenReturn ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( favorite Relationship Repository . is F avor ited ( it . slug , Ġlogged In User . username )). thenReturn ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` when `( follow Relationship Repository . is Following ( it . author . username , Ġlogged In User . username )). thenReturn ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( articles , Ġarticles Count ) Ġ= Ġservice . feed ( logged In UserId Ġ= Ġlogged In User . username ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( articles Count , Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġarticles . forEach Indexed Ġ{ Ġindex , Ġarticle Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArticle Response . build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Ġ= Ġarticles With Authors LoggedIn User Follow s [ index ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Count Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis F avor ited Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Following Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa Ġlogged - in Ġuser , Ġwhen Ġa Ġfavorite Ġis Ġqueried Ġto Ġa Ġnon - existing Ġarticle , Ġrepository Ġshould Ġthrow ĠIllegalStateException `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogged In User Ġ= ĠUser Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġsubject ed Article Id Ġ= ĠUUID . randomUUID () ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . exists ( subject ed Article Id )). thenReturn ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . favorite ( subject ed Article Id , Ġlogged In User . username ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa Ġlogged - in Ġuser , Ġwhen Ġan Ġun follow Ġis Ġqueried Ġto Ġa Ġnon - existing Ġarticle , Ġrepository Ġshould Ġthrow ĠIllegalStateException `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogged In User Ġ= ĠUser Factory . create () ĊĠĠĠĠĠĠĠ Ġval Ġsubject ed Article Id Ġ= ĠUUID . randomUUID () ĊĊĠĠĠĠĠĠĠ Ġ` when `( repository . exists ( subject ed Article Id )). thenReturn ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertThrows < IllegalStateException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . un Favorite ( subject ed Article Id , Ġlogged In User . username ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ