From 97c7e9710cfe699d36b3cbb230b19f53cf623688 Mon Sep 17 00:00:00 2001 From: daehoon12 Date: Sat, 16 Sep 2023 20:29:37 +0900 Subject: [PATCH 1/5] [issue-19] test: add UpdateUserServiceTest, GetUserServiceTest --- .../user/service/GetUserServiceTest.kt | 120 ++---------------- .../user/service/UpdateUserServiceTest.kt | 92 +++++--------- 2 files changed, 46 insertions(+), 166 deletions(-) diff --git a/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt index 432d015..0bd4b8e 100644 --- a/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/user/service/GetUserServiceTest.kt @@ -1,121 +1,27 @@ package linkpool.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.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 userQueryService = GetUserService(userPort) - - Given("조회하고자 하는 유저가 없을 경우") { - every { userPort.findById(any()) } returns null - every { 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) - } + 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 "강대훈" } } } - - Given("조회하고자 하는 유저가 프로필이 생성되지 않았을 경우") { - val userWithoutInfo = createUserWithoutInfo() - every { userPort.findById(any()) } returns userWithoutInfo - every { userPort.findByUid(any()) } returns userWithoutInfo - - When("uid를 이용하여 유저를 조회하면") { - Then("NotSignedUpException 예외가 발생한다") { - shouldThrow { - userQueryService.getByUid(USER_UID) - } - } - } - When("id를 이용하여 유저를 조회") { - Then("NotSignedUpException 예외가 발생한다") { - shouldThrow { - userQueryService.getById(1L) - } - } - } - } - - Given("조회하고자 하는 유저가 프로필이 생성되어있을 경우") { - val userWithInfo = createUser() - every { userPort.findById(any()) } returns userWithInfo - every { 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("해당 유저가 리턴된다") { - user shouldBe userWithInfo - } - } - } - - Given("확인하고자 하는 닉네임이 존재하지 않는 경우") { - every { userPort.existsByNickname(any()) } returns false - - When("닉네임을 존재 여부를 확인하면") { - val result = userQueryService.existsByNickname(USER_NICKNAME) - Then("false가 리턴된다") { - result shouldBe false - } - } - } - - Given("확인하고자 하는 닉네임이 존재하는 경우") { - every { userPort.existsByNickname(any()) } returns true - - When("닉네임을 존재 여부를 확인하면") { - val result = userQueryService.existsByNickname(USER_NICKNAME) - Then("true가 리턴된다") { - result shouldBe true - } - } - } - - 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/service/UpdateUserServiceTest.kt index d925022..2f91f19 100644 --- a/api/domain/src/test/kotlin/linkpool/user/service/UpdateUserServiceTest.kt +++ b/api/domain/src/test/kotlin/linkpool/user/service/UpdateUserServiceTest.kt @@ -1,73 +1,47 @@ 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 io.mockk.Runs +import io.mockk.coEvery +import io.mockk.just +import io.mockk.mockk +import linkpool.user.user.model.Profile +import linkpool.user.user.model.User +import linkpool.user.user.port.`in`.GetUserUseCase +import linkpool.user.user.port.`in`.ProfileRequest +import linkpool.user.user.port.`in`.UpdateUserUseCase import linkpool.user.user.port.out.UserPort +import linkpool.user.user.service.GetUserService 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) + val getUserUseCase = mockk() + + val getUseService = UpdateUserService(userPort, getUserUseCase) + Given("유저 업데이트 테스트") { + val user = User( + 1L, "uid-1234", Profile("강대훈", 1L) + ) + + val updateProfileRequest = ProfileRequest( + "대훈", + 2L, + "주황버섯.jpg" + ) + coEvery { getUserUseCase.getById(1L) } returns user + coEvery { userPort.existsByNickname(updateProfileRequest.nickname!!) } returns false + coEvery { userPort.patch(user) } just Runs + + When("PK가 1이고 닉네임이 '강대훈'인 유저를 업데이트하면") { + getUseService.updateProfile(1L, updateProfileRequest) + Then("닉네임이 '대훈'으로 변경된다.") { + user.profile?.let { it -> + it.nickname shouldBe "대훈" + it.profileImage shouldBe "주황버섯.jpg" } - 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 From 6d22d4fe02f99e8a24a741a365b7f69136538397 Mon Sep 17 00:00:00 2001 From: daehoon12 Date: Sat, 16 Sep 2023 20:30:59 +0900 Subject: [PATCH 2/5] [issue-19] fix: delete old test code --- .../linkpool/folder/model/FolderTest.kt | 28 ---- .../folder/service/CreateFolderServiceTest.kt | 87 ----------- .../folder/service/DeleteFolderServiceTest.kt | 29 ---- .../folder/service/UpdateFolderServiceTest.kt | 66 -------- .../service/WithdrawalFolderServiceTest.kt | 30 ---- .../service/DeleteFolderLinkServiceTest.kt | 74 --------- .../jobgroup/fixtures/JobGroupFixtures.kt | 16 -- .../linkpool/jobgroup/model/JobGroupTest.kt | 8 - .../jobgroup/service/JobGroupServiceTest.kt | 60 ------- .../kotlin/linkpool/link/model/LinkTest.kt | 8 - .../CountUnclassifiedLinkUseCaseTest.kt | 27 ---- .../link/service/CreateLinkServiceTest.kt | 63 -------- .../link/service/DeleteLinkUseCaseTest.kt | 96 ------------ .../link/service/GetLinkUseCaseTest.kt | 76 --------- .../linkpool/link/service/LinkServiceTest.kt | 8 - .../link/service/SearchLinkUseCaseTest.kt | 147 ------------------ .../link/service/UpdateLinkUseCaseTest.kt | 101 ------------ .../query/service/UserJobGroupServiceTest.kt | 8 - .../report/fixtures/ReportFixtures.kt | 57 ------- .../linkpool/report/model/ReportTest.kt | 25 --- .../report/service/CreateReportServiceTest.kt | 52 ------- .../report/service/ReportQueryServiceTest.kt | 32 ---- .../test/kotlin/linkpool/support/BaseTests.kt | 14 -- .../kotlin/linkpool/support/spec/Specs.kt | 19 --- .../linkpool/user/fixtures/UserFixtures.kt | 74 --------- .../kotlin/linkpool/user/model/UserTest.kt | 103 ------------ .../user/service/CreateUserServiceTest.kt | 75 --------- .../user/service/SignOutServiceTest.kt | 31 ---- 28 files changed, 1414 deletions(-) delete mode 100644 api/domain/src/test/kotlin/linkpool/folder/model/FolderTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/folder/service/CreateFolderServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/folder/service/DeleteFolderServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/folder/service/UpdateFolderServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/folder/service/WithdrawalFolderServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/folderlink/service/DeleteFolderLinkServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/jobgroup/fixtures/JobGroupFixtures.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/jobgroup/model/JobGroupTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/jobgroup/service/JobGroupServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/model/LinkTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/CountUnclassifiedLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/CreateLinkServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/DeleteLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/GetLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/LinkServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/SearchLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/link/service/UpdateLinkUseCaseTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/query/service/UserJobGroupServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/report/fixtures/ReportFixtures.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/report/model/ReportTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/report/service/CreateReportServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/report/service/ReportQueryServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/support/BaseTests.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/support/spec/Specs.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/user/fixtures/UserFixtures.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/user/model/UserTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/user/service/CreateUserServiceTest.kt delete mode 100644 api/domain/src/test/kotlin/linkpool/user/service/SignOutServiceTest.kt diff --git a/api/domain/src/test/kotlin/linkpool/folder/model/FolderTest.kt b/api/domain/src/test/kotlin/linkpool/folder/model/FolderTest.kt deleted file mode 100644 index a03d95d..0000000 --- a/api/domain/src/test/kotlin/linkpool/folder/model/FolderTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -package linkpool.folder.model - -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import linkpool.link.folder.model.Folder - -class FolderTest : BehaviorSpec({ - Given("폴더의 주인이 아닌 경우") { - val other = 2L - val otherFolder = Folder(ownerId = 1L, name = "") - When("내 폴더인지 확인하면 ") { - val result = otherFolder.isOwner(other) - Then("`FALSE`가 반환된다.") { - result shouldBe false - } - } - And("폴더의 주인인 경우") { - val me = 1L - val myFolder = Folder(ownerId = 1L, name = "") - When("내 폴더인지 확인하면 ") { - val result = myFolder.isOwner(me) - Then("`TRUE`가 반환된다.") { - result shouldBe true - } - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/folder/service/CreateFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/folder/service/CreateFolderServiceTest.kt deleted file mode 100644 index ed3c68e..0000000 --- a/api/domain/src/test/kotlin/linkpool/folder/service/CreateFolderServiceTest.kt +++ /dev/null @@ -1,87 +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.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.user.user.service.GetUserService -import java.time.LocalDateTime - -class CreateFolderServiceTest : BehaviorSpec({ - - @MockK - val userUseCase = mockk() - - @MockK - val folderPort = mockk() - - @InjectMockKs - val createFolderService = CreateFolderService(userUseCase, 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 } - When("폴더 저장함수을 요청할 경우") { - createFolderService.create("", createSaveFolderRequest()) - Then("폴더가 저장된다.") { - verify { folderPort.save(any()) } - verify { userUseCase.getByUid(any()) } - every { folderPort.existsByOwnerIdAndName(any(), 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()) - } - Then("예외를 던진다.") { - exception.message shouldBe "이미 등록된 폴더명입니다." - verify(exactly = 1) { - folderPort.existsByOwnerIdAndName(any(), any()) - userUseCase.getByUid(any()) - } - verify(exactly = 0) { - folderPort.save(any()) - } - } - } - } - } -// Given("폴더 저장시 이미 존재하는 폴더의 경우") { -//// every { folderPort.existsByUserIdAndName(any(), any()) } answers { true } -//// every { userUseCase.getByUid(any()) } answers { User(id = 1L, uid = "") } -// When("폴더 저장함수가 호출될 경우 예외가 발생한다.") { -// val exception = shouldThrow { -// createFolderService.create("", SaveFolderRequest("name", true, LocalDateTime.now())) -// } -// Then("이때 에러는 NotAuthorizedForDataException 이다.") { -// exception.message shouldNotBe null -// exception.message shouldBe "이미 등록된 폴더명입니다." -// verify(exactly = 1) { -// folderPort.existsByUserIdAndName(any(), any()) -// userUseCase.getByUid(any()) -// } -// verify(exactly = 0) { -// folderPort.existsByUserIdAndName(any(), any()) -// } -// } -// } -// } -}) - -private fun createSaveFolderRequest() = SaveFolderRequest("name", true, LocalDateTime.now()) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/folder/service/DeleteFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/folder/service/DeleteFolderServiceTest.kt deleted file mode 100644 index 6493a54..0000000 --- a/api/domain/src/test/kotlin/linkpool/folder/service/DeleteFolderServiceTest.kt +++ /dev/null @@ -1,29 +0,0 @@ -package linkpool.folder.service - -import io.kotest.core.spec.style.BehaviorSpec -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.DeleteFolderService - -class DeleteFolderServiceTest : BehaviorSpec({ - - @MockK - val folderPort = mockk() - - @InjectMockKs - val deleteFolderService = DeleteFolderService(folderPort) - - Given("폴더 삭제") { - justRun { folderPort.softDelete(any()) } - When("폴더 삭제를 요청할 경우 하면") { - deleteFolderService.delete(1L) - Then("폴더가 삭제된다.") { - verify { folderPort.softDelete(any()) } - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/folder/service/UpdateFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/folder/service/UpdateFolderServiceTest.kt deleted file mode 100644 index 15dece0..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/folder/service/WithdrawalFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool/folder/service/WithdrawalFolderServiceTest.kt deleted file mode 100644 index 468ad7b..0000000 --- a/api/domain/src/test/kotlin/linkpool/folder/service/WithdrawalFolderServiceTest.kt +++ /dev/null @@ -1,30 +0,0 @@ -package linkpool.folder.service - -import io.kotest.core.spec.style.BehaviorSpec -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({ - - @MockK - val folderPort = mockk() - - @InjectMockKs - val withdrawalFolderService = WithdrawalFolderService(folderPort) - - Given("회원 탈퇴시 폴더 삭제") { - justRun { folderPort.softDeleteAll(any()) } - When("폴더 삭제를 요청할 경우") { - withdrawalFolderService.deleteAll(UserSignedOutEvent(1L)) - Then("폴더가 삭제된다") { - verify { folderPort.softDeleteAll(any()) } - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/folderlink/service/DeleteFolderLinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool/folderlink/service/DeleteFolderLinkServiceTest.kt deleted file mode 100644 index ab7d357..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/jobgroup/fixtures/JobGroupFixtures.kt b/api/domain/src/test/kotlin/linkpool/jobgroup/fixtures/JobGroupFixtures.kt deleted file mode 100644 index 4ff207b..0000000 --- a/api/domain/src/test/kotlin/linkpool/jobgroup/fixtures/JobGroupFixtures.kt +++ /dev/null @@ -1,16 +0,0 @@ -package linkpool.jobgroup.fixtures - -import linkpool.user.jobgroup.model.JobGroup - -const val JOB_GROUP_NAME: String = "개발자" - -fun createJobGroup( - id: Long = 1L, - name: String = JOB_GROUP_NAME -): JobGroup { - return JobGroup( - id = id, - name = name, - ) -} - diff --git a/api/domain/src/test/kotlin/linkpool/jobgroup/model/JobGroupTest.kt b/api/domain/src/test/kotlin/linkpool/jobgroup/model/JobGroupTest.kt deleted file mode 100644 index 7302a3b..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/jobgroup/service/JobGroupServiceTest.kt b/api/domain/src/test/kotlin/linkpool/jobgroup/service/JobGroupServiceTest.kt deleted file mode 100644 index 547e215..0000000 --- a/api/domain/src/test/kotlin/linkpool/jobgroup/service/JobGroupServiceTest.kt +++ /dev/null @@ -1,60 +0,0 @@ -package linkpool.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.every -import io.mockk.mockk -import linkpool.exception.DataNotFoundException -import linkpool.jobgroup.fixtures.createJobGroup -import linkpool.user.jobgroup.port.out.JobGroupPort -import linkpool.support.spec.afterRootTest -import linkpool.user.jobgroup.service.JobGroupQueryService - -class JobGroupQueryServiceTest: 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 - - When("직업군을 모두 조회하면") { - val all = jobGroupQueryService.getAll() - Then("존재하는 모든 직업군이 조회된다") { - all shouldContainAll listOf(jobGroup1,jobGroup2) - } - } - - When("유효한 ID를 이용하여 직업군을 조회하면") { - val jobGroup = jobGroupQueryService.getById(1L) - Then("해당 ID를 가진 직업군이 조회된다") { - jobGroup shouldBe jobGroup1 - } - } - - When("유효하지 않은 ID를 이용하여 nullable 직업군을 조회하면") { - val jobGroup = jobGroupQueryService.getByIdOrNull(3L) - Then("null이 리턴된다") { - jobGroup shouldBe null - } - } - - When("유효하지 않은 ID를 이용하여 직업군을 조회하면") { - Then("예외가 발생한다") { - shouldThrow { - jobGroupQueryService.getById(3L) - } - } - } - } - - afterRootTest { - clearAllMocks() - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/link/model/LinkTest.kt b/api/domain/src/test/kotlin/linkpool/link/model/LinkTest.kt deleted file mode 100644 index d79550d..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/link/service/CountUnclassifiedLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/CountUnclassifiedLinkUseCaseTest.kt deleted file mode 100644 index dc1a7cb..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/link/service/CreateLinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/CreateLinkServiceTest.kt deleted file mode 100644 index fb156db..0000000 --- a/api/domain/src/test/kotlin/linkpool/link/service/CreateLinkServiceTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -package linkpool.link.service - -import io.kotest.core.spec.style.BehaviorSpec -import io.mockk.* -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({ - val linkPort = mockk() - val getUserUseCase = mockk() - - val createLinkUseCase = CreateLinkService(getUserUseCase, linkPort) - - afterContainer { - clearAllMocks() - } - Given("링크 저장 유즈케이스에") { - val uid = "12345" - val user = User( - uid = uid - ) - - val request = SaveLinkRequest( - url = "linkpool.co.kr", - title = "링크풀임", - describe = null, - image = null, - folderId = 1, - inflowType = InflowType.CREATE - ) - val link = Link( - creatorId = user.id, - url = request.url, - title = request.title, - describe = request.describe, - image = request.image, - folderId = request.folderId, - createdDateTime = request.createdAt ?: LocalDateTime.now(), - inflowType = request.inflowType ?: InflowType.CREATE - ) - - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.save(any()) } returns link - - - When("요청을 보낼 시") { - createLinkUseCase.create(uid, request) - - Then("링크가 저장이 된다") { - verify(exactly = 1) { linkPort.save(any()) } - } - } - } -} -) { - -} diff --git a/api/domain/src/test/kotlin/linkpool/link/service/DeleteLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/DeleteLinkUseCaseTest.kt deleted file mode 100644 index de83e62..0000000 --- a/api/domain/src/test/kotlin/linkpool/link/service/DeleteLinkUseCaseTest.kt +++ /dev/null @@ -1,96 +0,0 @@ -package linkpool.link.service - -import io.kotest.assertions.throwables.shouldThrow -import io.kotest.core.spec.style.BehaviorSpec -import io.kotest.matchers.shouldBe -import io.mockk.* -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({ - - val getUserUseCase = mockk() - val linkPort = mockk() - val deleteLinkUseCase = DeleteLinkService(getUserUseCase, linkPort) - - Given("링크 삭제 서비스") { - val uid = "사용자 ID" - val linkId = 1L - - When("링크를 삭제하면") { - val user = User( - id = 1L, - uid = "사용자 ID", - profile = Profile( - nickname = "대훈", - jobGroupId = 2L - ) - ) - val link = Link( - id = 2L, - creatorId = 1, - title = "링크 제목", - describe = "링크 설명", - url = "링크 URL", - folderId = 0L, - inflowType = InflowType.BRING - ) - - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link - - deleteLinkUseCase.delete(uid, linkId) - - Then("링크가 삭제된다.") { - link.isDeleted() shouldBe true - } - } - - When("링크를 삭제할 때 권한이 없는 경우") { - val user = User( - id = 1L, - uid = "다른 사용자 ID", - profile = Profile( - nickname = "다른 사용자", - jobGroupId = 2L - ) - ) - val link = Link( - id = linkId, - creatorId = 1, - title = "링크 제목", - describe = "링크 설명", - url = "링크 URL", - folderId = 0L, - inflowType = InflowType.BRING - ) - - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link - - Then("NotAuthorizedForDataException이 throw되어야 함") { - shouldThrow { - deleteLinkUseCase.delete(uid, linkId) - } - } - } - - When("폴더에 속한 링크를 일괄 삭제하면") { - val folderId = 1L - every { linkPort.deleteBatchByFolderId(folderId) } just runs - - deleteLinkUseCase.deleteByFolder(folderId) - - Then("폴더에 속한 링크가 일괄 삭제되어야 함") { - verify(exactly = 1) { linkPort.deleteBatchByFolderId(folderId) } - } - } - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/link/service/GetLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/GetLinkUseCaseTest.kt deleted file mode 100644 index b11d609..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/link/service/LinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/LinkServiceTest.kt deleted file mode 100644 index 01710b2..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/link/service/SearchLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/SearchLinkUseCaseTest.kt deleted file mode 100644 index f7200b1..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/link/service/UpdateLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool/link/service/UpdateLinkUseCaseTest.kt deleted file mode 100644 index bc6b126..0000000 --- a/api/domain/src/test/kotlin/linkpool/link/service/UpdateLinkUseCaseTest.kt +++ /dev/null @@ -1,101 +0,0 @@ -package linkpool.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.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({ - val linkPort = mockk() - val getUserUseCase = mockk() - - val updateLinkUseCase = UpdateLinkService(getUserUseCase, linkPort) - - afterContainer { - clearAllMocks() - } - - Given("링크 정보 업데이트 서비스") { - val uid = "12345" - val linkId = 1L - val request = UpdateLinkRequest( - url = "새로운 URL", - title = "새로운 제목", - describe = "새로운 설명", - image = "새로운 이미지" - ) - - When("링크 정보를 업데이트하면") { - val user = User( - id = 1L, - uid = "사용자 ID", - profile = Profile( - nickname = "대훈", - jobGroupId = 2L - ) - ) - val link = Link( - id = linkId, - creatorId = 2, - title = "기존 제목", - describe = "기존 설명", - url = "기존 URL", - folderId = 0L, - inflowType = InflowType.BRING - ) - - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link - - updateLinkUseCase.update(uid, linkId, request) - - Then("링크 정보가 업데이트되어야 한다") { - link.url shouldBe "새로운 URL" - link.title shouldBe "새로운 제목" - link.describe shouldBe "새로운 설명" - link.image shouldBe "새로운 이미지" - } - } - - When("링크 정보를 업데이트할 때 다른 아이디라 권한이 없는 경우") { - val user = User( - id = 2L, - uid = "사용자 ID", - profile = Profile( - nickname = "대훈", - jobGroupId = 2L - ) - ) - val link = Link( - id = linkId, - creatorId = 1, - title = "기존 제목", - describe = "기존 설명", - url = "기존 URL", - folderId = 0L, - inflowType = InflowType.BRING - ) - - every { getUserUseCase.getByUid(uid) } returns user - every { linkPort.getById(linkId) } returns link - - Then("CustomException이 throw되어야 한다") { - shouldThrow { - updateLinkUseCase.update(uid, linkId, request) - } - } - } - } -}) diff --git a/api/domain/src/test/kotlin/linkpool/query/service/UserJobGroupServiceTest.kt b/api/domain/src/test/kotlin/linkpool/query/service/UserJobGroupServiceTest.kt deleted file mode 100644 index 428c08b..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/report/fixtures/ReportFixtures.kt b/api/domain/src/test/kotlin/linkpool/report/fixtures/ReportFixtures.kt deleted file mode 100644 index a066333..0000000 --- a/api/domain/src/test/kotlin/linkpool/report/fixtures/ReportFixtures.kt +++ /dev/null @@ -1,57 +0,0 @@ -package linkpool.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 = "기타 사유" - -fun createReport( - id: Long = 1L, - reportId: Long = 1L, - reason: ReportReasonType = ReportReasonType.COMMERCIAL, - otherReason: String? = REPORT_OTHER_REASON, - targetType: ReportTargetType = ReportTargetType.USER, - targetId: Long = 1L, - createdDateTime: LocalDateTime = LocalDateTime.now() -): Report { - return Report( - id = id, - reporterId = reportId, - reason = ReportReason( - reason = reason, - otherReason = otherReason - ), - target = ReportTarget( - targetType = targetType, - targetId = targetId - ), - createdDateTime = createdDateTime, - ) -} - -fun createCreateReportRequest( - targetType: ReportTargetType = ReportTargetType.USER, - targetId: Long = 1L, - reasonType: ReportReasonType = ReportReasonType.COMMERCIAL, - otherReason: String? = REPORT_OTHER_REASON, -): CreateReportRequest { - return CreateReportRequest( - targetType = targetType, - targetId = targetId, - reasonType = reasonType, - otherReason = otherReason - ) -} - -fun createReportTarget( - targetType: ReportTargetType = ReportTargetType.USER, - targetId: Long = 1L, -): ReportTarget { - return ReportTarget( - targetType = targetType, - targetId = targetId - ) -} \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/report/model/ReportTest.kt b/api/domain/src/test/kotlin/linkpool/report/model/ReportTest.kt deleted file mode 100644 index ecb7552..0000000 --- a/api/domain/src/test/kotlin/linkpool/report/model/ReportTest.kt +++ /dev/null @@ -1,25 +0,0 @@ -package linkpool.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.support.spec.afterRootTest -import org.junit.jupiter.api.Assertions.* - -class ReportTest: BehaviorSpec({ - - Given("유효한 신고 정보에 대해서") { - val report = createReport() - When("이를 삭제하면") { - report.delete() - Then("삭제 여부가 true가 된다") { - report.deleted shouldBe true - } - } - } - - afterRootTest { - clearAllMocks() - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/report/service/CreateReportServiceTest.kt b/api/domain/src/test/kotlin/linkpool/report/service/CreateReportServiceTest.kt deleted file mode 100644 index b7f67d4..0000000 --- a/api/domain/src/test/kotlin/linkpool/report/service/CreateReportServiceTest.kt +++ /dev/null @@ -1,52 +0,0 @@ -package linkpool.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.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() - val createReportService = CreateReportService(reportPort) - - Given("신고자와 대상이 동일한 신고 정보가 아마 등록되어있는 경우") { - val report = createReport() - every { reportPort.findByReporterIdAndTarget(any(), any()) } returns report - When("신고를 등록하면") { - val user = createUser() - val createReportRequest = createCreateReportRequest() - Then("DuplicateReportException 예외가 발생한다") { - shouldThrow { - createReportService.create(user, createReportRequest) - } - } - } - } - - Given("신고자와 대상이 동일한 신고 정보가 아마 등록되어있지 않은 경우") { - val report = createReport() - every { reportPort.findByReporterIdAndTarget(any(), any()) } returns null - every { reportPort.save(any()) } returns report - - When("신고를 등록하면") { - val user = createUser() - val createReportRequest = createCreateReportRequest() - Then("예외가 발생하지 않고 신고가 등록된다") { - shouldNotThrow { - createReportService.create(user, createReportRequest) - } - } - } - } - - afterRootTest { - clearAllMocks() - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/report/service/ReportQueryServiceTest.kt b/api/domain/src/test/kotlin/linkpool/report/service/ReportQueryServiceTest.kt deleted file mode 100644 index 8d3599e..0000000 --- a/api/domain/src/test/kotlin/linkpool/report/service/ReportQueryServiceTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -package linkpool.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.mockk -import linkpool.report.fixtures.createReport -import linkpool.report.fixtures.createReportTarget -import linkpool.report.report.port.out.ReportPort -import linkpool.support.spec.afterRootTest - -class ReportQueryServiceTest : BehaviorSpec({ - val reportPort = mockk() - val reportQueryService = GetReportService(reportPort) - - Given("어떤 신고 정보에 대해서") { - val report = createReport() - every { reportPort.findByReporterIdAndTarget(any(), any()) } returns report - When("신고자와 신고대상을 이용하여 조회하면") { - val reportTarget = createReportTarget() - val selected = reportQueryService.getByReportIdAndTargetOrNull(1L, reportTarget) - Then("해당 신고자와 신고대상이 동일한 신고 정보가 조회된다") { - selected shouldBe report - } - } - } - - afterRootTest { - clearAllMocks() - } -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/support/BaseTests.kt b/api/domain/src/test/kotlin/linkpool/support/BaseTests.kt deleted file mode 100644 index 14a0de7..0000000 --- a/api/domain/src/test/kotlin/linkpool/support/BaseTests.kt +++ /dev/null @@ -1,14 +0,0 @@ -package linkpool.support - -import io.mockk.junit5.MockKExtension -import org.junit.jupiter.api.extension.ExtendWith - -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -annotation class TestEnvironment - -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -@ExtendWith(MockKExtension::class) -@TestEnvironment -annotation class UnitTest diff --git a/api/domain/src/test/kotlin/linkpool/support/spec/Specs.kt b/api/domain/src/test/kotlin/linkpool/support/spec/Specs.kt deleted file mode 100644 index 88fc746..0000000 --- a/api/domain/src/test/kotlin/linkpool/support/spec/Specs.kt +++ /dev/null @@ -1,19 +0,0 @@ -package linkpool.support.spec - -import io.kotest.core.spec.AfterTest -import io.kotest.core.spec.BeforeTest -import io.kotest.core.spec.Spec -import io.kotest.core.test.isRootTest - -fun Spec.beforeRootTest(f: BeforeTest) { - beforeTest { - if (it.isRootTest()) f(it) - } -} - -fun Spec.afterRootTest(f: AfterTest) { - afterTest { - val (testcase) = it - if (testcase.isRootTest()) f(it) - } -} \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/user/fixtures/UserFixtures.kt b/api/domain/src/test/kotlin/linkpool/user/fixtures/UserFixtures.kt deleted file mode 100644 index a5ab38a..0000000 --- a/api/domain/src/test/kotlin/linkpool/user/fixtures/UserFixtures.kt +++ /dev/null @@ -1,74 +0,0 @@ -package linkpool.user.fixtures - -import linkpool.user.user.model.User -import linkpool.user.user.model.Profile -import linkpool.user.user.port.`in`.ProfileRequest -import java.time.LocalDateTime - -const val USER_UID: String = "TestUid123456789" -const val USER_NICKNAME: String = "사용자1" -const val USER_PROFILE_IMAGE: String = "01" - -fun createUser( - id: Long = 1L, - uid: String = USER_UID, - nickname: String = USER_NICKNAME, - jobGroupId: Long = 1L, - profileImage: String = USER_PROFILE_IMAGE, - deleted: Boolean = false, - createdDateTime: LocalDateTime = LocalDateTime.now(), - modifiedDateTime: LocalDateTime = LocalDateTime.now(), -): User { - return User( - id, - uid, - Profile( - nickname = nickname, - jobGroupId = jobGroupId, - profileImage = profileImage - ), - createdDateTime, - modifiedDateTime, - deleted - ) -} - -fun createUserWithoutInfo( - id: Long = 1L, - uid: String = USER_UID, - deleted: Boolean = false, - createdDateTime: LocalDateTime = LocalDateTime.now(), - modifiedDateTime: LocalDateTime = LocalDateTime.now(), -): User { - return User( - id = id, - uid = uid, - deleted = deleted, - createdDateTime = createdDateTime, - modifiedDateTime = modifiedDateTime - ) -} - -fun createUserInformation( - nickname: String = USER_NICKNAME, - jobGroupId: Long = 1L, - profileImage: String? = USER_PROFILE_IMAGE -): Profile { - return Profile( - nickname = nickname, - jobGroupId = jobGroupId, - profileImage = profileImage - ) -} - -fun createUserInfoRequest( - nickname: String? = USER_NICKNAME, - jobGroupId: Long? = 1L, - profileImage: String? = USER_PROFILE_IMAGE, -): ProfileRequest { - return ProfileRequest( - nickname = nickname, - jobGroupId = jobGroupId, - profileImage = profileImage, - ) -} diff --git a/api/domain/src/test/kotlin/linkpool/user/model/UserTest.kt b/api/domain/src/test/kotlin/linkpool/user/model/UserTest.kt deleted file mode 100644 index 32209a1..0000000 --- a/api/domain/src/test/kotlin/linkpool/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/user/service/CreateUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/service/CreateUserServiceTest.kt deleted file mode 100644 index 6453258..0000000 --- a/api/domain/src/test/kotlin/linkpool/user/service/CreateUserServiceTest.kt +++ /dev/null @@ -1,75 +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.USER_UID -import linkpool.user.fixtures.createUser -import linkpool.user.fixtures.createUserWithoutInfo -import linkpool.user.user.port.out.UserPort -import linkpool.user.user.service.CreateUserService - -class CreateUserServiceTest: BehaviorSpec({ - val userPort = mockk() - val signUpService = CreateUserService(userPort) - - Given("한번도 회원가입한 적 없는 유저인 경우") { - val user = createUserWithoutInfo() - every { userPort.findByUidIncludingDeleted(USER_UID) } returns null - every { userPort.save(any()) } returns user - When("회원 가입을 하면") { - val response = signUpService.createUser(USER_UID) - Then("유저가 저장되고 ID가 부여되며 새로운 유저임이 표시된다") { - verify { userPort.save(any()) } - response.id shouldBe user.id - response.isNew shouldBe true - } - } - } - - Given("회원가입이 완료된 유저인 경우") { - val user = createUser() - every { userPort.findByUidIncludingDeleted(USER_UID) } returns user - - When("회원 가입을 하면") { - val response = signUpService.createUser(USER_UID) - Then("해당 유저가 새로운 유저가 아님이 표시된다") { - response.id shouldBe user.id - response.isNew shouldBe false - } - } - } - - Given("회원가입은 되었으나 프로필이 생성되지 않은 유저일 경우") { - val user = createUserWithoutInfo() - every { userPort.findByUidIncludingDeleted(USER_UID) } returns user - When("회원 가입을 하면") { - val response = signUpService.createUser(USER_UID) - Then("해당 유저의 ID 값을 전해주나, 새로운 유저임이 표시된다") { - response.id shouldBe user.id - response.isNew shouldBe true - } - } - } - - Given("회원탈퇴를 완료한 유저일 경우") { - val user = createUserWithoutInfo(deleted = true) - every { userPort.findByUidIncludingDeleted(USER_UID) } returns user - every { userPort.patch(any()) } just Runs - When("회원 가입을 하면") { - val response = signUpService.createUser(USER_UID) - Then("해당 유저를 활성화하고, 해당 ID 값을 전해주며, 새로운 유저임이 표시된다") { - user.isActivated() shouldBe true - verify { userPort.patch(user) } - response.id shouldBe user.id - response.isNew shouldBe true - } - } - } - - afterRootTest { - clearAllMocks() - } - -}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool/user/service/SignOutServiceTest.kt b/api/domain/src/test/kotlin/linkpool/user/service/SignOutServiceTest.kt deleted file mode 100644 index 249e7e9..0000000 --- a/api/domain/src/test/kotlin/linkpool/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 From f854ce0009af859cc7049e58461661ecec8a7740 Mon Sep 17 00:00:00 2001 From: daehoon12 Date: Sun, 24 Sep 2023 14:40:09 +0900 Subject: [PATCH 3/5] [issue-19] fix: delete mockMvc --- api/infra/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/api/infra/build.gradle.kts b/api/infra/build.gradle.kts index 6a723b4..70a0408 100644 --- a/api/infra/build.gradle.kts +++ b/api/infra/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { exclude(group = "org.junit.vintage", module = "junit-vintage-engine") exclude(group = "org.mockito") } - testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc") // Swagger implementation("io.springfox:springfox-boot-starter:3.0.0") From 7e6577cfca6e441eb0aaf194a083382a03fa44bc Mon Sep 17 00:00:00 2001 From: daehoon12 Date: Sun, 24 Sep 2023 14:40:58 +0900 Subject: [PATCH 4/5] [issue-19] test: add test to get profile --- .../adapters/user/in/rest/UserHandlerTest.kt | 27 ++++++++ api/infra/src/test/resources/sql/data.sql | 20 ++++++ api/infra/src/test/resources/sql/schema.sql | 65 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 api/infra/src/test/kotlin/linkpool/user/adapters/user/in/rest/UserHandlerTest.kt create mode 100644 api/infra/src/test/resources/sql/data.sql create mode 100644 api/infra/src/test/resources/sql/schema.sql diff --git a/api/infra/src/test/kotlin/linkpool/user/adapters/user/in/rest/UserHandlerTest.kt b/api/infra/src/test/kotlin/linkpool/user/adapters/user/in/rest/UserHandlerTest.kt new file mode 100644 index 0000000..0f222fd --- /dev/null +++ b/api/infra/src/test/kotlin/linkpool/user/adapters/user/in/rest/UserHandlerTest.kt @@ -0,0 +1,27 @@ +package linkpool.user.adapters.user.`in`.rest + +import io.kotest.core.spec.style.BehaviorSpec +import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.web.reactive.server.WebTestClient +@ActiveProfiles("integration") +@AutoConfigureWebTestClient +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class UserHandlerTest( + private val webTestClient: WebTestClient, +): BehaviorSpec({ + Given("내 프로필 조회") { + When("local-tester라는 아이디를 조회하면") { + val principalId = "local-tester" + Then("PK는 1이고 아이디가 일치해야한다.") + webTestClient.get() + .uri("/users/me") + .exchange() + .expectStatus().isOk + .expectBody() + .jsonPath("$.data.id").isEqualTo(1) + .jsonPath("$.data.nickname").isEqualTo(principalId) + } + } +}) \ No newline at end of file diff --git a/api/infra/src/test/resources/sql/data.sql b/api/infra/src/test/resources/sql/data.sql new file mode 100644 index 0000000..abd27d3 --- /dev/null +++ b/api/infra/src/test/resources/sql/data.sql @@ -0,0 +1,20 @@ +INSERT INTO `job_group` (`id`, `name`) VALUES +(1, '디자인'), +(2, '기획'), +(3, 'IT개발'), +(4, '마케팅'), +(5, '세일즈'), +(6, '경영/비즈니스'), +(7, '인테리어/건축'), +(8, '사무직'), +(9, '엔지니어'), +(10, '음악'), +(11, '작가'), +(12, '학생'), +(13, '주부'), +(14, '기타'), +(15, '서비스'), +(16, '의료인'); + +INSERT INTO `user` (`id`, `deleted`, `job_group_id`, `nickname`, `profile_image`, `uid`) VALUES +(1, b'0', 3, 'local-tester', '01', 'test-uid'); \ No newline at end of file diff --git a/api/infra/src/test/resources/sql/schema.sql b/api/infra/src/test/resources/sql/schema.sql new file mode 100644 index 0000000..ce092ff --- /dev/null +++ b/api/infra/src/test/resources/sql/schema.sql @@ -0,0 +1,65 @@ +DROP TABLE IF EXISTS `folder`; +CREATE TABLE `folder` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `modified_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `deleted` bit(1) NOT NULL, + `name` varchar(255) NOT NULL, + `image` varchar(500) DEFAULT NULL, + `owner_id` bigint DEFAULT NULL, + `visible` bit(1) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1135 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +DROP TABLE IF EXISTS `job_group`; +CREATE TABLE `job_group` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `modified_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `name` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +DROP TABLE IF EXISTS `link`; +CREATE TABLE `link` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `modified_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `deleted` bit(1) NOT NULL, + `describe` varchar(550) DEFAULT NULL, + `folder_id` bigint DEFAULT NULL, + `image` varchar(500) DEFAULT NULL, + `inflow_type` int NOT NULL DEFAULT '0', + `title` varchar(30) DEFAULT NULL, + `url` varchar(500) NOT NULL, + `creator_id` bigint DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2211 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +DROP TABLE IF EXISTS `report`; +CREATE TABLE `report` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `modified_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `deleted` bit(1) NOT NULL, + `other_reason` varchar(500) DEFAULT NULL, + `reason` int NOT NULL, + `reporter_id` bigint NOT NULL, + `target_id` bigint NOT NULL, + `target_type` int NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `modified_date_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + `deleted` bit(1) NOT NULL, + `job_group_id` bigint DEFAULT NULL, + `nickname` varchar(30) DEFAULT NULL, + `profile_image` varchar(255) DEFAULT NULL, + `uid` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `ix_user_uid` (`uid`) +) ENGINE=InnoDB AUTO_INCREMENT=461 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; \ No newline at end of file From 7d86b07d8c8df4bb5c76f5149a68ac5804dd18e2 Mon Sep 17 00:00:00 2001 From: daehoon12 Date: Sun, 8 Oct 2023 16:16:31 +0900 Subject: [PATCH 5/5] [issue-19] test: add old test code --- .../linkpool-v0/folder/model/FolderTest.kt | 28 ++++ .../folder/service/CreateFolderServiceTest.kt | 87 +++++++++++ .../folder/service/DeleteFolderServiceTest.kt | 29 ++++ .../folder/service/UpdateFolderServiceTest.kt | 66 ++++++++ .../service/WithdrawalFolderServiceTest.kt | 30 ++++ .../service/DeleteFolderLinkServiceTest.kt | 74 +++++++++ .../jobgroup/fixtures/JobGroupFixtures.kt | 16 ++ .../jobgroup/model/JobGroupTest.kt | 8 + .../jobgroup/service/JobGroupServiceTest.kt | 60 +++++++ .../kotlin/linkpool-v0/link/model/LinkTest.kt | 8 + .../CountUnclassifiedLinkUseCaseTest.kt | 27 ++++ .../link/service/CreateLinkServiceTest.kt | 63 ++++++++ .../link/service/DeleteLinkUseCaseTest.kt | 96 ++++++++++++ .../link/service/GetLinkUseCaseTest.kt | 76 +++++++++ .../link/service/LinkServiceTest.kt | 8 + .../link/service/SearchLinkUseCaseTest.kt | 147 ++++++++++++++++++ .../link/service/UpdateLinkUseCaseTest.kt | 101 ++++++++++++ .../query/service/UserJobGroupServiceTest.kt | 8 + .../report/fixtures/ReportFixtures.kt | 57 +++++++ .../linkpool-v0/report/model/ReportTest.kt | 25 +++ .../report/service/CreateReportServiceTest.kt | 52 +++++++ .../report/service/ReportQueryServiceTest.kt | 32 ++++ .../kotlin/linkpool-v0/support/BaseTests.kt | 14 ++ .../kotlin/linkpool-v0/support/spec/Specs.kt | 19 +++ .../linkpool-v0/user/fixtures/UserFixtures.kt | 74 +++++++++ .../kotlin/linkpool-v0/user/model/UserTest.kt | 103 ++++++++++++ .../user/service/CreateUserServiceTest.kt | 75 +++++++++ .../user/service/GetUserServiceTest.kt | 121 ++++++++++++++ .../user/service/SignOutServiceTest.kt | 31 ++++ .../user/service/UpdateUserServiceTest.kt | 73 +++++++++ 30 files changed, 1608 insertions(+) create mode 100644 api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/folder/service/DeleteFolderServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/folder/service/UpdateFolderServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/folder/service/WithdrawalFolderServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/folderlink/service/DeleteFolderLinkServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/jobgroup/fixtures/JobGroupFixtures.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/jobgroup/model/JobGroupTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/jobgroup/service/JobGroupServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/model/LinkTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/CountUnclassifiedLinkUseCaseTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/CreateLinkServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/DeleteLinkUseCaseTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/GetLinkUseCaseTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/LinkServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/SearchLinkUseCaseTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/link/service/UpdateLinkUseCaseTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/query/service/UserJobGroupServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/report/fixtures/ReportFixtures.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/support/BaseTests.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/support/spec/Specs.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/fixtures/UserFixtures.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/model/UserTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/service/CreateUserServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/service/SignOutServiceTest.kt create mode 100644 api/domain/src/test/kotlin/linkpool-v0/user/service/UpdateUserServiceTest.kt diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt b/api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt new file mode 100644 index 0000000..a03d95d --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/folder/model/FolderTest.kt @@ -0,0 +1,28 @@ +package linkpool.folder.model + +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import linkpool.link.folder.model.Folder + +class FolderTest : BehaviorSpec({ + Given("폴더의 주인이 아닌 경우") { + val other = 2L + val otherFolder = Folder(ownerId = 1L, name = "") + When("내 폴더인지 확인하면 ") { + val result = otherFolder.isOwner(other) + Then("`FALSE`가 반환된다.") { + result shouldBe false + } + } + And("폴더의 주인인 경우") { + val me = 1L + val myFolder = Folder(ownerId = 1L, name = "") + When("내 폴더인지 확인하면 ") { + val result = myFolder.isOwner(me) + Then("`TRUE`가 반환된다.") { + result shouldBe true + } + } + } + } +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt new file mode 100644 index 0000000..ed3c68e --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/folder/service/CreateFolderServiceTest.kt @@ -0,0 +1,87 @@ +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.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.user.user.service.GetUserService +import java.time.LocalDateTime + +class CreateFolderServiceTest : BehaviorSpec({ + + @MockK + val userUseCase = mockk() + + @MockK + val folderPort = mockk() + + @InjectMockKs + val createFolderService = CreateFolderService(userUseCase, 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 } + When("폴더 저장함수을 요청할 경우") { + createFolderService.create("", createSaveFolderRequest()) + Then("폴더가 저장된다.") { + verify { folderPort.save(any()) } + verify { userUseCase.getByUid(any()) } + every { folderPort.existsByOwnerIdAndName(any(), 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()) + } + Then("예외를 던진다.") { + exception.message shouldBe "이미 등록된 폴더명입니다." + verify(exactly = 1) { + folderPort.existsByOwnerIdAndName(any(), any()) + userUseCase.getByUid(any()) + } + verify(exactly = 0) { + folderPort.save(any()) + } + } + } + } + } +// Given("폴더 저장시 이미 존재하는 폴더의 경우") { +//// every { folderPort.existsByUserIdAndName(any(), any()) } answers { true } +//// every { userUseCase.getByUid(any()) } answers { User(id = 1L, uid = "") } +// When("폴더 저장함수가 호출될 경우 예외가 발생한다.") { +// val exception = shouldThrow { +// createFolderService.create("", SaveFolderRequest("name", true, LocalDateTime.now())) +// } +// Then("이때 에러는 NotAuthorizedForDataException 이다.") { +// exception.message shouldNotBe null +// exception.message shouldBe "이미 등록된 폴더명입니다." +// verify(exactly = 1) { +// folderPort.existsByUserIdAndName(any(), any()) +// userUseCase.getByUid(any()) +// } +// verify(exactly = 0) { +// folderPort.existsByUserIdAndName(any(), any()) +// } +// } +// } +// } +}) + +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-v0/folder/service/DeleteFolderServiceTest.kt new file mode 100644 index 0000000..6493a54 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/folder/service/DeleteFolderServiceTest.kt @@ -0,0 +1,29 @@ +package linkpool.folder.service + +import io.kotest.core.spec.style.BehaviorSpec +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.DeleteFolderService + +class DeleteFolderServiceTest : BehaviorSpec({ + + @MockK + val folderPort = mockk() + + @InjectMockKs + val deleteFolderService = DeleteFolderService(folderPort) + + Given("폴더 삭제") { + justRun { folderPort.softDelete(any()) } + When("폴더 삭제를 요청할 경우 하면") { + deleteFolderService.delete(1L) + Then("폴더가 삭제된다.") { + verify { folderPort.softDelete(any()) } + } + } + } +}) \ No newline at end of file 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 new file mode 100644 index 0000000..15dece0 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/folder/service/UpdateFolderServiceTest.kt @@ -0,0 +1,66 @@ +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/folder/service/WithdrawalFolderServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/folder/service/WithdrawalFolderServiceTest.kt new file mode 100644 index 0000000..468ad7b --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/folder/service/WithdrawalFolderServiceTest.kt @@ -0,0 +1,30 @@ +package linkpool.folder.service + +import io.kotest.core.spec.style.BehaviorSpec +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({ + + @MockK + val folderPort = mockk() + + @InjectMockKs + val withdrawalFolderService = WithdrawalFolderService(folderPort) + + Given("회원 탈퇴시 폴더 삭제") { + justRun { folderPort.softDeleteAll(any()) } + When("폴더 삭제를 요청할 경우") { + withdrawalFolderService.deleteAll(UserSignedOutEvent(1L)) + Then("폴더가 삭제된다") { + verify { folderPort.softDeleteAll(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 new file mode 100644 index 0000000..ab7d357 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/folderlink/service/DeleteFolderLinkServiceTest.kt @@ -0,0 +1,74 @@ +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/fixtures/JobGroupFixtures.kt b/api/domain/src/test/kotlin/linkpool-v0/jobgroup/fixtures/JobGroupFixtures.kt new file mode 100644 index 0000000..4ff207b --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/jobgroup/fixtures/JobGroupFixtures.kt @@ -0,0 +1,16 @@ +package linkpool.jobgroup.fixtures + +import linkpool.user.jobgroup.model.JobGroup + +const val JOB_GROUP_NAME: String = "개발자" + +fun createJobGroup( + id: Long = 1L, + name: String = JOB_GROUP_NAME +): JobGroup { + return JobGroup( + id = id, + name = name, + ) +} + 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 new file mode 100644 index 0000000..7302a3b --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/jobgroup/model/JobGroupTest.kt @@ -0,0 +1,8 @@ +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/jobgroup/service/JobGroupServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/jobgroup/service/JobGroupServiceTest.kt new file mode 100644 index 0000000..547e215 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/jobgroup/service/JobGroupServiceTest.kt @@ -0,0 +1,60 @@ +package linkpool.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.every +import io.mockk.mockk +import linkpool.exception.DataNotFoundException +import linkpool.jobgroup.fixtures.createJobGroup +import linkpool.user.jobgroup.port.out.JobGroupPort +import linkpool.support.spec.afterRootTest +import linkpool.user.jobgroup.service.JobGroupQueryService + +class JobGroupQueryServiceTest: 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 + + When("직업군을 모두 조회하면") { + val all = jobGroupQueryService.getAll() + Then("존재하는 모든 직업군이 조회된다") { + all shouldContainAll listOf(jobGroup1,jobGroup2) + } + } + + When("유효한 ID를 이용하여 직업군을 조회하면") { + val jobGroup = jobGroupQueryService.getById(1L) + Then("해당 ID를 가진 직업군이 조회된다") { + jobGroup shouldBe jobGroup1 + } + } + + When("유효하지 않은 ID를 이용하여 nullable 직업군을 조회하면") { + val jobGroup = jobGroupQueryService.getByIdOrNull(3L) + Then("null이 리턴된다") { + jobGroup shouldBe null + } + } + + When("유효하지 않은 ID를 이용하여 직업군을 조회하면") { + Then("예외가 발생한다") { + shouldThrow { + jobGroupQueryService.getById(3L) + } + } + } + } + + afterRootTest { + clearAllMocks() + } +}) \ 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 new file mode 100644 index 0000000..d79550d --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/model/LinkTest.kt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 0000000..dc1a7cb --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/CountUnclassifiedLinkUseCaseTest.kt @@ -0,0 +1,27 @@ +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/CreateLinkServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/service/CreateLinkServiceTest.kt new file mode 100644 index 0000000..fb156db --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/CreateLinkServiceTest.kt @@ -0,0 +1,63 @@ +package linkpool.link.service + +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.* +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({ + val linkPort = mockk() + val getUserUseCase = mockk() + + val createLinkUseCase = CreateLinkService(getUserUseCase, linkPort) + + afterContainer { + clearAllMocks() + } + Given("링크 저장 유즈케이스에") { + val uid = "12345" + val user = User( + uid = uid + ) + + val request = SaveLinkRequest( + url = "linkpool.co.kr", + title = "링크풀임", + describe = null, + image = null, + folderId = 1, + inflowType = InflowType.CREATE + ) + val link = Link( + creatorId = user.id, + url = request.url, + title = request.title, + describe = request.describe, + image = request.image, + folderId = request.folderId, + createdDateTime = request.createdAt ?: LocalDateTime.now(), + inflowType = request.inflowType ?: InflowType.CREATE + ) + + every { getUserUseCase.getByUid(uid) } returns user + every { linkPort.save(any()) } returns link + + + When("요청을 보낼 시") { + createLinkUseCase.create(uid, request) + + Then("링크가 저장이 된다") { + verify(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-v0/link/service/DeleteLinkUseCaseTest.kt new file mode 100644 index 0000000..de83e62 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/DeleteLinkUseCaseTest.kt @@ -0,0 +1,96 @@ +package linkpool.link.service + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.* +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({ + + val getUserUseCase = mockk() + val linkPort = mockk() + val deleteLinkUseCase = DeleteLinkService(getUserUseCase, linkPort) + + Given("링크 삭제 서비스") { + val uid = "사용자 ID" + val linkId = 1L + + When("링크를 삭제하면") { + val user = User( + id = 1L, + uid = "사용자 ID", + profile = Profile( + nickname = "대훈", + jobGroupId = 2L + ) + ) + val link = Link( + id = 2L, + creatorId = 1, + title = "링크 제목", + describe = "링크 설명", + url = "링크 URL", + folderId = 0L, + inflowType = InflowType.BRING + ) + + every { getUserUseCase.getByUid(uid) } returns user + every { linkPort.getById(linkId) } returns link + + deleteLinkUseCase.delete(uid, linkId) + + Then("링크가 삭제된다.") { + link.isDeleted() shouldBe true + } + } + + When("링크를 삭제할 때 권한이 없는 경우") { + val user = User( + id = 1L, + uid = "다른 사용자 ID", + profile = Profile( + nickname = "다른 사용자", + jobGroupId = 2L + ) + ) + val link = Link( + id = linkId, + creatorId = 1, + title = "링크 제목", + describe = "링크 설명", + url = "링크 URL", + folderId = 0L, + inflowType = InflowType.BRING + ) + + every { getUserUseCase.getByUid(uid) } returns user + every { linkPort.getById(linkId) } returns link + + Then("NotAuthorizedForDataException이 throw되어야 함") { + shouldThrow { + deleteLinkUseCase.delete(uid, linkId) + } + } + } + + When("폴더에 속한 링크를 일괄 삭제하면") { + val folderId = 1L + every { linkPort.deleteBatchByFolderId(folderId) } just runs + + deleteLinkUseCase.deleteByFolder(folderId) + + Then("폴더에 속한 링크가 일괄 삭제되어야 함") { + verify(exactly = 1) { linkPort.deleteBatchByFolderId(folderId) } + } + } + } +}) \ 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 new file mode 100644 index 0000000..b11d609 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/GetLinkUseCaseTest.kt @@ -0,0 +1,76 @@ +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 new file mode 100644 index 0000000..01710b2 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/LinkServiceTest.kt @@ -0,0 +1,8 @@ +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 new file mode 100644 index 0000000..f7200b1 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/SearchLinkUseCaseTest.kt @@ -0,0 +1,147 @@ +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/link/service/UpdateLinkUseCaseTest.kt b/api/domain/src/test/kotlin/linkpool-v0/link/service/UpdateLinkUseCaseTest.kt new file mode 100644 index 0000000..bc6b126 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/link/service/UpdateLinkUseCaseTest.kt @@ -0,0 +1,101 @@ +package linkpool.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.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({ + val linkPort = mockk() + val getUserUseCase = mockk() + + val updateLinkUseCase = UpdateLinkService(getUserUseCase, linkPort) + + afterContainer { + clearAllMocks() + } + + Given("링크 정보 업데이트 서비스") { + val uid = "12345" + val linkId = 1L + val request = UpdateLinkRequest( + url = "새로운 URL", + title = "새로운 제목", + describe = "새로운 설명", + image = "새로운 이미지" + ) + + When("링크 정보를 업데이트하면") { + val user = User( + id = 1L, + uid = "사용자 ID", + profile = Profile( + nickname = "대훈", + jobGroupId = 2L + ) + ) + val link = Link( + id = linkId, + creatorId = 2, + title = "기존 제목", + describe = "기존 설명", + url = "기존 URL", + folderId = 0L, + inflowType = InflowType.BRING + ) + + every { getUserUseCase.getByUid(uid) } returns user + every { linkPort.getById(linkId) } returns link + + updateLinkUseCase.update(uid, linkId, request) + + Then("링크 정보가 업데이트되어야 한다") { + link.url shouldBe "새로운 URL" + link.title shouldBe "새로운 제목" + link.describe shouldBe "새로운 설명" + link.image shouldBe "새로운 이미지" + } + } + + When("링크 정보를 업데이트할 때 다른 아이디라 권한이 없는 경우") { + val user = User( + id = 2L, + uid = "사용자 ID", + profile = Profile( + nickname = "대훈", + jobGroupId = 2L + ) + ) + val link = Link( + id = linkId, + creatorId = 1, + title = "기존 제목", + describe = "기존 설명", + url = "기존 URL", + folderId = 0L, + inflowType = InflowType.BRING + ) + + every { getUserUseCase.getByUid(uid) } returns user + every { linkPort.getById(linkId) } returns link + + Then("CustomException이 throw되어야 한다") { + shouldThrow { + updateLinkUseCase.update(uid, linkId, request) + } + } + } + } +}) 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 new file mode 100644 index 0000000..428c08b --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/query/service/UserJobGroupServiceTest.kt @@ -0,0 +1,8 @@ +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/report/fixtures/ReportFixtures.kt b/api/domain/src/test/kotlin/linkpool-v0/report/fixtures/ReportFixtures.kt new file mode 100644 index 0000000..a066333 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/report/fixtures/ReportFixtures.kt @@ -0,0 +1,57 @@ +package linkpool.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 = "기타 사유" + +fun createReport( + id: Long = 1L, + reportId: Long = 1L, + reason: ReportReasonType = ReportReasonType.COMMERCIAL, + otherReason: String? = REPORT_OTHER_REASON, + targetType: ReportTargetType = ReportTargetType.USER, + targetId: Long = 1L, + createdDateTime: LocalDateTime = LocalDateTime.now() +): Report { + return Report( + id = id, + reporterId = reportId, + reason = ReportReason( + reason = reason, + otherReason = otherReason + ), + target = ReportTarget( + targetType = targetType, + targetId = targetId + ), + createdDateTime = createdDateTime, + ) +} + +fun createCreateReportRequest( + targetType: ReportTargetType = ReportTargetType.USER, + targetId: Long = 1L, + reasonType: ReportReasonType = ReportReasonType.COMMERCIAL, + otherReason: String? = REPORT_OTHER_REASON, +): CreateReportRequest { + return CreateReportRequest( + targetType = targetType, + targetId = targetId, + reasonType = reasonType, + otherReason = otherReason + ) +} + +fun createReportTarget( + targetType: ReportTargetType = ReportTargetType.USER, + targetId: Long = 1L, +): ReportTarget { + return ReportTarget( + targetType = targetType, + targetId = targetId + ) +} \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt b/api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt new file mode 100644 index 0000000..ecb7552 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/report/model/ReportTest.kt @@ -0,0 +1,25 @@ +package linkpool.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.support.spec.afterRootTest +import org.junit.jupiter.api.Assertions.* + +class ReportTest: BehaviorSpec({ + + Given("유효한 신고 정보에 대해서") { + val report = createReport() + When("이를 삭제하면") { + report.delete() + Then("삭제 여부가 true가 된다") { + report.deleted shouldBe true + } + } + } + + afterRootTest { + clearAllMocks() + } +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt new file mode 100644 index 0000000..b7f67d4 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/report/service/CreateReportServiceTest.kt @@ -0,0 +1,52 @@ +package linkpool.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.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() + val createReportService = CreateReportService(reportPort) + + Given("신고자와 대상이 동일한 신고 정보가 아마 등록되어있는 경우") { + val report = createReport() + every { reportPort.findByReporterIdAndTarget(any(), any()) } returns report + When("신고를 등록하면") { + val user = createUser() + val createReportRequest = createCreateReportRequest() + Then("DuplicateReportException 예외가 발생한다") { + shouldThrow { + createReportService.create(user, createReportRequest) + } + } + } + } + + Given("신고자와 대상이 동일한 신고 정보가 아마 등록되어있지 않은 경우") { + val report = createReport() + every { reportPort.findByReporterIdAndTarget(any(), any()) } returns null + every { reportPort.save(any()) } returns report + + When("신고를 등록하면") { + val user = createUser() + val createReportRequest = createCreateReportRequest() + Then("예외가 발생하지 않고 신고가 등록된다") { + shouldNotThrow { + createReportService.create(user, createReportRequest) + } + } + } + } + + afterRootTest { + clearAllMocks() + } +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt new file mode 100644 index 0000000..8d3599e --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/report/service/ReportQueryServiceTest.kt @@ -0,0 +1,32 @@ +package linkpool.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.mockk +import linkpool.report.fixtures.createReport +import linkpool.report.fixtures.createReportTarget +import linkpool.report.report.port.out.ReportPort +import linkpool.support.spec.afterRootTest + +class ReportQueryServiceTest : BehaviorSpec({ + val reportPort = mockk() + val reportQueryService = GetReportService(reportPort) + + Given("어떤 신고 정보에 대해서") { + val report = createReport() + every { reportPort.findByReporterIdAndTarget(any(), any()) } returns report + When("신고자와 신고대상을 이용하여 조회하면") { + val reportTarget = createReportTarget() + val selected = reportQueryService.getByReportIdAndTargetOrNull(1L, reportTarget) + Then("해당 신고자와 신고대상이 동일한 신고 정보가 조회된다") { + selected shouldBe report + } + } + } + + afterRootTest { + clearAllMocks() + } +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/support/BaseTests.kt b/api/domain/src/test/kotlin/linkpool-v0/support/BaseTests.kt new file mode 100644 index 0000000..14a0de7 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/support/BaseTests.kt @@ -0,0 +1,14 @@ +package linkpool.support + +import io.mockk.junit5.MockKExtension +import org.junit.jupiter.api.extension.ExtendWith + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class TestEnvironment + +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +@ExtendWith(MockKExtension::class) +@TestEnvironment +annotation class UnitTest diff --git a/api/domain/src/test/kotlin/linkpool-v0/support/spec/Specs.kt b/api/domain/src/test/kotlin/linkpool-v0/support/spec/Specs.kt new file mode 100644 index 0000000..88fc746 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/support/spec/Specs.kt @@ -0,0 +1,19 @@ +package linkpool.support.spec + +import io.kotest.core.spec.AfterTest +import io.kotest.core.spec.BeforeTest +import io.kotest.core.spec.Spec +import io.kotest.core.test.isRootTest + +fun Spec.beforeRootTest(f: BeforeTest) { + beforeTest { + if (it.isRootTest()) f(it) + } +} + +fun Spec.afterRootTest(f: AfterTest) { + afterTest { + val (testcase) = it + if (testcase.isRootTest()) f(it) + } +} \ 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-v0/user/fixtures/UserFixtures.kt new file mode 100644 index 0000000..a5ab38a --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/user/fixtures/UserFixtures.kt @@ -0,0 +1,74 @@ +package linkpool.user.fixtures + +import linkpool.user.user.model.User +import linkpool.user.user.model.Profile +import linkpool.user.user.port.`in`.ProfileRequest +import java.time.LocalDateTime + +const val USER_UID: String = "TestUid123456789" +const val USER_NICKNAME: String = "사용자1" +const val USER_PROFILE_IMAGE: String = "01" + +fun createUser( + id: Long = 1L, + uid: String = USER_UID, + nickname: String = USER_NICKNAME, + jobGroupId: Long = 1L, + profileImage: String = USER_PROFILE_IMAGE, + deleted: Boolean = false, + createdDateTime: LocalDateTime = LocalDateTime.now(), + modifiedDateTime: LocalDateTime = LocalDateTime.now(), +): User { + return User( + id, + uid, + Profile( + nickname = nickname, + jobGroupId = jobGroupId, + profileImage = profileImage + ), + createdDateTime, + modifiedDateTime, + deleted + ) +} + +fun createUserWithoutInfo( + id: Long = 1L, + uid: String = USER_UID, + deleted: Boolean = false, + createdDateTime: LocalDateTime = LocalDateTime.now(), + modifiedDateTime: LocalDateTime = LocalDateTime.now(), +): User { + return User( + id = id, + uid = uid, + deleted = deleted, + createdDateTime = createdDateTime, + modifiedDateTime = modifiedDateTime + ) +} + +fun createUserInformation( + nickname: String = USER_NICKNAME, + jobGroupId: Long = 1L, + profileImage: String? = USER_PROFILE_IMAGE +): Profile { + return Profile( + nickname = nickname, + jobGroupId = jobGroupId, + profileImage = profileImage + ) +} + +fun createUserInfoRequest( + nickname: String? = USER_NICKNAME, + jobGroupId: Long? = 1L, + profileImage: String? = USER_PROFILE_IMAGE, +): ProfileRequest { + return ProfileRequest( + nickname = nickname, + jobGroupId = jobGroupId, + profileImage = profileImage, + ) +} 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 new file mode 100644 index 0000000..32209a1 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/user/model/UserTest.kt @@ -0,0 +1,103 @@ +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/CreateUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/user/service/CreateUserServiceTest.kt new file mode 100644 index 0000000..6453258 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/user/service/CreateUserServiceTest.kt @@ -0,0 +1,75 @@ +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.USER_UID +import linkpool.user.fixtures.createUser +import linkpool.user.fixtures.createUserWithoutInfo +import linkpool.user.user.port.out.UserPort +import linkpool.user.user.service.CreateUserService + +class CreateUserServiceTest: BehaviorSpec({ + val userPort = mockk() + val signUpService = CreateUserService(userPort) + + Given("한번도 회원가입한 적 없는 유저인 경우") { + val user = createUserWithoutInfo() + every { userPort.findByUidIncludingDeleted(USER_UID) } returns null + every { userPort.save(any()) } returns user + When("회원 가입을 하면") { + val response = signUpService.createUser(USER_UID) + Then("유저가 저장되고 ID가 부여되며 새로운 유저임이 표시된다") { + verify { userPort.save(any()) } + response.id shouldBe user.id + response.isNew shouldBe true + } + } + } + + Given("회원가입이 완료된 유저인 경우") { + val user = createUser() + every { userPort.findByUidIncludingDeleted(USER_UID) } returns user + + When("회원 가입을 하면") { + val response = signUpService.createUser(USER_UID) + Then("해당 유저가 새로운 유저가 아님이 표시된다") { + response.id shouldBe user.id + response.isNew shouldBe false + } + } + } + + Given("회원가입은 되었으나 프로필이 생성되지 않은 유저일 경우") { + val user = createUserWithoutInfo() + every { userPort.findByUidIncludingDeleted(USER_UID) } returns user + When("회원 가입을 하면") { + val response = signUpService.createUser(USER_UID) + Then("해당 유저의 ID 값을 전해주나, 새로운 유저임이 표시된다") { + response.id shouldBe user.id + response.isNew shouldBe true + } + } + } + + Given("회원탈퇴를 완료한 유저일 경우") { + val user = createUserWithoutInfo(deleted = true) + every { userPort.findByUidIncludingDeleted(USER_UID) } returns user + every { userPort.patch(any()) } just Runs + When("회원 가입을 하면") { + val response = signUpService.createUser(USER_UID) + Then("해당 유저를 활성화하고, 해당 ID 값을 전해주며, 새로운 유저임이 표시된다") { + user.isActivated() shouldBe true + verify { userPort.patch(user) } + response.id shouldBe user.id + response.isNew shouldBe true + } + } + } + + afterRootTest { + clearAllMocks() + } + +}) \ No newline at end of file diff --git a/api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt b/api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt new file mode 100644 index 0000000..432d015 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/user/service/GetUserServiceTest.kt @@ -0,0 +1,121 @@ +package linkpool.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.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.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 + + 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) + } + } + } + } + + Given("조회하고자 하는 유저가 프로필이 생성되지 않았을 경우") { + val userWithoutInfo = createUserWithoutInfo() + every { userPort.findById(any()) } returns userWithoutInfo + every { userPort.findByUid(any()) } returns userWithoutInfo + + When("uid를 이용하여 유저를 조회하면") { + Then("NotSignedUpException 예외가 발생한다") { + shouldThrow { + userQueryService.getByUid(USER_UID) + } + } + } + When("id를 이용하여 유저를 조회") { + Then("NotSignedUpException 예외가 발생한다") { + shouldThrow { + userQueryService.getById(1L) + } + } + } + } + + Given("조회하고자 하는 유저가 프로필이 생성되어있을 경우") { + val userWithInfo = createUser() + every { userPort.findById(any()) } returns userWithInfo + every { 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("해당 유저가 리턴된다") { + user shouldBe userWithInfo + } + } + } + + Given("확인하고자 하는 닉네임이 존재하지 않는 경우") { + every { userPort.existsByNickname(any()) } returns false + + When("닉네임을 존재 여부를 확인하면") { + val result = userQueryService.existsByNickname(USER_NICKNAME) + Then("false가 리턴된다") { + result shouldBe false + } + } + } + + Given("확인하고자 하는 닉네임이 존재하는 경우") { + every { userPort.existsByNickname(any()) } returns true + + When("닉네임을 존재 여부를 확인하면") { + val result = userQueryService.existsByNickname(USER_NICKNAME) + Then("true가 리턴된다") { + result shouldBe true + } + } + } + + 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 new file mode 100644 index 0000000..249e7e9 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/user/service/SignOutServiceTest.kt @@ -0,0 +1,31 @@ +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 new file mode 100644 index 0000000..d925022 --- /dev/null +++ b/api/domain/src/test/kotlin/linkpool-v0/user/service/UpdateUserServiceTest.kt @@ -0,0 +1,73 @@ +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