From 685701863fb85c1915baad8141f409774811991b Mon Sep 17 00:00:00 2001 From: heejin Date: Mon, 9 Oct 2023 00:40:58 +0900 Subject: [PATCH 1/2] [issue-19-domain] fix: domain test code to coroutine --- .../report/report/service/GetReportService.kt | 2 +- .../folder/service/UpdateFolderServiceTest.kt | 66 -------- .../service/DeleteFolderLinkServiceTest.kt | 74 --------- .../jobgroup/model/JobGroupTest.kt | 8 - .../kotlin/linkpool-v0/link/model/LinkTest.kt | 8 - .../CountUnclassifiedLinkUseCaseTest.kt | 27 ---- .../link/service/GetLinkUseCaseTest.kt | 76 --------- .../link/service/LinkServiceTest.kt | 8 - .../link/service/SearchLinkUseCaseTest.kt | 147 ------------------ .../query/service/UserJobGroupServiceTest.kt | 8 - .../kotlin/linkpool-v0/user/model/UserTest.kt | 103 ------------ .../user/service/SignOutServiceTest.kt | 31 ---- .../user/service/UpdateUserServiceTest.kt | 73 --------- .../link}/folder/model/FolderTest.kt | 2 +- .../folder/service/CreateFolderServiceTest.kt | 58 ++++--- .../folder/service/DeleteFolderServiceTest.kt | 16 +- .../folder/service/UpdateFolderServiceTest.kt | 63 ++++++++ .../service/WithdrawalFolderServiceTest.kt | 11 +- .../link/service/CreateLinkServiceTest.kt | 15 +- .../link/service/DeleteLinkServiceTest.kt} | 34 ++-- .../link/link/service/GetLinkServiceTest.kt | 47 ++++++ .../link/service/UpdateLinkServiceTest.kt} | 23 ++- .../report}/report/fixtures/ReportFixtures.kt | 4 +- .../report}/report/model/ReportTest.kt | 5 +- .../report/service/CreateReportServiceTest.kt | 20 +-- .../report/service/GetReportServiceTest.kt} | 12 +- .../support/BaseTests.kt | 0 .../support/spec/Specs.kt | 0 .../jobgroup/fixtures/JobGroupFixtures.kt | 2 +- .../service/GetJobGroupServiceTest.kt} | 13 +- .../user/service/GetUserServiceTest.kt | 27 ---- .../user}/user/fixtures/UserFixtures.kt | 2 +- .../user/service/CreateUserServiceTest.kt | 29 ++-- .../user}/user/service/GetUserServiceTest.kt | 55 ++----- .../user/user/service/SignOutServiceTest.kt | 38 +++++ .../service/UpdateUserServiceTest.kt | 2 +- 36 files changed, 278 insertions(+), 831 deletions(-) delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/folder/service/UpdateFolderServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/folderlink/service/DeleteFolderLinkServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/jobgroup/model/JobGroupTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/model/LinkTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/CountUnclassifiedLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/GetLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/LinkServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/SearchLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/query/service/UserJobGroupServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/model/UserTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/service/SignOutServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/service/UpdateUserServiceTest.kt rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/link}/folder/model/FolderTest.kt (95%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/link}/folder/service/CreateFolderServiceTest.kt (56%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/link}/folder/service/DeleteFolderServiceTest.kt (57%) create mode 100644 api/domain/src/test/kotlin/linkpool/link/folder/service/UpdateFolderServiceTest.kt rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/link}/folder/service/WithdrawalFolderServiceTest.kt (73%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/link}/link/service/CreateLinkServiceTest.kt (75%) rename api/domain/src/test/kotlin/{linkpool-v0/link/service/DeleteLinkUseCaseTest.kt => linkpool/link/link/service/DeleteLinkServiceTest.kt} (67%) create mode 100644 api/domain/src/test/kotlin/linkpool/link/link/service/GetLinkServiceTest.kt rename api/domain/src/test/kotlin/{linkpool-v0/link/service/UpdateLinkUseCaseTest.kt => linkpool/link/link/service/UpdateLinkServiceTest.kt} (78%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/report}/report/fixtures/ReportFixtures.kt (93%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/report}/report/model/ReportTest.kt (81%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/report}/report/service/CreateReportServiceTest.kt (66%) rename api/domain/src/test/kotlin/{linkpool-v0/report/service/ReportQueryServiceTest.kt => linkpool/report/report/service/GetReportServiceTest.kt} (73%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool}/support/BaseTests.kt (100%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool}/support/spec/Specs.kt (100%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/user}/jobgroup/fixtures/JobGroupFixtures.kt (86%) rename api/domain/src/test/kotlin/{linkpool-v0/jobgroup/service/JobGroupServiceTest.kt => linkpool/user/jobgroup/service/GetJobGroupServiceTest.kt} (83%) delete mode 100644 api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/user}/user/fixtures/UserFixtures.kt (98%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/user}/user/service/CreateUserServiceTest.kt (70%) rename api/domain/src/test/kotlin/{linkpool-v0 => linkpool/user}/user/service/GetUserServiceTest.kt (58%) create mode 100644 api/domain/src/test/kotlin/linkpool/user/user/service/SignOutServiceTest.kt rename api/domain/src/test/kotlin/linkpool/user/{ => user}/service/UpdateUserServiceTest.kt (97%) diff --git a/api/domain/src/main/kotlin/linkpool/report/report/service/GetReportService.kt b/api/domain/src/main/kotlin/linkpool/report/report/service/GetReportService.kt index 8917b25..b5e6804 100644 --- a/api/domain/src/main/kotlin/linkpool/report/report/service/GetReportService.kt +++ b/api/domain/src/main/kotlin/linkpool/report/report/service/GetReportService.kt @@ -9,7 +9,7 @@ import javax.transaction.Transactional @DomainComponent @Transactional -class ReportQueryService( +class GetReportService( private val reportPort: ReportPort, ): GetReportUseCase { override suspend fun getByReportIdAndTargetOrNull(reporterId: Long, target: ReportTarget): Report? { diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/service/UpdateFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/folder/service/UpdateFolderServiceTest.kt deleted file mode 100644 index 15dece0..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/folder/service/UpdateFolderServiceTest.kt +++ /dev/null @@ -1,66 +0,0 @@ -package linkpool.folder.service - -import io.kotest.assertions.throwables.shouldThrow -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.clearAllMocks -import io.mockk.every -import io.mockk.impl.annotations.InjectMockKs -import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import io.mockk.verify -import linkpool.exception.NotAuthorizedForDataException -import linkpool.link.folder.model.Folder -import linkpool.link.folder.port.`in`.UpdateFolderRequest -import linkpool.link.folder.port.out.FolderPort -import linkpool.link.folder.service.UpdateFolderService -import linkpool.user.user.model.User -import linkpool.user.user.service.GetUserService - -class UpdateFolderServiceTest : BehaviorSpec({ - - @MockK - val userUseCase = mockk() - - @MockK - val folderPort = mockk() - - @InjectMockKs - val updateFolderService = UpdateFolderService(userUseCase, folderPort) - - Given("폴더 정보 갱신") { - every { userUseCase.getByUid(any()) } answers { User(id = 1L, uid = "") } - every { folderPort.getById(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } - every { folderPort.update(any(), any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } - When("폴더 정보 갱신을 요청할 경우") { - updateFolderService.update("", 1L, UpdateFolderRequest()) - Then("폴더가 갱신된다.") { - verify(exactly = 1) { - folderPort.getById(any()) - userUseCase.getByUid(any()) - folderPort.update(any(), any()) - } - } - } - And("먼역 내폴더가 아니라면") { - clearAllMocks() - every { userUseCase.getByUid(any()) } answers { User(id = 2L, uid = "") } - every { folderPort.getById(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } - When("폴더 정보 갱신을 요청할 경우") { - val exception = shouldThrow { - updateFolderService.update("", 1L, UpdateFolderRequest()) - } - Then("에러가 반환된다.") { - exception.message shouldBe "해당 정보에 접근권한이 없습니다." - verify(exactly = 1) { - userUseCase.getByUid(any()) - folderPort.getById(any()) - } - verify(exactly = 0) { - folderPort.update(any(), any()) - } - } - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/folderlink/service/DeleteFolderLinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/folderlink/service/DeleteFolderLinkServiceTest.kt deleted file mode 100644 index ab7d357..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/folderlink/service/DeleteFolderLinkServiceTest.kt +++ /dev/null @@ -1,74 +0,0 @@ -package linkpool.folderlink.service - -import io.kotest.assertions.throwables.shouldThrow -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.* -import io.mockk.impl.annotations.InjectMockKs -import io.mockk.impl.annotations.MockK -import linkpool.exception.NotAuthorizedForDataException -import linkpool.link.folder.model.Folder -import linkpool.link.folder.port.`in`.DeleteFolderUseCase -import linkpool.link.folder.port.out.FolderPort -import linkpool.link.folderlink.service.DeleteFolderLinkService -import linkpool.link.link.event.LinkBatchEventPort -import linkpool.user.user.model.User -import linkpool.user.user.service.GetUserService - -class DeleteFolderLinkServiceTest : BehaviorSpec({ - - @MockK - val userUseCase = mockk() - - @MockK - val folderPort = mockk() - - @MockK - val deleteFolderUseCase = mockk() - - @MockK - val linkBatchEvent = mockk() - - - @InjectMockKs - val deleteFolderLinkService = DeleteFolderLinkService(folderPort, userUseCase, deleteFolderUseCase, linkBatchEvent) - - Given("폴더에 속한 링크 삭제") { - every { userUseCase.getByUid(any()) } answers { User(id = 1L, uid = "") } - every { folderPort.getById(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } - justRun { deleteFolderUseCase.delete(any()) } - justRun { linkBatchEvent.processDeleteBatch(any()) } - When("폴더에 속한 링크삭제 함수를 호출할 경우") { - deleteFolderLinkService.delete("", 1L) - Then("해당 함수들이 호출된다") { - verify(exactly = 1) { - folderPort.getById(any()) - userUseCase.getByUid(any()) - linkBatchEvent.processDeleteBatch(any()) - deleteFolderUseCase.delete(any()) - } - } - } - And("만약 내폴더가 아니라면") { - clearAllMocks() - every { userUseCase.getByUid(any()) } answers { User(id = 2L, uid = "") } - every { folderPort.getById(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } - When("폴더에 속한 링크삭제 함수를 호출할 경우") { - val exception = shouldThrow { - deleteFolderLinkService.delete("", 1L) - } - Then("에러가 반환된다.") { - exception.message shouldBe "해당 정보에 접근권한이 없습니다." - verify(exactly = 1) { - folderPort.getById(any()) - userUseCase.getByUid(any()) - } - verify(exactly = 0) { - linkBatchEvent.processDeleteBatch(any()) - deleteFolderUseCase.delete(any()) - } - } - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/jobgroup/model/JobGroupTest.kt b/api/domain/src/test/kotlin/linkpool-v0/jobgroup/model/JobGroupTest.kt deleted file mode 100644 index 7302a3b..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/jobgroup/model/JobGroupTest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package linkpool.jobgroup.model - -import io.kotest.core.spec.style.BehaviorSpec -import org.junit.jupiter.api.Assertions.* - -class JobGroupTest: BehaviorSpec({ - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/model/LinkTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/model/LinkTest.kt deleted file mode 100644 index d79550d..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/link/model/LinkTest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package linkpool.link.model - -import io.kotest.core.spec.style.BehaviorSpec -import org.junit.jupiter.api.Assertions.* - -class LinkTest: BehaviorSpec({ - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/CountUnclassifiedLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/service/CountUnclassifiedLinkUseCaseTest.kt deleted file mode 100644 index dc1a7cb..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/CountUnclassifiedLinkUseCaseTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package linkpool.link.service - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.every -import io.mockk.mockk -import linkpool.link.link.port.out.LinkPort -class CountUnclassifiedLinkUseCaseTest: BehaviorSpec({ - - Given("CountUnclassifiedLinkService") { - val linkPort = mockk() - val countUnclassifiedLinkService = CountUnclassifiedLinkService(linkPort) - - When("countUnClassified 호출 시 LinkPort의 countByUserIdAndFolderIdIsNull 메서드를 호출하면") { - val userId = 1L - val expectedCount = 5 - - every { linkPort.countByUserIdAndFolderIdIsNull(userId) } returns expectedCount - - val result = countUnclassifiedLinkService.countUnClassified(userId) - - Then("LinkPort의 countByUserIdAndFolderIdIsNull 메서드가 호출되고, 예상된 결과를 반환한다") { - result shouldBe expectedCount - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/GetLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/service/GetLinkUseCaseTest.kt deleted file mode 100644 index b11d609..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/GetLinkUseCaseTest.kt +++ /dev/null @@ -1,76 +0,0 @@ -package linkpool.link.service - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify -import linkpool.LinkPoolPage -import linkpool.LinkPoolPageRequest -import linkpool.link.link.model.InflowType -import linkpool.link.link.model.Link -import linkpool.link.link.port.out.LinkPort -import linkpool.link.link.service.GetLinksService -import linkpool.user.user.model.User -import linkpool.user.user.port.`in`.GetUserUseCase - -class GetLinkUseCaseTest: BehaviorSpec({ - Given("GetLinkService") { - val getUserUseCase = mockk() - val linkPort = mockk() - val getLinkService = GetLinksService(getUserUseCase, linkPort) - - When("getByUserId 호출 시 LinkPort의 findPageByUserIdOrderByCreatedDateTimeDesc 메서드를 호출하면") { - val uid = "user123" - val paging = LinkPoolPageRequest(1, 10, 2, 10) - val user = User(id = 1L, uid = uid) - val links = listOf( - Link(creatorId = 1L, url = "https://example.com", title = "Example", inflowType = InflowType.BRING), - Link(creatorId = 2L, url = "https://google.com", title = "Google", inflowType = InflowType.BRING) - ) - - val expectedPage = LinkPoolPage( - page_no = 1, - page_size = 10, - total_count = 2, - total_page = 1, - contents = links - ) - - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.findPageByCreatorIdOrderByCreatedDateTimeDesc(user.id, paging) } returns expectedPage - - val result = getLinkService.getByCreatorId(uid, paging) - - Then("LinkPort의 findPageByUserIdOrderByCreatedDateTimeDesc 메서드가 호출되고, 예상된 결과를 반환한다") { - verify(exactly = 1) { linkPort.findPageByCreatorIdOrderByCreatedDateTimeDesc(user.id, paging) } - result.contents[0].id shouldBe expectedPage.contents[0].id - } - } - - When("getByFolderId 호출 시 LinkPort의 findPageByFolderIdOrderByCreatedDateTimeDesc 메서드를 호출하면") { - val folderId = 1L - val paging = LinkPoolPageRequest(1, 10, 2, 10) - val links = listOf( - Link(creatorId = 1L, url = "https://example.com", title = "Example", inflowType = InflowType.BRING), - Link(creatorId = 2L, url = "https://google.com", title = "Google", inflowType = InflowType.BRING) - ) - val expectedPage = LinkPoolPage( - page_no = 1, - page_size = 10, - total_count = 2, - total_page = 1, - contents = links - ) - - every { linkPort.findPageByFolderIdOrderByCreatedDateTimeDesc(folderId, paging) } returns expectedPage - - val result = getLinkService.getByFolderId(folderId, paging) - - Then("LinkPort의 findPageByFolderIdOrderByCreatedDateTimeDesc 메서드가 호출되고, 예상된 결과를 반환한다") { - verify(exactly = 1) { linkPort.findPageByCreatorIdOrderByCreatedDateTimeDesc(folderId, paging) } - result.contents[0].id shouldBe expectedPage.contents[0].id - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/LinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/service/LinkServiceTest.kt deleted file mode 100644 index 01710b2..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/LinkServiceTest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package linkpool.link.service - -import io.kotest.core.spec.style.BehaviorSpec -import org.junit.jupiter.api.Assertions.* - -class LinkServiceTest: BehaviorSpec({ - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/SearchLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/service/SearchLinkUseCaseTest.kt deleted file mode 100644 index f7200b1..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/SearchLinkUseCaseTest.kt +++ /dev/null @@ -1,147 +0,0 @@ -package linkpool.link.service - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.clearAllMocks -import io.mockk.every -import io.mockk.mockk -import linkpool.LinkPoolPage -import linkpool.LinkPoolPageRequest -import linkpool.user.jobgroup.model.JobGroup -import linkpool.user.jobgroup.port.`in`.JobGroupQuery -import linkpool.link.link.model.InflowType -import linkpool.link.link.model.Link -import linkpool.link.link.port.out.LinkPort -import linkpool.user.user.model.User -import linkpool.user.user.model.Profile -import linkpool.user.user.port.`in`.GetUserUseCase - -class SearchLinkUseCaseTest: BehaviorSpec({ - val linkPort = mockk() - val getUserUseCase = mockk() - val jobGroupQuery = mockk() - - val searchLinkUseCase = SearchLinkService(getUserUseCase, jobGroupQuery, linkPort) - - afterContainer { - clearAllMocks() - } - Given("링크가 3개 주어지고") { - val uid = "12345" - val keyword = "피파" - var myLinksOnly: Boolean = false - val links = listOf( - Link( - id = 1, - creatorId = 1, - title = "피파 온라인의 굴리트의 사기성", - describe = "중앙에 굴리트 무조건 하나 넣어야 하는 게임", - url = "링크 URL 1", - folderId = 0L, - inflowType = InflowType.BRING - ), - Link( - id = 2, - creatorId = 1, - title = "피파에서는 킹한민국이 월드컵 우승 쌉가능함", - describe = "박주영이 홀란드보다 좋은게 말이되냐", - url = "링크 URL 2", - folderId = 0L, - inflowType = InflowType.BRING - ), - Link( - id = 3, - creatorId = 2, - title = "피파에서는 킹한민국이 월드컵 우승 쌉가능함", - describe = "12박주영이 홀란드보다 좋은게 말이되냐", - url = "링크 URL 2", - folderId = 0L, - inflowType = InflowType.BRING - ) - ) - - val paging = LinkPoolPageRequest( - page_no = 1, - page_size = 10, - total_count = 2, - total_page = 1 - ) - val linkPoolPage = LinkPoolPage( - page_no = paging.page_no, - page_size = paging.page_size, - total_count = paging.total_count, - total_page = paging.total_page, - contents = links - ) - - val me = User( - id = 1L, - uid = uid, - profile = Profile( - nickname = "대훈", - jobGroupId = 2L - ) - ) - - val user = User( - id = 2L, - uid = "56789", - profile = Profile( - nickname = "다른 사람", - jobGroupId = 2L - ) - ) - - val myJob = JobGroup( - id = 0L, - name ="대훈" - ) - - And("myLinksOnly가 참일 때") { - myLinksOnly = true - every { getUserUseCase.getByUid(uid) } returns me - every { jobGroupQuery.getById(me.profile!!.jobGroupId) } returns myJob - every { linkPort.findPageByUserIdAndTitleContains(1, keyword, paging) } returns linkPoolPage.copy(contents = listOf(links[0], links[1])) - - When("링크를 조회하면") { - val result = searchLinkUseCase.searchByKeyword(myLinksOnly, uid, keyword, paging) - - Then("아래와 결과를 반환해야 합니다.") { - result.contents.size shouldBe 2 - result.contents[0].id shouldBe 1 - result.contents[0].user.id shouldBe 1 - - result.contents[1].id shouldBe 2 - result.contents[1].user.id shouldBe 1 - - } - } - } - - And("myLinksOnly가 거짓일 때") { - myLinksOnly = false - every { getUserUseCase.getByUid(uid) } returns me - every { getUserUseCase.getById(1) } returns me - every { getUserUseCase.getById(2) } returns user - every { jobGroupQuery.getById(me.profile!!.jobGroupId) } returns myJob - every { linkPort.findPageByTitleContains( keyword, me.id, paging) } returns linkPoolPage - - When("링크를 조회하면") { - val result = searchLinkUseCase.searchByKeyword(myLinksOnly, uid, keyword, paging) - - Then("아래와 같은 결과를 반환해야 합니다.") { - result.contents.size shouldBe 3 - result.contents[0].id shouldBe 1 - result.contents[0].user.id shouldBe 1 - - result.contents[1].id shouldBe 2 - result.contents[1].user.id shouldBe 1 - - result.contents[2].id shouldBe 3 - result.contents[2].user.id shouldBe 2 - } - } - } - } - } -) diff --git a/api/domain/src/test/kotlin/linkpool-v0/query/service/UserJobGroupServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/query/service/UserJobGroupServiceTest.kt deleted file mode 100644 index 428c08b..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/query/service/UserJobGroupServiceTest.kt +++ /dev/null @@ -1,8 +0,0 @@ -package linkpool.query.service - -import io.kotest.core.spec.style.BehaviorSpec -import org.junit.jupiter.api.Assertions.* - -class UserJobGroupServiceTest: BehaviorSpec({ - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/model/UserTest.kt b/api/domain/src/test/kotlin/linkpool-v0/user/model/UserTest.kt deleted file mode 100644 index 32209a1..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/user/model/UserTest.kt +++ /dev/null @@ -1,103 +0,0 @@ -package linkpool.user.model - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe -import io.mockk.clearAllMocks -import linkpool.support.spec.afterRootTest -import linkpool.user.fixtures.createUser -import linkpool.user.fixtures.createUserInfoRequest -import linkpool.user.fixtures.createUserInformation -import linkpool.user.fixtures.createUserWithoutInfo - -class UserTest: BehaviorSpec({ - - Given("활성화된 유저에 대해서") { - val user = createUser() - When("비활성화를 하면") { - user.signOut() - Then("프로필 정보가 삭제되고 유저가 비활성화된다") { - user.profile shouldBe null - user.isNotActivated() shouldBe true - } - } - } - - Given("비활성화된 유저에 대해서") { - val user = createUser(deleted = true) - When("활성화를 하면") { - user.activate() - Then("유저가 활성화된다") { - user.isActivated() shouldBe true - } - } - } - - Given("프로필이 있는 유저에 대해서") { - val user1 = createUser() - val user2 = createUser() - val user3 = createUser() - When("프로필 정보를 주고 수정하면") { - val userInfoRequestWithNickname = - createUserInfoRequest(nickname = "사용자2", jobGroupId = null, profileImage = null) - val userInfoRequestWithJobGroupId = - createUserInfoRequest(nickname = null, jobGroupId = 2L, profileImage = null) - val userInfoRequestWithProfileImage = - createUserInfoRequest(nickname = null, jobGroupId = null, profileImage = "02") - user1.updateProfile(userInfoRequestWithNickname) - user2.updateProfile(userInfoRequestWithJobGroupId) - user3.updateProfile(userInfoRequestWithProfileImage) - Then("요청한 정보만 수정되고 나머지는 기존을 유지한다") { - user1.profile!!.nickname shouldBe userInfoRequestWithNickname.nickname - user1.profile!!.jobGroupId shouldBe createUser().profile!!.jobGroupId - user1.profile!!.profileImage shouldBe createUser().profile!!.profileImage - user2.profile!!.nickname shouldBe createUser().profile!!.nickname - user2.profile!!.jobGroupId shouldBe userInfoRequestWithJobGroupId.jobGroupId - user2.profile!!.profileImage shouldBe createUser().profile!!.profileImage - user3.profile!!.nickname shouldBe createUser().profile!!.nickname - user3.profile!!.jobGroupId shouldBe createUser().profile!!.jobGroupId - user3.profile!!.profileImage shouldBe userInfoRequestWithProfileImage.profileImage - } - } - } - - - Given("프로필이 없는 유저에 대해서") { - When("프로필 정보 생성 여부를 확인하면") { - val user = createUserWithoutInfo() - val result = user.checkInfoCreated() - Then("false가 리턴된다") { - result shouldBe false - } - } - - When("완전한 정보를 주고 프로필을 생성하면") { - val user = createUserWithoutInfo() - val userInfo = createUserInformation() - user.createProfile(userInfo) - Then("요청 정보대로 프로필이 생성된다") { - user.profile shouldNotBe null - user.profile!!.nickname shouldBe userInfo.nickname - user.profile!!.jobGroupId shouldBe userInfo.jobGroupId - user.profile!!.profileImage shouldBe userInfo.profileImage - } - } - - When("완전한 정보를 주고 프로필을 수정하면") { - val user = createUserWithoutInfo() - val userInfoRequest = createUserInfoRequest() - user.updateProfile(userInfoRequest) - Then("요청 정보대로 프로필이 생성된다") { - user.profile shouldNotBe null - user.profile!!.nickname shouldBe userInfoRequest.nickname - user.profile!!.jobGroupId shouldBe userInfoRequest.jobGroupId - user.profile!!.profileImage shouldBe userInfoRequest.profileImage - } - } - } - - afterRootTest { - clearAllMocks() - } - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/service/SignOutServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/user/service/SignOutServiceTest.kt deleted file mode 100644 index 249e7e9..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/user/service/SignOutServiceTest.kt +++ /dev/null @@ -1,31 +0,0 @@ -package linkpool.user.service - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.* -import linkpool.support.spec.afterRootTest -import linkpool.user.fixtures.createUser -import linkpool.user.user.port.out.UserPort -import linkpool.user.user.service.SignOutService - -class SignOutServiceTest: BehaviorSpec({ - val userPort = mockk() - val signOutService = SignOutService(userPort) - - Given("활성화된 회원 일 경우") { - val user = createUser(deleted = false) - every { userPort.patch(any()) } just Runs - When("회원 탈퇴를 하면") { - signOutService.signOut(user) - Then("회원 정보가 폐기되고 비활성화된다") { - user.profile shouldBe null - verify { userPort.patch(user) } - } - } - } - - afterRootTest { - clearAllMocks() - } - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/service/UpdateUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/user/service/UpdateUserServiceTest.kt deleted file mode 100644 index d925022..0000000 --- a/api/domain/src/test/kotlin/linkpool-v0/user/service/UpdateUserServiceTest.kt +++ /dev/null @@ -1,73 +0,0 @@ -package linkpool.user.service - -import io.kotest.assertions.throwables.shouldNotThrow -import io.kotest.assertions.throwables.shouldThrow -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.* -import linkpool.exception.DuplicateNicknameException -import linkpool.support.spec.afterRootTest -import linkpool.user.fixtures.createUser -import linkpool.user.fixtures.createUserInfoRequest -import linkpool.user.user.port.out.UserPort -import linkpool.user.user.service.UpdateUserService - -class UpdateUserServiceTest: BehaviorSpec({ - val userPort = mockk() - val updateUserService = UpdateUserService(userPort) - - Given("수정하려하는 닉네임이 이미 존재하는 닉네임인 경우") { - val user = createUser() - val userInfoRequest = createUserInfoRequest() - every { userPort.existsByNickname(userInfoRequest.nickname!!) } returns true - - When("닉네임을 포함하여 프로필 수정을 하면") { - Then("DuplicateNicknameException 예외가 발생한다") { - shouldThrow { - updateUserService.updateProfile(user, userInfoRequest) - } - } - } - } - - Given("수정하려하는 닉네임이 중복되지 않는 닉네임인 경우") { - val user = createUser() - val userInfoRequest = createUserInfoRequest() - every { userPort.existsByNickname(userInfoRequest.nickname!!) } returns false - every { userPort.patch(any()) } just Runs - - When("닉네임을 포함하여 프로필 수정을 하면") { - Then("DuplicateNicknameException 예외가 발생하지 않고, 프로필이 수정된다.") { - shouldNotThrow { - updateUserService.updateProfile(user, userInfoRequest) - } - user.profile!!.nickname shouldBe userInfoRequest.nickname - user.profile!!.jobGroupId shouldBe userInfoRequest.jobGroupId - user.profile!!.profileImage shouldBe userInfoRequest.profileImage - verify { userPort.patch(user) } - } - } - } - - Given("닉네임 정보를 제외한 다른 정보만 수정하는 경우") { - val user = createUser() - val userInfoRequest = createUserInfoRequest(nickname = null) - every { userPort.patch(any()) } just Runs - - When("프로필 수정을 하면") { - val originalNickName = user.profile!!.nickname - updateUserService.updateProfile(user, userInfoRequest) - Then("요청한 정보만 수정된다.") { - user.profile!!.nickname shouldBe originalNickName - user.profile!!.jobGroupId shouldBe userInfoRequest.jobGroupId - user.profile!!.profileImage shouldBe userInfoRequest.profileImage - verify { userPort.patch(user) } - } - } - } - - afterRootTest { - clearAllMocks() - } - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt b/api/domain/src/test/kotlin/linkpool/link/folder/model/FolderTest.kt similarity index 95% rename from api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt rename to api/domain/src/test/kotlin/linkpool/link/folder/model/FolderTest.kt index a03d95d..112856e 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/folder/model/FolderTest.kt @@ -1,4 +1,4 @@ -package linkpool.folder.model +package linkpool.link.folder.model import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/folder/service/CreateFolderServiceTest.kt similarity index 56% rename from api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/link/folder/service/CreateFolderServiceTest.kt index ed3c68e..841ed99 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/folder/service/CreateFolderServiceTest.kt @@ -1,20 +1,16 @@ -package linkpool.folder.service +package linkpool.link.folder.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe -import io.mockk.clearAllMocks -import io.mockk.every +import io.mockk.* import io.mockk.impl.annotations.InjectMockKs import io.mockk.impl.annotations.MockK -import io.mockk.mockk -import io.mockk.verify import linkpool.exception.DuplicateFolderNameException import linkpool.link.folder.model.Folder import linkpool.link.folder.port.`in`.SaveFolderRequest import linkpool.link.folder.port.out.FolderPort -import linkpool.link.folder.service.CreateFolderService -import linkpool.user.user.model.User +import linkpool.support.spec.afterRootTest import linkpool.user.user.service.GetUserService import java.time.LocalDateTime @@ -27,37 +23,33 @@ class CreateFolderServiceTest : BehaviorSpec({ val folderPort = mockk() @InjectMockKs - val createFolderService = CreateFolderService(userUseCase, folderPort) + val createFolderService = CreateFolderService(folderPort) Given("폴더 저장") { - every { userUseCase.getByUid(any()) } answers { User(id = 1L, uid = "") } - every { folderPort.save(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } - every { folderPort.existsByOwnerIdAndName(any(), any()) } answers { false } + coEvery { folderPort.save(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } + coEvery { folderPort.existsByOwnerIdAndName(any(), any()) } answers { false } When("폴더 저장함수을 요청할 경우") { - createFolderService.create("", createSaveFolderRequest()) + createFolderService.create(1L, createSaveFolderRequest()) Then("폴더가 저장된다.") { - verify { folderPort.save(any()) } - verify { userUseCase.getByUid(any()) } - every { folderPort.existsByOwnerIdAndName(any(), any()) } + coVerify { folderPort.save(any()) } } } - And("이미 폴더가 존재할 경우") { - clearAllMocks() - every { userUseCase.getByUid(any()) } answers { User(id = 1L, uid = "") } - every { folderPort.existsByOwnerIdAndName(any(), any()) } answers { true } - When("폴더 저장을 요청할 경우") { - val exception = shouldThrow { - createFolderService.create("", createSaveFolderRequest()) + } + + + Given("이미 폴더가 존재할 경우") { + coEvery { folderPort.existsByOwnerIdAndName(any(), any()) } answers { true } + When("폴더 저장을 요청할 경우") { + val exception = shouldThrow { + createFolderService.create(1L, createSaveFolderRequest()) + } + Then("예외를 던진다.") { + exception.message shouldBe "이미 등록된 폴더명입니다." + coVerify(exactly = 1) { + folderPort.existsByOwnerIdAndName(any(), any()) } - Then("예외를 던진다.") { - exception.message shouldBe "이미 등록된 폴더명입니다." - verify(exactly = 1) { - folderPort.existsByOwnerIdAndName(any(), any()) - userUseCase.getByUid(any()) - } - verify(exactly = 0) { - folderPort.save(any()) - } + coVerify(exactly = 0) { + folderPort.save(any()) } } } @@ -82,6 +74,10 @@ class CreateFolderServiceTest : BehaviorSpec({ // } // } // } + + afterRootTest { + clearAllMocks() + } }) private fun createSaveFolderRequest() = SaveFolderRequest("name", true, LocalDateTime.now()) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/service/DeleteFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/folder/service/DeleteFolderServiceTest.kt similarity index 57% rename from api/domain/src/test/kotlin/linkpool-v0/folder/service/DeleteFolderServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/link/folder/service/DeleteFolderServiceTest.kt index 6493a54..22c8d4a 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/folder/service/DeleteFolderServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/folder/service/DeleteFolderServiceTest.kt @@ -1,13 +1,14 @@ -package linkpool.folder.service +package linkpool.link.folder.service import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.coEvery +import io.mockk.coJustRun +import io.mockk.coVerify import io.mockk.impl.annotations.InjectMockKs import io.mockk.impl.annotations.MockK -import io.mockk.justRun import io.mockk.mockk -import io.mockk.verify +import linkpool.link.folder.model.Folder import linkpool.link.folder.port.out.FolderPort -import linkpool.link.folder.service.DeleteFolderService class DeleteFolderServiceTest : BehaviorSpec({ @@ -18,11 +19,12 @@ class DeleteFolderServiceTest : BehaviorSpec({ val deleteFolderService = DeleteFolderService(folderPort) Given("폴더 삭제") { - justRun { folderPort.softDelete(any()) } + coEvery { folderPort.getById(any()) } returns Folder(ownerId = 1L, name = "hwjeon") + coJustRun { folderPort.softDelete(any()) } When("폴더 삭제를 요청할 경우 하면") { - deleteFolderService.delete(1L) + deleteFolderService.delete(1L, 1L) Then("폴더가 삭제된다.") { - verify { folderPort.softDelete(any()) } + coVerify { folderPort.softDelete(any()) } } } } diff --git a/api/domain/src/test/kotlin/linkpool/link/folder/service/UpdateFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/folder/service/UpdateFolderServiceTest.kt new file mode 100644 index 0000000..0ab379c --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool/link/folder/service/UpdateFolderServiceTest.kt @@ -0,0 +1,63 @@ +package linkpool.link.folder.service + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.* +import io.mockk.impl.annotations.InjectMockKs +import io.mockk.impl.annotations.MockK +import linkpool.exception.NotAuthorizedForDataException +import linkpool.link.folder.model.Folder +import linkpool.link.folder.port.`in`.UpdateFolderRequest +import linkpool.link.folder.port.out.FolderPort +import linkpool.support.spec.afterRootTest +import linkpool.user.user.model.User +import linkpool.user.user.service.GetUserService + +class UpdateFolderServiceTest : BehaviorSpec({ + + @MockK + val userUseCase = mockk() + + @MockK + val folderPort = mockk() + + @InjectMockKs + val updateFolderService = UpdateFolderService(folderPort) + + Given("폴더 정보 갱신") { + coEvery { folderPort.getById(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } + coEvery { folderPort.update(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } + When("폴더 정보 갱신을 요청할 경우") { + updateFolderService.update(1L, 1L, UpdateFolderRequest()) + Then("폴더가 갱신된다.") { + coVerify(exactly = 1) { + folderPort.getById(any()) + folderPort.update(any()) + } + } + } + } + + Given("만약 내폴더가 아니라면") { + coEvery { folderPort.getById(any()) } answers { Folder(ownerId = 1L, name = "hwjeon") } + When("폴더 정보 갱신을 요청할 경우") { + val exception = shouldThrow { + updateFolderService.update(2L, 1L, UpdateFolderRequest()) + } + Then("에러가 반환된다.") { + exception.message shouldBe "해당 정보에 접근권한이 없습니다." + coVerify(exactly = 1) { + folderPort.getById(any()) + } + coVerify(exactly = 0) { + folderPort.update(any()) + } + } + } + } + + afterRootTest { + clearAllMocks() + } +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/service/WithdrawalFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/folder/service/WithdrawalFolderServiceTest.kt similarity index 73% rename from api/domain/src/test/kotlin/linkpool-v0/folder/service/WithdrawalFolderServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/link/folder/service/WithdrawalFolderServiceTest.kt index 468ad7b..2de45ec 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/folder/service/WithdrawalFolderServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/folder/service/WithdrawalFolderServiceTest.kt @@ -1,13 +1,12 @@ -package linkpool.folder.service +package linkpool.link.folder.service import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.coJustRun +import io.mockk.coVerify import io.mockk.impl.annotations.InjectMockKs import io.mockk.impl.annotations.MockK -import io.mockk.justRun import io.mockk.mockk -import io.mockk.verify import linkpool.link.folder.port.out.FolderPort -import linkpool.link.folder.service.WithdrawalFolderService import linkpool.user.user.model.UserSignedOutEvent class WithdrawalFolderServiceTest : BehaviorSpec({ @@ -19,11 +18,11 @@ class WithdrawalFolderServiceTest : BehaviorSpec({ val withdrawalFolderService = WithdrawalFolderService(folderPort) Given("회원 탈퇴시 폴더 삭제") { - justRun { folderPort.softDeleteAll(any()) } + coJustRun { folderPort.softDeleteAll(any()) } When("폴더 삭제를 요청할 경우") { withdrawalFolderService.deleteAll(UserSignedOutEvent(1L)) Then("폴더가 삭제된다") { - verify { folderPort.softDeleteAll(any()) } + coVerify { folderPort.softDeleteAll(any()) } } } } diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/CreateLinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/link/service/CreateLinkServiceTest.kt similarity index 75% rename from api/domain/src/test/kotlin/linkpool-v0/link/service/CreateLinkServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/link/link/service/CreateLinkServiceTest.kt index fb156db..195fb82 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/CreateLinkServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/link/service/CreateLinkServiceTest.kt @@ -1,4 +1,4 @@ -package linkpool.link.service +package linkpool.link.link.service import io.kotest.core.spec.style.BehaviorSpec import io.mockk.* @@ -6,16 +6,15 @@ import linkpool.link.link.model.InflowType import linkpool.link.link.model.Link import linkpool.link.link.port.`in`.SaveLinkRequest import linkpool.link.link.port.out.LinkPort -import linkpool.link.link.service.CreateLinkService import linkpool.user.user.model.User import linkpool.user.user.port.`in`.GetUserUseCase import java.time.LocalDateTime -class CreateLinkUseCaseTest: BehaviorSpec({ +class CreateLinkServiceTest: BehaviorSpec({ val linkPort = mockk() val getUserUseCase = mockk() - val createLinkUseCase = CreateLinkService(getUserUseCase, linkPort) + val createLinkService = CreateLinkService(linkPort) afterContainer { clearAllMocks() @@ -45,15 +44,13 @@ class CreateLinkUseCaseTest: BehaviorSpec({ inflowType = request.inflowType ?: InflowType.CREATE ) - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.save(any()) } returns link - + coEvery { linkPort.save(any()) } returns link When("요청을 보낼 시") { - createLinkUseCase.create(uid, request) + createLinkService.create(1L, request) Then("링크가 저장이 된다") { - verify(exactly = 1) { linkPort.save(any()) } + coVerify(exactly = 1) { linkPort.save(any()) } } } } diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/DeleteLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/link/service/DeleteLinkServiceTest.kt similarity index 67% rename from api/domain/src/test/kotlin/linkpool-v0/link/service/DeleteLinkUseCaseTest.kt rename to api/domain/src/test/kotlin/linkpool/link/link/service/DeleteLinkServiceTest.kt index de83e62..b6ff4ae 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/DeleteLinkUseCaseTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/link/service/DeleteLinkServiceTest.kt @@ -1,4 +1,4 @@ -package linkpool.link.service +package linkpool.link.link.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec @@ -8,25 +8,22 @@ import linkpool.exception.NotAuthorizedForDataException import linkpool.link.link.model.InflowType import linkpool.link.link.model.Link import linkpool.link.link.port.out.LinkPort -import linkpool.link.port.out.getById -import linkpool.link.link.service.DeleteLinkService import linkpool.user.user.model.User import linkpool.user.user.model.Profile import linkpool.user.user.port.`in`.GetUserUseCase -class DeleteLinkUseCaseTest: BehaviorSpec({ +class DeleteLinkServiceTest: BehaviorSpec({ - val getUserUseCase = mockk() val linkPort = mockk() - val deleteLinkUseCase = DeleteLinkService(getUserUseCase, linkPort) + val deleteLinkService = DeleteLinkService(linkPort) Given("링크 삭제 서비스") { - val uid = "사용자 ID" - val linkId = 1L + val userId = 1L + val linkId = 2L When("링크를 삭제하면") { val user = User( - id = 1L, + id = userId, uid = "사용자 ID", profile = Profile( nickname = "대훈", @@ -34,7 +31,7 @@ class DeleteLinkUseCaseTest: BehaviorSpec({ ) ) val link = Link( - id = 2L, + id = linkId, creatorId = 1, title = "링크 제목", describe = "링크 설명", @@ -43,10 +40,10 @@ class DeleteLinkUseCaseTest: BehaviorSpec({ inflowType = InflowType.BRING ) - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link + coEvery { linkPort.findById(linkId) } returns link + coJustRun { linkPort.delete(link) } - deleteLinkUseCase.delete(uid, linkId) + deleteLinkService.delete(userId, linkId) Then("링크가 삭제된다.") { link.isDeleted() shouldBe true @@ -72,24 +69,23 @@ class DeleteLinkUseCaseTest: BehaviorSpec({ inflowType = InflowType.BRING ) - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link + coEvery { linkPort.findById(linkId) } returns link Then("NotAuthorizedForDataException이 throw되어야 함") { shouldThrow { - deleteLinkUseCase.delete(uid, linkId) + deleteLinkService.delete(2L, linkId) } } } When("폴더에 속한 링크를 일괄 삭제하면") { val folderId = 1L - every { linkPort.deleteBatchByFolderId(folderId) } just runs + coEvery { linkPort.deleteBatchByFolderId(folderId) } just runs - deleteLinkUseCase.deleteByFolder(folderId) + deleteLinkService.deleteByFolder(folderId) Then("폴더에 속한 링크가 일괄 삭제되어야 함") { - verify(exactly = 1) { linkPort.deleteBatchByFolderId(folderId) } + coVerify (exactly = 1) { linkPort.deleteBatchByFolderId(folderId) } } } } diff --git a/api/domain/src/test/kotlin/linkpool/link/link/service/GetLinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/link/service/GetLinkServiceTest.kt new file mode 100644 index 0000000..065c45f --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool/link/link/service/GetLinkServiceTest.kt @@ -0,0 +1,47 @@ +package linkpool.link.link.service + +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.* +import linkpool.LinkPoolPage +import linkpool.LinkPoolPageRequest +import linkpool.link.link.model.InflowType +import linkpool.link.link.model.Link +import linkpool.link.link.port.out.LinkPort +import linkpool.link.link.service.GetLinksService +import linkpool.user.user.model.User +import linkpool.user.user.port.`in`.GetUserUseCase + +class GetLinkServiceTest: BehaviorSpec({ + Given("GetLinkService") { + val linkPort = mockk() + val getLinkService = GetLinksService(linkPort) + + When("getByUserId 호출 시 LinkPort의 findPageByUserIdOrderByCreatedDateTimeDesc 메서드를 호출하면") { + val uid = "user123" + val paging = LinkPoolPageRequest(1, 10) + val user = User(id = 1L, uid = uid) + val links = listOf( + Link(creatorId = 1L, url = "https://example.com", title = "Example", inflowType = InflowType.BRING), + Link(creatorId = 2L, url = "https://google.com", title = "Google", inflowType = InflowType.BRING) + ) + + val expectedPage = LinkPoolPage( + page_no = 1, + page_size = 10, + total_count = 2, + total_page = 1, + contents = links + ) + + coEvery { linkPort.findPageByCreatorIdOrderByCreatedDateTimeDesc(user.id, paging) } returns expectedPage + + val result = getLinkService.getByCreatorId(1L, paging) + + Then("LinkPort의 findPageByUserIdOrderByCreatedDateTimeDesc 메서드가 호출되고, 예상된 결과를 반환한다") { + coVerify (exactly = 1) { linkPort.findPageByCreatorIdOrderByCreatedDateTimeDesc(user.id, paging) } + result.contents[0].id shouldBe expectedPage.contents[0].id + } + } + } +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/link/service/UpdateLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/link/service/UpdateLinkServiceTest.kt similarity index 78% rename from api/domain/src/test/kotlin/linkpool-v0/link/service/UpdateLinkUseCaseTest.kt rename to api/domain/src/test/kotlin/linkpool/link/link/service/UpdateLinkServiceTest.kt index bc6b126..6965ac4 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/link/service/UpdateLinkUseCaseTest.kt +++ b/api/domain/src/test/kotlin/linkpool/link/link/service/UpdateLinkServiceTest.kt @@ -1,27 +1,25 @@ -package linkpool.link.service +package linkpool.link.link.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import io.mockk.clearAllMocks -import io.mockk.every +import io.mockk.coEvery +import io.mockk.coJustRun import io.mockk.mockk import linkpool.exception.NotAuthorizedForDataException import linkpool.link.link.model.InflowType import linkpool.link.link.model.Link import linkpool.link.link.port.`in`.UpdateLinkRequest import linkpool.link.link.port.out.LinkPort -import linkpool.link.port.out.getById import linkpool.link.link.service.UpdateLinkService import linkpool.user.user.model.User import linkpool.user.user.model.Profile -import linkpool.user.user.port.`in`.GetUserUseCase -class UpdateLinkUseCaseTest: BehaviorSpec({ +class UpdateLinkServiceTest: BehaviorSpec({ val linkPort = mockk() - val getUserUseCase = mockk() - val updateLinkUseCase = UpdateLinkService(getUserUseCase, linkPort) + val updateLinkUseCase = UpdateLinkService(linkPort) afterContainer { clearAllMocks() @@ -56,10 +54,10 @@ class UpdateLinkUseCaseTest: BehaviorSpec({ inflowType = InflowType.BRING ) - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link + coEvery { linkPort.findById(linkId) } returns link + coJustRun { linkPort.update(link) } - updateLinkUseCase.update(uid, linkId, request) + updateLinkUseCase.update(1L, linkId, request) Then("링크 정보가 업데이트되어야 한다") { link.url shouldBe "새로운 URL" @@ -88,12 +86,11 @@ class UpdateLinkUseCaseTest: BehaviorSpec({ inflowType = InflowType.BRING ) - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link + coEvery { linkPort.findById(linkId) } returns link Then("CustomException이 throw되어야 한다") { shouldThrow { - updateLinkUseCase.update(uid, linkId, request) + updateLinkUseCase.update(2L, linkId, request) } } } diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/fixtures/ReportFixtures.kt b/api/domain/src/test/kotlin/linkpool/report/report/fixtures/ReportFixtures.kt similarity index 93% rename from api/domain/src/test/kotlin/linkpool-v0/report/fixtures/ReportFixtures.kt rename to api/domain/src/test/kotlin/linkpool/report/report/fixtures/ReportFixtures.kt index a066333..fef5492 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/report/fixtures/ReportFixtures.kt +++ b/api/domain/src/test/kotlin/linkpool/report/report/fixtures/ReportFixtures.kt @@ -1,9 +1,7 @@ -package linkpool.report.fixtures +package linkpool.report.report.fixtures -import linkpool.report.model.* import linkpool.report.report.model.* import linkpool.report.report.port.`in`.CreateReportRequest -import linkpool.report2.report.model.* import java.time.LocalDateTime const val REPORT_OTHER_REASON: String = "기타 사유" diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt b/api/domain/src/test/kotlin/linkpool/report/report/model/ReportTest.kt similarity index 81% rename from api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt rename to api/domain/src/test/kotlin/linkpool/report/report/model/ReportTest.kt index ecb7552..d12078c 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt +++ b/api/domain/src/test/kotlin/linkpool/report/report/model/ReportTest.kt @@ -1,11 +1,10 @@ -package linkpool.report.model +package linkpool.report.report.model import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import io.mockk.clearAllMocks -import linkpool.report.fixtures.createReport +import linkpool.report.report.fixtures.createReport import linkpool.support.spec.afterRootTest -import org.junit.jupiter.api.Assertions.* class ReportTest: BehaviorSpec({ diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt b/api/domain/src/test/kotlin/linkpool/report/report/service/CreateReportServiceTest.kt similarity index 66% rename from api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/report/report/service/CreateReportServiceTest.kt index b7f67d4..f7b393b 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/report/report/service/CreateReportServiceTest.kt @@ -1,16 +1,14 @@ -package linkpool.report.service +package linkpool.report.report.service import io.kotest.assertions.throwables.shouldNotThrow import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec import io.mockk.* import linkpool.exception.DuplicateReportException -import linkpool.report.fixtures.createCreateReportRequest -import linkpool.report.fixtures.createReport +import linkpool.report.report.fixtures.createCreateReportRequest +import linkpool.report.report.fixtures.createReport import linkpool.report.report.port.out.ReportPort -import linkpool.report.report.service.CreateReportService import linkpool.support.spec.afterRootTest -import linkpool.user.fixtures.createUser class CreateReportServiceTest: BehaviorSpec({ val reportPort = mockk() @@ -18,13 +16,12 @@ class CreateReportServiceTest: BehaviorSpec({ Given("신고자와 대상이 동일한 신고 정보가 아마 등록되어있는 경우") { val report = createReport() - every { reportPort.findByReporterIdAndTarget(any(), any()) } returns report + coEvery { reportPort.findByReporterIdAndTarget(any(), any()) } returns report When("신고를 등록하면") { - val user = createUser() val createReportRequest = createCreateReportRequest() Then("DuplicateReportException 예외가 발생한다") { shouldThrow { - createReportService.create(user, createReportRequest) + createReportService.create(1L, createReportRequest) } } } @@ -32,15 +29,14 @@ class CreateReportServiceTest: BehaviorSpec({ Given("신고자와 대상이 동일한 신고 정보가 아마 등록되어있지 않은 경우") { val report = createReport() - every { reportPort.findByReporterIdAndTarget(any(), any()) } returns null - every { reportPort.save(any()) } returns report + coEvery { reportPort.findByReporterIdAndTarget(any(), any()) } returns null + coEvery { reportPort.save(any()) } returns report When("신고를 등록하면") { - val user = createUser() val createReportRequest = createCreateReportRequest() Then("예외가 발생하지 않고 신고가 등록된다") { shouldNotThrow { - createReportService.create(user, createReportRequest) + createReportService.create(1L, createReportRequest) } } } diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt b/api/domain/src/test/kotlin/linkpool/report/report/service/GetReportServiceTest.kt similarity index 73% rename from api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/report/report/service/GetReportServiceTest.kt index 8d3599e..7840c01 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/report/report/service/GetReportServiceTest.kt @@ -1,22 +1,22 @@ -package linkpool.report.service +package linkpool.report.report.service import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import io.mockk.clearAllMocks -import io.mockk.every +import io.mockk.coEvery import io.mockk.mockk -import linkpool.report.fixtures.createReport -import linkpool.report.fixtures.createReportTarget +import linkpool.report.report.fixtures.createReport +import linkpool.report.report.fixtures.createReportTarget import linkpool.report.report.port.out.ReportPort import linkpool.support.spec.afterRootTest -class ReportQueryServiceTest : BehaviorSpec({ +class GetReportServiceTest : BehaviorSpec({ val reportPort = mockk() val reportQueryService = GetReportService(reportPort) Given("어떤 신고 정보에 대해서") { val report = createReport() - every { reportPort.findByReporterIdAndTarget(any(), any()) } returns report + coEvery { reportPort.findByReporterIdAndTarget(any(), any()) } returns report When("신고자와 신고대상을 이용하여 조회하면") { val reportTarget = createReportTarget() val selected = reportQueryService.getByReportIdAndTargetOrNull(1L, reportTarget) diff --git a/api/domain/src/test/kotlin/linkpool-v0/support/BaseTests.kt b/api/domain/src/test/kotlin/linkpool/support/BaseTests.kt similarity index 100% rename from api/domain/src/test/kotlin/linkpool-v0/support/BaseTests.kt rename to api/domain/src/test/kotlin/linkpool/support/BaseTests.kt diff --git a/api/domain/src/test/kotlin/linkpool-v0/support/spec/Specs.kt b/api/domain/src/test/kotlin/linkpool/support/spec/Specs.kt similarity index 100% rename from api/domain/src/test/kotlin/linkpool-v0/support/spec/Specs.kt rename to api/domain/src/test/kotlin/linkpool/support/spec/Specs.kt diff --git a/api/domain/src/test/kotlin/linkpool-v0/jobgroup/fixtures/JobGroupFixtures.kt b/api/domain/src/test/kotlin/linkpool/user/jobgroup/fixtures/JobGroupFixtures.kt similarity index 86% rename from api/domain/src/test/kotlin/linkpool-v0/jobgroup/fixtures/JobGroupFixtures.kt rename to api/domain/src/test/kotlin/linkpool/user/jobgroup/fixtures/JobGroupFixtures.kt index 4ff207b..c62fdbf 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/jobgroup/fixtures/JobGroupFixtures.kt +++ b/api/domain/src/test/kotlin/linkpool/user/jobgroup/fixtures/JobGroupFixtures.kt @@ -1,4 +1,4 @@ -package linkpool.jobgroup.fixtures +package linkpool.user.jobgroup.fixtures import linkpool.user.jobgroup.model.JobGroup diff --git a/api/domain/src/test/kotlin/linkpool-v0/jobgroup/service/JobGroupServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/jobgroup/service/GetJobGroupServiceTest.kt similarity index 83% rename from api/domain/src/test/kotlin/linkpool-v0/jobgroup/service/JobGroupServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/user/jobgroup/service/GetJobGroupServiceTest.kt index 547e215..76c1466 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/jobgroup/service/JobGroupServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/user/jobgroup/service/GetJobGroupServiceTest.kt @@ -1,28 +1,29 @@ -package linkpool.jobgroup.service +package linkpool.user.jobgroup.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.shouldBe import io.mockk.clearAllMocks +import io.mockk.coEvery import io.mockk.every import io.mockk.mockk import linkpool.exception.DataNotFoundException -import linkpool.jobgroup.fixtures.createJobGroup +import linkpool.user.jobgroup.fixtures.createJobGroup import linkpool.user.jobgroup.port.out.JobGroupPort import linkpool.support.spec.afterRootTest import linkpool.user.jobgroup.service.JobGroupQueryService -class JobGroupQueryServiceTest: BehaviorSpec({ +class GetJobGroupServiceTest: BehaviorSpec({ val jobGroupPort = mockk() val jobGroupQueryService = JobGroupQueryService(jobGroupPort) Given("직업군이 1개 이상 등록되어 있을 경우") { val jobGroup1 = createJobGroup(id = 1) val jobGroup2 = createJobGroup(id = 2) - every { jobGroupPort.findAll() } returns listOf(jobGroup1, jobGroup2) - every { jobGroupPort.findById(1L) } returns jobGroup1 - every { jobGroupPort.findById(3L) } returns null + coEvery { jobGroupPort.findAll() } returns listOf(jobGroup1, jobGroup2) + coEvery { jobGroupPort.findById(1L) } returns jobGroup1 + coEvery { jobGroupPort.findById(3L) } returns null When("직업군을 모두 조회하면") { val all = jobGroupQueryService.getAll() diff --git a/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt deleted file mode 100644 index 0bd4b8e..0000000 --- a/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package linkpool.user.service - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.coEvery -import io.mockk.mockk -import linkpool.user.user.model.Profile -import linkpool.user.user.model.User -import linkpool.user.user.port.out.UserPort -import linkpool.user.user.service.GetUserService - -class GetUserServiceTest: BehaviorSpec({ - val userPort = mockk() - val getUseService = GetUserService(userPort) - val user = User( - 1L, "uid-1234", Profile("강대훈", 1L) - ) - Given("단순한 유저 조회 테스트 ㅇㅅㅇ") { - coEvery { userPort.findById(1L) } returns user - When("1번 유저를 조회하면") { - val result = getUseService.getById(1L) - Then("강대훈이라는 닉네임을 가진 유저가 호출된다.") { - result.profile?.nickname shouldBe "강대훈" - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/fixtures/UserFixtures.kt b/api/domain/src/test/kotlin/linkpool/user/user/fixtures/UserFixtures.kt similarity index 98% rename from api/domain/src/test/kotlin/linkpool-v0/user/fixtures/UserFixtures.kt rename to api/domain/src/test/kotlin/linkpool/user/user/fixtures/UserFixtures.kt index a5ab38a..51fb910 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/user/fixtures/UserFixtures.kt +++ b/api/domain/src/test/kotlin/linkpool/user/user/fixtures/UserFixtures.kt @@ -1,4 +1,4 @@ -package linkpool.user.fixtures +package linkpool.user.user.fixtures import linkpool.user.user.model.User import linkpool.user.user.model.Profile diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/service/CreateUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/user/service/CreateUserServiceTest.kt similarity index 70% rename from api/domain/src/test/kotlin/linkpool-v0/user/service/CreateUserServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/user/user/service/CreateUserServiceTest.kt index 6453258..caafcba 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/user/service/CreateUserServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/user/user/service/CreateUserServiceTest.kt @@ -1,27 +1,30 @@ -package linkpool.user.service +package linkpool.user.user.service import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import io.mockk.* import linkpool.support.spec.afterRootTest -import linkpool.user.fixtures.USER_UID -import linkpool.user.fixtures.createUser -import linkpool.user.fixtures.createUserWithoutInfo +import linkpool.user.user.fixtures.USER_UID +import linkpool.user.user.fixtures.createUser +import linkpool.user.user.fixtures.createUserWithoutInfo +import linkpool.user.user.port.out.UserAuthPort import linkpool.user.user.port.out.UserPort import linkpool.user.user.service.CreateUserService class CreateUserServiceTest: BehaviorSpec({ val userPort = mockk() - val signUpService = CreateUserService(userPort) + val authPort = mockk() + val signUpService = CreateUserService(userPort, authPort) Given("한번도 회원가입한 적 없는 유저인 경우") { val user = createUserWithoutInfo() - every { userPort.findByUidIncludingDeleted(USER_UID) } returns null - every { userPort.save(any()) } returns user + coEvery { userPort.findByUidIncludingDeleted(USER_UID) } returns null + coEvery { userPort.save(any()) } returns user + coJustRun { authPort.setUserId(any(), any()) } When("회원 가입을 하면") { val response = signUpService.createUser(USER_UID) Then("유저가 저장되고 ID가 부여되며 새로운 유저임이 표시된다") { - verify { userPort.save(any()) } + coVerify { userPort.save(any()) } response.id shouldBe user.id response.isNew shouldBe true } @@ -30,7 +33,7 @@ class CreateUserServiceTest: BehaviorSpec({ Given("회원가입이 완료된 유저인 경우") { val user = createUser() - every { userPort.findByUidIncludingDeleted(USER_UID) } returns user + coEvery { userPort.findByUidIncludingDeleted(USER_UID) } returns user When("회원 가입을 하면") { val response = signUpService.createUser(USER_UID) @@ -43,7 +46,7 @@ class CreateUserServiceTest: BehaviorSpec({ Given("회원가입은 되었으나 프로필이 생성되지 않은 유저일 경우") { val user = createUserWithoutInfo() - every { userPort.findByUidIncludingDeleted(USER_UID) } returns user + coEvery { userPort.findByUidIncludingDeleted(USER_UID) } returns user When("회원 가입을 하면") { val response = signUpService.createUser(USER_UID) Then("해당 유저의 ID 값을 전해주나, 새로운 유저임이 표시된다") { @@ -55,13 +58,13 @@ class CreateUserServiceTest: BehaviorSpec({ Given("회원탈퇴를 완료한 유저일 경우") { val user = createUserWithoutInfo(deleted = true) - every { userPort.findByUidIncludingDeleted(USER_UID) } returns user - every { userPort.patch(any()) } just Runs + coEvery { userPort.findByUidIncludingDeleted(USER_UID) } returns user + coEvery { userPort.patch(any()) } just Runs When("회원 가입을 하면") { val response = signUpService.createUser(USER_UID) Then("해당 유저를 활성화하고, 해당 ID 값을 전해주며, 새로운 유저임이 표시된다") { user.isActivated() shouldBe true - verify { userPort.patch(user) } + coVerify { userPort.patch(user) } response.id shouldBe user.id response.isNew shouldBe true } diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/user/service/GetUserServiceTest.kt similarity index 58% rename from api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/user/user/service/GetUserServiceTest.kt index 432d015..efa6726 100644 --- a/api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/user/user/service/GetUserServiceTest.kt @@ -1,50 +1,34 @@ -package linkpool.user.service +package linkpool.user.user.service import io.kotest.assertions.throwables.shouldThrow import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe import io.mockk.clearAllMocks -import io.mockk.every +import io.mockk.coEvery import io.mockk.mockk import linkpool.exception.DataNotFoundException import linkpool.exception.NotSignedUpException import linkpool.support.spec.afterRootTest -import linkpool.user.fixtures.USER_NICKNAME -import linkpool.user.fixtures.USER_UID -import linkpool.user.fixtures.createUser -import linkpool.user.fixtures.createUserWithoutInfo +import linkpool.user.user.fixtures.USER_NICKNAME +import linkpool.user.user.fixtures.createUser +import linkpool.user.user.fixtures.createUserWithoutInfo import linkpool.user.user.port.out.UserPort -import linkpool.user.user.service.GetUserService class GetUserServiceTest: BehaviorSpec({ val userPort = mockk() val userQueryService = GetUserService(userPort) Given("조회하고자 하는 유저가 없을 경우") { - every { userPort.findById(any()) } returns null - every { userPort.findByUid(any()) } returns null + coEvery { userPort.findById(any()) } returns null + coEvery { userPort.findByUid(any()) } returns null - When("uid를 이용하여 nullable 유저를 조회하면") { - val user = userQueryService.getByUidOrNull(USER_UID) - Then("null이 리턴된다") { - user shouldBe null - } - } When("id를 이용하여 nullable 유저를 조회하면") { val user = userQueryService.getByIdOrNull(1L) Then("null이 리턴된다") { user shouldBe null } } - When("uid를 이용하여 유저를 조회하면") { - Then("예외가 발생한다") { - shouldThrow { - userQueryService.getByUid(USER_UID) - } - } - } When("id를 이용하여 유저를 조회하면") { - Then("예외가 발생한다") { shouldThrow { userQueryService.getById(1L) @@ -55,16 +39,9 @@ class GetUserServiceTest: BehaviorSpec({ Given("조회하고자 하는 유저가 프로필이 생성되지 않았을 경우") { val userWithoutInfo = createUserWithoutInfo() - every { userPort.findById(any()) } returns userWithoutInfo - every { userPort.findByUid(any()) } returns userWithoutInfo + coEvery { userPort.findById(any()) } returns userWithoutInfo + coEvery { userPort.findByUid(any()) } returns userWithoutInfo - When("uid를 이용하여 유저를 조회하면") { - Then("NotSignedUpException 예외가 발생한다") { - shouldThrow { - userQueryService.getByUid(USER_UID) - } - } - } When("id를 이용하여 유저를 조회") { Then("NotSignedUpException 예외가 발생한다") { shouldThrow { @@ -76,15 +53,9 @@ class GetUserServiceTest: BehaviorSpec({ Given("조회하고자 하는 유저가 프로필이 생성되어있을 경우") { val userWithInfo = createUser() - every { userPort.findById(any()) } returns userWithInfo - every { userPort.findByUid(any()) } returns userWithInfo + coEvery { userPort.findById(any()) } returns userWithInfo + coEvery { userPort.findByUid(any()) } returns userWithInfo - When("uid를 이용하여 유저를 조회하면") { - val user = userQueryService.getByUid(USER_UID) - Then("해당 유저가 리턴된다") { - user shouldBe userWithInfo - } - } When("id를 이용하여 유저를 조회하면") { val user = userQueryService.getById(1L) Then("해당 유저가 리턴된다") { @@ -94,7 +65,7 @@ class GetUserServiceTest: BehaviorSpec({ } Given("확인하고자 하는 닉네임이 존재하지 않는 경우") { - every { userPort.existsByNickname(any()) } returns false + coEvery { userPort.existsByNickname(any()) } returns false When("닉네임을 존재 여부를 확인하면") { val result = userQueryService.existsByNickname(USER_NICKNAME) @@ -105,7 +76,7 @@ class GetUserServiceTest: BehaviorSpec({ } Given("확인하고자 하는 닉네임이 존재하는 경우") { - every { userPort.existsByNickname(any()) } returns true + coEvery { userPort.existsByNickname(any()) } returns true When("닉네임을 존재 여부를 확인하면") { val result = userQueryService.existsByNickname(USER_NICKNAME) diff --git a/api/domain/src/test/kotlin/linkpool/user/user/service/SignOutServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/user/service/SignOutServiceTest.kt new file mode 100644 index 0000000..4978a6f --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool/user/user/service/SignOutServiceTest.kt @@ -0,0 +1,38 @@ +package linkpool.user.user.service + +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.* +import linkpool.support.spec.afterRootTest +import linkpool.user.user.fixtures.createUser +import linkpool.user.user.port.`in`.GetUserUseCase +import linkpool.user.user.port.out.UserEventPublishPort +import linkpool.user.user.port.out.UserPort +import linkpool.user.user.service.SignOutService + +class SignOutServiceTest: BehaviorSpec({ + val getUserUseCase = mockk() + val userPort = mockk() + val userEventPublishPort = mockk() + + val signOutService = SignOutService(getUserUseCase, userPort, userEventPublishPort) + + Given("활성화된 회원 일 경우") { + val user = createUser(deleted = false) + coEvery { getUserUseCase.getById(any()) } returns user + coEvery { userPort.patch(any()) } just Runs + coJustRun { userEventPublishPort.publishUserSignedOutEvent(any()) } + When("회원 탈퇴를 하면") { + signOutService.signOut(1L) + Then("회원 정보가 폐기되고 비활성화된다") { + user.profile shouldBe null + coVerify { userPort.patch(user) } + } + } + } + + afterRootTest { + clearAllMocks() + } + +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/user/service/UpdateUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/user/service/UpdateUserServiceTest.kt similarity index 97% rename from api/domain/src/test/kotlin/linkpool/user/service/UpdateUserServiceTest.kt rename to api/domain/src/test/kotlin/linkpool/user/user/service/UpdateUserServiceTest.kt index 2f91f19..49469ed 100644 --- a/api/domain/src/test/kotlin/linkpool/user/service/UpdateUserServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/user/user/service/UpdateUserServiceTest.kt @@ -1,4 +1,4 @@ -package linkpool.user.service +package linkpool.user.user.service import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe From e2149b8fcbe45cc63757799f35ffc9fdd091bee9 Mon Sep 17 00:00:00 2001 From: heejin Date: Mon, 9 Oct 2023 00:45:44 +0900 Subject: [PATCH 2/2] [issue-19-domain] del: useless files --- .../port/in/DeleteFolderLinkUseCase.kt | 5 -- .../folderlink/port/in/LinkBatchEventPort.kt | 7 --- .../service/DeleteFolderLinkService.kt | 49 ------------------- 3 files changed, 61 deletions(-) delete mode 100644 api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/DeleteFolderLinkUseCase.kt delete mode 100644 api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/LinkBatchEventPort.kt delete mode 100644 api/domain/src/main/kotlin/linkpool/link/folderlink/service/DeleteFolderLinkService.kt diff --git a/api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/DeleteFolderLinkUseCase.kt b/api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/DeleteFolderLinkUseCase.kt deleted file mode 100644 index ca543d5..0000000 --- a/api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/DeleteFolderLinkUseCase.kt +++ /dev/null @@ -1,5 +0,0 @@ -package linkpool.link.folderlink.port.`in` - -interface DeleteFolderLinkUseCase { - suspend fun delete(userId: Long, folderId: Long) -} \ No newline at end of file diff --git a/api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/LinkBatchEventPort.kt b/api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/LinkBatchEventPort.kt deleted file mode 100644 index 4874999..0000000 --- a/api/domain/src/main/kotlin/linkpool/link/folderlink/port/in/LinkBatchEventPort.kt +++ /dev/null @@ -1,7 +0,0 @@ -package linkpool.link.folderlink.port.`in` - -class LinkBatchEventPort { - fun processDeleteBatch(folderId: Long) { - TODO("Not yet implemented") - } -} \ No newline at end of file diff --git a/api/domain/src/main/kotlin/linkpool/link/folderlink/service/DeleteFolderLinkService.kt b/api/domain/src/main/kotlin/linkpool/link/folderlink/service/DeleteFolderLinkService.kt deleted file mode 100644 index ad4a0dd..0000000 --- a/api/domain/src/main/kotlin/linkpool/link/folderlink/service/DeleteFolderLinkService.kt +++ /dev/null @@ -1,49 +0,0 @@ -package linkpool.link.folderlink.service - -import linkpool.common.DomainComponent -import linkpool.exception.NotAuthorizedForDataException -import linkpool.link.folder.port.`in`.DeleteFolderUseCase -import linkpool.link.folder.port.out.FolderPort -import linkpool.link.folderlink.port.`in`.DeleteFolderLinkUseCase -import javax.transaction.Transactional - -@DomainComponent -@Transactional -class DeleteFolderLinkService( - private val folderPort: FolderPort, - private val deleteFolderUseCase: DeleteFolderUseCase, -) : DeleteFolderLinkUseCase { - - override suspend fun delete(userId: Long, folderId: Long) { - val folder = folderPort.getById(folderId) - - if(!folder.isOwner(userId)) { - throw NotAuthorizedForDataException() - } - - deleteFolderUseCase.delete(userId, folderId) - - /** - * 링크 삭제 처리를 별도의 프로세스에서 진행한다. - * - * 폴더 당 최대 링크수 제한이 없으므로, 링크건수가 많을 경우 링크삭제 프로세스에서 병목이 발생될 수 있다. - * 링크개수 제한정책에 따라서 'Async + 개별스레드' 또는 별도의 애플리케이션에서 동작하도록 개발이 필요하다. - * @author : 전현우 - * @since : 1.0 (2023.06.20) - */ - - /** - * 인프라 단에서 논블록킹으로 구현한다. - * 이벤트 형태로 구현할 필요 없어보임 - * 배치 이벤트를 인프라로보내는 것이 아닌, delete 됬다라는 이벤트를 링크 도메인 으로 넘겨서 거기서 컨숨. - * 케밥 개힘듬 - * Folder domain -> call delete action to link domain -> action delete batch in link infra - * linkPort.processDeleteBatch("") - * @author : 전현우 - * @since : 2.0 (2023.07.15) - * - */ - -// linkBatchEvent.processDeleteBatch(folderId) - } -} \ No newline at end of file