From b6d7b2b7c0a8a5c431576887f451ab95d4a0cc46 Mon Sep 17 00:00:00 2001 From: ekzm8523 Date: Sun, 14 Jan 2024 16:16:40 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20StandardAnswer=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=EC=8B=9C=20=EA=B8=B0=EC=A1=B4=20StandardAnsw?= =?UTF-8?q?er=20=EC=82=AD=EC=A0=9C=20=EC=95=88=20=EB=90=98=EB=8D=98=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csbroker/apiserver/model/LongProblem.kt | 17 +++++- .../admin/AdminLongProblemServiceImpl.kt | 12 ----- ...minLongProblemControllerIntegrationTest.kt | 52 +++++++++++++++++++ 3 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt diff --git a/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt b/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt index 1192ee15..9ca815ec 100644 --- a/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt +++ b/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt @@ -25,7 +25,7 @@ class LongProblem( @OneToMany(mappedBy = "problem", cascade = [CascadeType.ALL]) var userAnswers: MutableList = mutableListOf(), - @OneToMany(mappedBy = "longProblem", cascade = [CascadeType.ALL]) + @OneToMany(mappedBy = "longProblem", cascade = [CascadeType.ALL], orphanRemoval = true) var standardAnswers: MutableList = mutableListOf(), ) : Problem( title = title, @@ -45,6 +45,7 @@ class LongProblem( description = upsertRequestDto.description isGradable = upsertRequestDto.isGradable isActive = upsertRequestDto.isActive + updateStandardAnswers(upsertRequestDto.standardAnswers) } fun toLongProblemResponseDto(): LongProblemResponseDto { @@ -111,4 +112,18 @@ class LongProblem( problemBookmark.any { it.user.email == email }, ) } + + fun updateStandardAnswers(standardAnswers: List) { + if (this.standardAnswers.map { it.content }.toSet() != standardAnswers.toSet()) { + this.standardAnswers.clear() + this.standardAnswers.addAll( + standardAnswers.map { + StandardAnswer( + content = it, + longProblem = this, + ) + }, + ) + } + } } diff --git a/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt b/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt index 7c663f34..0f6b0e9d 100644 --- a/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt +++ b/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt @@ -71,18 +71,6 @@ class AdminLongProblemServiceImpl( ?: throw EntityNotFoundException("${id}번 문제는 존재하지 않는 서술형 문제입니다.") val gradingStandardList = updateRequestDto.getGradingStandardList(longProblem) - if (longProblem.standardAnswers.map { it.content }.toSet() != updateRequestDto.standardAnswers.toSet()) { - standardAnswerRepository.deleteAllByLongProblem(longProblem) - standardAnswerRepository.saveAll( - updateRequestDto.standardAnswers.map { - StandardAnswer( - content = it, - longProblem = longProblem, - ) - }, - ) - } - if (longProblem.gradingStandards.map { it.content }.toSet() != gradingStandardList.map { it.content }.toSet()) { gradingStandardRepository.deleteAllById(longProblem.gradingStandards.map { it.id }) longProblem.addGradingStandards(gradingStandardList) diff --git a/src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt b/src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt new file mode 100644 index 00000000..af94c377 --- /dev/null +++ b/src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt @@ -0,0 +1,52 @@ +package io.csbroker.apiserver.controller.v1.admin.problem + +import io.csbroker.apiserver.controller.IntegrationTest +import io.csbroker.apiserver.dto.problem.longproblem.LongProblemUpsertRequestDto +import io.csbroker.apiserver.model.LongProblem +import io.csbroker.apiserver.model.StandardAnswer +import io.csbroker.apiserver.model.Tag +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test + +import org.springframework.http.HttpMethod +import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status + +class AdminLongProblemControllerIntegrationTest : IntegrationTest() { + + @Test + fun `문제 업데이트`() { + // given + val problem = save( + LongProblem( + title = "문제 제목", + description = "문제 설명", + creator = adminUser, + ), + ) + save(StandardAnswer(content = "삭제될 모범 답안", longProblem = problem)) + save(Tag(name="tag1")) + val updateRequestDto = LongProblemUpsertRequestDto( + title = "Test problem", + description = "This is a test problem", + tags = mutableListOf("tag1"), + standardAnswers = listOf("업데이트될 모범 답안"), + gradingStandards = mutableListOf(), + ) + + // when + val response = request( + method = HttpMethod.PUT, + url = "/api/admin/problems/long/${problem.id}", + isAdmin = true, + body = updateRequestDto, + ) + + // then + response.andExpect(status().isOk) + .andExpect { + val standardAnswers = findAll("SELECT s FROM StandardAnswer s where s.longProblem.id = :id", mapOf("id" to problem.id)) + standardAnswers.map { it.content }.toSet() shouldBe updateRequestDto.standardAnswers.toSet() + } + + } +}