diff --git a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagDeleteService.kt b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagDeleteService.kt index f99f91de..598eadb6 100644 --- a/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagDeleteService.kt +++ b/Api-Module/src/main/kotlin/com/bamyanggang/apimodule/domain/tag/application/service/TagDeleteService.kt @@ -24,7 +24,7 @@ class TagDeleteService( experienceReader.readByUserIdAndParentTagId(getAuthenticationPrincipal(), deleteTag.id) .forEach { experienceRemover.remove(it.id) } }else { - experienceReader.readByChildTag(tagId).forEach { + experienceReader.readByChildTagId(tagId).forEach { experienceRemover.remove(it.id) } } diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/Experience.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/Experience.kt index f6a2586e..0d77f807 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/Experience.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/Experience.kt @@ -45,6 +45,7 @@ data class Experience( init { require(title.length < 50) { "제목의 글자 수는 50자 제한입니다." } require(startedAt <= endedAt) { "활동 시작일은 종료일보다 빨라야 합니다."} + require(strongPoints.isNotEmpty()) { "최소 1개 이상의 역량 키워드를 선택해야 합니다."} } companion object { diff --git a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt index f48b427e..9e8bff50 100644 --- a/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt +++ b/Domain-Module/src/main/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReader.kt @@ -57,12 +57,13 @@ class ExperienceReader( }.contains(true) }.map { it.id } } + fun readByYear(year: Int): List { return experienceRepository.findByYear(year) } - fun readByChildTag(childTag: UUID): List { - return experienceRepository.findByChildTagId(childTag) + fun readByChildTagId(childTagId: UUID): List { + return experienceRepository.findByChildTagId(childTagId) } fun readIdsByTagIds(tagIds: List) : List { diff --git a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/ExperienceTest.kt b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/ExperienceTest.kt index 8a08e59f..734798b0 100644 --- a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/ExperienceTest.kt +++ b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/aggregate/ExperienceTest.kt @@ -98,4 +98,40 @@ class ExperienceTest : FunSpec({ ) } } + + test("역량 키워드 최소 개수 제한 테스트") { + val title = "경험 제목" + val parentTagId: UUID = UUID.randomUUID() + val childTagId: UUID = UUID.randomUUID() + val contents = arrayListOf( + ExperienceContent( + question = "질문 1", + answer = "대답 1" + ), + ExperienceContent( + question = "질문 2", + answer = "대답 2" + ) + ) + val userId : UUID = UUID.randomUUID() + val startedAt = LocalDateTime.now() + val endedAt = startedAt.plusDays(1) + + val experienceStrongPoints = emptyList() + + val exception = shouldThrow { + Experience.create( + title = title, + userId = userId, + parentTagId = parentTagId, + childTagId = childTagId, + contents = contents, + experienceStrongPoints = experienceStrongPoints, + startedAt = startedAt, + endedAt = endedAt, + ) + } + + assert(exception.message == "최소 1개 이상의 역량 키워드를 선택해야 합니다.") + } }) diff --git a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceAppenderTest.kt b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceAppenderTest.kt new file mode 100644 index 00000000..f2d84364 --- /dev/null +++ b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceAppenderTest.kt @@ -0,0 +1,60 @@ +package com.bamyanggang.domainmodule.domain.experience.service + +import com.bamyanggang.domainmodule.domain.experience.aggregate.ExperienceContent +import com.bamyanggang.domainmodule.domain.experience.aggregate.ExperienceStrongPoint +import com.bamyanggang.domainmodule.domain.experience.repository.ExperienceRepository +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.mockk +import io.mockk.verify +import java.time.LocalDateTime +import java.util.* + +class ExperienceAppenderTest : BehaviorSpec({ + val experienceRepository = mockk(relaxed = true) + val experienceAppender = ExperienceAppender(experienceRepository) + + Given("경험 등록 데이터들이 주어졌을 때") { + val title = "경험 제목" + val parentTagId: UUID = UUID.randomUUID() + val childTagId: UUID = UUID.randomUUID() + val contents = arrayListOf( + ExperienceContent( + question = "질문 1", + answer = "대답 1" + ), + ExperienceContent( + question = "질문 2", + answer = "대답 2" + ) + ) + + val experienceStrongPoints: List = arrayListOf( + ExperienceStrongPoint.create( + UUID.randomUUID() + ), + ExperienceStrongPoint.create( + UUID.randomUUID() + ) + ) + val startedAt: LocalDateTime = LocalDateTime.now() + val endedAt: LocalDateTime = startedAt.plusDays(1) + val userId = UUID.randomUUID() + + When("ExperienceAppender.appendExperience를 호출하면") { + val newExperience = experienceAppender.appendExperience( + title = title, + parentTagId = parentTagId, + childTagId = childTagId, + contents = contents, + experienceStrongPoints = experienceStrongPoints, + userId = userId, + startedAt = startedAt, + endedAt = endedAt + ) + + Then("experienceRepository.save가 호출된다.") { + verify { experienceRepository.save(newExperience) } + } + } + } +}) diff --git a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceModifierTest.kt b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceModifierTest.kt new file mode 100644 index 00000000..bdc9ac62 --- /dev/null +++ b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceModifierTest.kt @@ -0,0 +1,62 @@ +package com.bamyanggang.domainmodule.domain.experience.service + +import com.bamyanggang.domainmodule.domain.experience.aggregate.ExperienceContent +import com.bamyanggang.domainmodule.domain.experience.aggregate.ExperienceStrongPoint +import com.bamyanggang.domainmodule.domain.experience.repository.ExperienceRepository +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.mockk +import io.mockk.verify +import java.time.LocalDateTime +import java.util.* + +class ExperienceModifierTest : BehaviorSpec({ + val experienceRepository = mockk(relaxed = true) + val experienceModifier = ExperienceModifier(experienceRepository) + + Given("수정할 경험 등록 데이터들이 주어졌을 때") { + val experienceId = UUID.randomUUID() + val title = "수정한 경험 제목" + val parentTagId: UUID = UUID.randomUUID() + val childTagId: UUID = UUID.randomUUID() + val contents = arrayListOf( + ExperienceContent( + question = "수정한 질문 1", + answer = "수정한 대답 1" + ), + ExperienceContent( + question = "수정한 질문 2", + answer = "수정한 대답 2" + ) + ) + + val experienceStrongPoints: List = arrayListOf( + ExperienceStrongPoint.create( + UUID.randomUUID() + ), + ExperienceStrongPoint.create( + UUID.randomUUID() + ) + ) + val startedAt: LocalDateTime = LocalDateTime.now() + val endedAt: LocalDateTime = startedAt.plusDays(1) + val userId = UUID.randomUUID() + + When("ExperienceModifier.modifyExperience 호출하면") { + val editExperience = experienceModifier.modifyExperience( + experienceId = experienceId, + title = title, + parentTagId = parentTagId, + childTagId = childTagId, + contents = contents, + experienceStrongPoints = experienceStrongPoints, + userId = userId, + startedAt = startedAt, + endedAt = endedAt + ) + + Then("experienceRepository.save가 호출된다.") { + verify { experienceRepository.save(editExperience) } + } + } + } +}) diff --git a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReaderTest.kt b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReaderTest.kt new file mode 100644 index 00000000..bc6a1459 --- /dev/null +++ b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceReaderTest.kt @@ -0,0 +1,236 @@ +package com.bamyanggang.domainmodule.domain.experience.service + +import com.bamyanggang.domainmodule.domain.experience.repository.ExperienceRepository +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.mockk +import io.mockk.verify +import java.time.LocalDate +import java.util.* + +class ExperienceReaderTest : BehaviorSpec({ + val experienceRepository = mockk(relaxed = true) + val experienceReader = ExperienceReader(experienceRepository) + + Given("단건 조회할 경험 id가 주어졌을 때") { + val experienceId = UUID.randomUUID() + + When("ExperienceReader.readExperience 가 호출되면") { + experienceReader.readExperience(experienceId) + + Then("experienceRepository.findByExperienceId 가 호출된다.") { + verify { experienceRepository.findByExperienceId(experienceId) } + } + } + } + + Given("userId가 주어졌을 때") { + val userId = UUID.randomUUID() + + When("ExperienceReader.readAllYearsByExistExperience 가 호출되면") { + experienceReader.readAllYearsByExistExperience(userId) + + Then("ExperienceReader.readAllByUserId 가 호출된다.") { + verify { experienceReader.readAllByUserId(userId) } + } + } + + When("ExperienceReader.readAllByUserId 가 호출되면") { + experienceReader.readAllByUserId(userId) + + Then("experienceRepository.findAllByUserId 가 호출된다.") { + verify { experienceRepository.findAllByUserId(userId) } + } + } + } + + Given("userId와 year가 주어졌을 때") { + val userId = UUID.randomUUID() + val year = LocalDate.now().year + + When("ExperienceReader.readByUserIdAndYearDesc 가 호출되면") { + experienceReader.readByUserIdAndYearDesc( + year = year, + userId = userId) + + Then("experienceRepository.findByUserIdAndYearDesc 가 호출된다.") { + verify { experienceRepository.findByUserIdAndYearDesc( + year = year, + userId = userId) + } + } + } + } + + Given("year와 parentTagId가 주어졌을 때") { + val parentTagId = UUID.randomUUID() + val year = LocalDate.now().year + + When("ExperienceReader.readByYearAndParentTagId 가 호출되면") { + experienceReader.readByYearAndParentTagId( + year = year, + parentTagId = parentTagId + ) + + Then("experienceRepository.findByYearAndParentTagId 가 호출된다.") { + verify { experienceRepository.findByYearAndParentTagId( + year = year, + parentTagId = parentTagId) + } + } + } + } + + Given("userId와 parentTagId가 주어졌을 때") { + val parentTagId = UUID.randomUUID() + val userId = UUID.randomUUID() + + When("ExperienceReader.readByUserIdAndParentTagId 가 호출되면") { + experienceReader.readByUserIdAndParentTagId( + userId = userId, + parentTagId = parentTagId + ) + + Then("experienceRepository.findByYearAndParentTagId 가 호출된다.") { + verify { experienceRepository.findByUserIdAndParentTagId( + userId = userId, + parentTagId = parentTagId) + } + } + } + } + + Given("year와 childTagId가 주어졌을 때") { + val childTagId = UUID.randomUUID() + val year = LocalDate.now().year + + When("ExperienceReader.readByChildTagIdAndYear 가 호출되면") { + experienceReader.readByChildTagIdAndYear( + childTagId = childTagId, + year = year + ) + + Then("experienceRepository.findByYearAndChildTagId 가 호출된다.") { + verify { experienceRepository.findByYearAndChildTagId( + childTagId = childTagId, + year = year) + } + } + } + } + + Given("조회할 experienceId 배열이 주어졌을 때") { + val experienceIds = arrayListOf( + UUID.randomUUID(), + UUID.randomUUID(), + UUID.randomUUID() + ) + + When("ExperienceReader.readByIds 가 호출되면") { + experienceReader.readByIds(experienceIds) + + Then("experienceRepository.findByIds 가 호출된다.") { + verify { experienceRepository.findByIds(experienceIds) } + } + } + } + + Given("userId, search(경험 제목 검색) 문자열이 주어졌을 때") { + val userId = UUID.randomUUID() + val search = "제목 검색 문자열" + + When("ExperienceReader.readIdsByUserIdAndTitleContains 가 호출되면") { + experienceReader.readIdsByUserIdAndTitleContains( + userId = userId, + search = search + ) + + Then("experienceRepository.findByUserIdAndTitleContains 가 호출된다.") { + verify { experienceRepository.findByUserIdAndTitleContains( + userId = userId, + search = search) + } + } + } + } + + Given("userId, search(경험 내용 검색) 검색 문자열이 주어졌을 때") { + val userId = UUID.randomUUID() + val search = "내용 검색 문자열" + + When("ExperienceReader.readIdsByContentsContains 가 호출되면") { + experienceReader.readIdsByContentsContains( + userId = userId, + search = search + ) + + Then("experienceRepository.findAllByUserId 가 호출된다.") { + verify { experienceRepository.findAllByUserId(userId = userId) + } + } + } + } + + Given("year(경험 검색 연도)이 주어졌을 때") { + val year = LocalDate.now().year + + When("ExperienceReader.readByYear 가 호출되면") { + experienceReader.readByYear(year) + + Then("experienceRepository.findByYear 가 호출된다.") { + verify { experienceRepository.findByYear(year) + } + } + } + } + + Given("childTagId가 주어졌을 때") { + val childTagId = UUID.randomUUID() + + When("ExperienceReader.readByChildTag 가 호출되면") { + experienceReader.readByChildTagId(childTagId) + + Then("experienceRepository.findByChildTagId 가 호출된다.") { + verify { experienceRepository.findByChildTagId(childTagId) + } + } + } + } + + Given("태그 id 배열(상, 하위 상관 X)가 주어졌을 때") { + val tagIds = arrayListOf( + UUID.randomUUID(), + UUID.randomUUID(), + UUID.randomUUID() + ) + + When("ExperienceReader.readIdsByTagIds 가 호출되면") { + experienceReader.readIdsByTagIds(tagIds) + + Then("experienceRepository.findByTagIds 가 호출된다.") { + verify { experienceRepository.findByTagIds(tagIds) + } + } + } + } + + Given("유저 id, 역량 키워드 id 배열이 주어졌을 때") { + val userId = UUID.randomUUID() + val strongPointIds = arrayListOf( + UUID.randomUUID(), + UUID.randomUUID(), + UUID.randomUUID() + ) + + When("ExperienceReader.readIdsByStrongPointIds 가 호출되면") { + experienceReader.readIdsByStrongPointIds( + userId = userId, + strongPointIds = strongPointIds + ) + + Then("experienceRepository.findByTagIds 가 호출된다.") { + verify { experienceRepository.findAllByUserId(userId) + } + } + } + } +}) diff --git a/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceRemoverTest.kt b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceRemoverTest.kt new file mode 100644 index 00000000..d0c9238f --- /dev/null +++ b/Domain-Module/src/test/kotlin/com/bamyanggang/domainmodule/domain/experience/service/ExperienceRemoverTest.kt @@ -0,0 +1,24 @@ +package com.bamyanggang.domainmodule.domain.experience.service + +import com.bamyanggang.domainmodule.domain.experience.repository.ExperienceRepository +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.mockk +import io.mockk.verify +import java.util.* + +class ExperienceRemoverTest : BehaviorSpec({ + val experienceRepository = mockk(relaxed = true) + val experienceRemover = ExperienceRemover(experienceRepository) + + Given("삭제할 경험 id가 주어졌을 때") { + val deleteExperienceId = UUID.randomUUID() + + When("ExperienceRemover.remove가 호출되면") { + experienceRemover.remove(deleteExperienceId) + + Then("experienceRepository.deleteByExperienceId가 호출된다.") { + verify { experienceRepository.deleteByExperienceId(deleteExperienceId) } + } + } + } +})