From 8efa9646ef390c22b7109dd6479077abc6dce5e2 Mon Sep 17 00:00:00 2001 From: coli Date: Mon, 29 Jun 2026 18:39:52 +0900 Subject: [PATCH 1/3] =?UTF-8?q?chore:=20=ED=9A=8C=EC=9B=90=EC=9A=A9=20api?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../debatetimer/controller/customize/CustomizeController.java | 2 +- .../com/debatetimer/service/customize/CustomizeService.java | 2 +- .../controller/customize/CustomizeDocumentTest.java | 4 ++-- .../debatetimer/service/customize/CustomizeServiceTest.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/debatetimer/controller/customize/CustomizeController.java b/src/main/java/com/debatetimer/controller/customize/CustomizeController.java index 6716d9f1..5577cec7 100644 --- a/src/main/java/com/debatetimer/controller/customize/CustomizeController.java +++ b/src/main/java/com/debatetimer/controller/customize/CustomizeController.java @@ -39,7 +39,7 @@ public CustomizeTableResponse getTable( @PathVariable Long tableId, @AuthMember Member member ) { - return customizeService.findTable(tableId, member); + return customizeService.findMemberTable(tableId, member); } @PutMapping("/api/table/customize/{tableId}") diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index d143b908..6e978bdc 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -26,7 +26,7 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques } @Transactional(readOnly = true) - public CustomizeTableResponse findTable(long tableId, Member member) { + public CustomizeTableResponse findMemberTable(long tableId, Member member) { CustomizeTable table = customizeTableDomainRepository.getByIdAndMember(tableId, member); List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes(tableId, member); return new CustomizeTableResponse(table, timeBoxes); diff --git a/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java b/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java index dc565166..1350bfaa 100644 --- a/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/customize/CustomizeDocumentTest.java @@ -263,7 +263,7 @@ class GetTable { null, null, 360, null, null) ) ); - doReturn(response).when(customizeService).findTable(eq(tableId), any()); + doReturn(response).when(customizeService).findMemberTable(eq(tableId), any()); var document = document("customize/get", 200) .request(requestDocument) @@ -282,7 +282,7 @@ class GetTable { @EnumSource(value = ClientErrorCode.class, names = {"TABLE_NOT_FOUND"}) void 사용자_지정_테이블_조회_실패(ClientErrorCode errorCode) { long tableId = 5L; - doThrow(new DTClientErrorException(errorCode)).when(customizeService).findTable(eq(tableId), any()); + doThrow(new DTClientErrorException(errorCode)).when(customizeService).findMemberTable(eq(tableId), any()); var document = document("customize/get", errorCode) .request(requestDocument) diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index 3013abeb..f2bbb85a 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -76,7 +76,7 @@ class FindTable { bellEntityGenerator.generate(customizeTimeBox, BellType.AFTER_START, 1, 1); bellEntityGenerator.generate(customizeTimeBox, BellType.AFTER_START, 1, 2); - CustomizeTableResponse foundResponse = customizeService.findTable(chanTable.getId(), chan); + CustomizeTableResponse foundResponse = customizeService.findMemberTable(chanTable.getId(), chan); assertAll( () -> assertThat(foundResponse.id()).isEqualTo(chanTable.getId()), @@ -93,7 +93,7 @@ class FindTable { CustomizeTableEntity chanTable = customizeTableEntityGenerator.generate(chan); long chanTableId = chanTable.getId(); - assertThatThrownBy(() -> customizeService.findTable(chanTableId, coli)) + assertThatThrownBy(() -> customizeService.findMemberTable(chanTableId, coli)) .isInstanceOf(DTClientErrorException.class) .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); } From 4c779280b387fa3e0afc0d06cf2f1be5907daf29 Mon Sep 17 00:00:00 2001 From: coli Date: Mon, 29 Jun 2026 18:47:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EB=B9=84=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EC=9A=A9=20=EC=A1=B0=ED=9A=8C=EB=A9=94=EC=84=9C=EB=93=9C=20fin?= =?UTF-8?q?dTable=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharing/SharingRestController.java | 11 +++++++++++ .../CustomizeTableDomainRepository.java | 16 +++++++++++++++- .../customize/CustomizeTableRepository.java | 5 +++++ .../service/customize/CustomizeService.java | 11 +++++++++-- .../CustomizeTableDomainRepositoryTest.java | 4 ++-- 5 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/debatetimer/controller/sharing/SharingRestController.java b/src/main/java/com/debatetimer/controller/sharing/SharingRestController.java index 51636c00..1fbc659e 100644 --- a/src/main/java/com/debatetimer/controller/sharing/SharingRestController.java +++ b/src/main/java/com/debatetimer/controller/sharing/SharingRestController.java @@ -3,11 +3,14 @@ import com.debatetimer.controller.auth.AuthMember; import com.debatetimer.controller.tool.jwt.AuthManager; import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.response.CustomizeTableResponse; import com.debatetimer.dto.sharing.response.ChairmanTokenResponse; import com.debatetimer.service.customize.CustomizeService; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @RestController @@ -26,4 +29,12 @@ public ChairmanTokenResponse issueChairmanToken( String chairmanToken = authManager.issueChairmanToken(member, debateTime * 2); return new ChairmanTokenResponse(chairmanToken); } + + @GetMapping("/api/live/table/customize/{tableId}") + @ResponseStatus(HttpStatus.OK) + public CustomizeTableResponse getTable( + @PathVariable long tableId + ) { + return customizeService.findTable(tableId); + } } diff --git a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java index 0132389d..1f1c1e04 100644 --- a/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java +++ b/src/main/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepository.java @@ -54,13 +54,27 @@ public CustomizeTable getByIdAndMember(long tableId, Member member) { } @Transactional(readOnly = true) - public List getCustomizeTimeBoxes(long tableId, Member member) { + public CustomizeTable getById(long tableId) { + return tableRepository.getById(tableId) + .toDomain(); + } + + @Transactional(readOnly = true) + public List getMemberCustomizeTimeBoxes(long tableId, Member member) { CustomizeTableEntity tableEntity = tableRepository.getByIdAndMember(tableId, member); List timeBoxEntityList = timeBoxRepository.findAllByCustomizeTable(tableEntity); List bellEntityList = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxEntityList); return toCustomizeTimeBoxes(timeBoxEntityList, bellEntityList); } + @Transactional(readOnly = true) + public List getCustomizeTimeBoxes(long tableId) { + CustomizeTableEntity tableEntity = tableRepository.getById(tableId); + List timeBoxEntityList = timeBoxRepository.findAllByCustomizeTable(tableEntity); + List bellEntityList = bellRepository.findAllByCustomizeTimeBoxIn(timeBoxEntityList); + return toCustomizeTimeBoxes(timeBoxEntityList, bellEntityList); + } + @Transactional(readOnly = true) public long getTotalTimeBoxTimes(long tableId) { return timeBoxRepository.sumTimeByTableId(tableId); diff --git a/src/main/java/com/debatetimer/repository/customize/CustomizeTableRepository.java b/src/main/java/com/debatetimer/repository/customize/CustomizeTableRepository.java index bf00c3c8..00f32b0f 100644 --- a/src/main/java/com/debatetimer/repository/customize/CustomizeTableRepository.java +++ b/src/main/java/com/debatetimer/repository/customize/CustomizeTableRepository.java @@ -23,5 +23,10 @@ default CustomizeTableEntity getByIdAndMember(long tableId, Member member) { .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); } + default CustomizeTableEntity getById(long tableId) { + return findById(tableId) + .orElseThrow(() -> new DTClientErrorException(ClientErrorCode.TABLE_NOT_FOUND)); + } + void delete(CustomizeTableEntity table); } diff --git a/src/main/java/com/debatetimer/service/customize/CustomizeService.java b/src/main/java/com/debatetimer/service/customize/CustomizeService.java index 6e978bdc..d5e27d7c 100644 --- a/src/main/java/com/debatetimer/service/customize/CustomizeService.java +++ b/src/main/java/com/debatetimer/service/customize/CustomizeService.java @@ -28,7 +28,14 @@ public CustomizeTableResponse save(CustomizeTableCreateRequest tableCreateReques @Transactional(readOnly = true) public CustomizeTableResponse findMemberTable(long tableId, Member member) { CustomizeTable table = customizeTableDomainRepository.getByIdAndMember(tableId, member); - List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes(tableId, member); + List timeBoxes = customizeTableDomainRepository.getMemberCustomizeTimeBoxes(tableId, member); + return new CustomizeTableResponse(table, timeBoxes); + } + + @Transactional(readOnly = true) + public CustomizeTableResponse findTable(long tableId) { + CustomizeTable table = customizeTableDomainRepository.getById(tableId); + List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes(tableId); return new CustomizeTableResponse(table, timeBoxes); } @@ -54,7 +61,7 @@ public CustomizeTableResponse updateTable( @Transactional public CustomizeTableResponse updateUsedAt(long tableId, Member member) { CustomizeTable table = customizeTableDomainRepository.updateUsedAt(tableId, member); - List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes(tableId, member); + List timeBoxes = customizeTableDomainRepository.getMemberCustomizeTimeBoxes(tableId, member); return new CustomizeTableResponse(table, timeBoxes); } diff --git a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java index e1dbbf53..08a3df7c 100644 --- a/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java +++ b/src/test/java/com/debatetimer/domainrepository/customize/CustomizeTableDomainRepositoryTest.java @@ -75,7 +75,7 @@ class GetCustomizeTimeBoxes { timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 2, 180); timeBoxEntityGenerator.generate(tableEntity, CustomizeBoxType.NORMAL, 3, 120); - List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( + List timeBoxes = customizeTableDomainRepository.getMemberCustomizeTimeBoxes( tableEntity.getId(), member); assertThat(timeBoxes).hasSize(3) @@ -95,7 +95,7 @@ class GetCustomizeTimeBoxes { bellEntityGenerator.generate(timeBoxEntity1, BellType.BEFORE_END, 30, 1); bellEntityGenerator.generate(timeBoxEntity2, BellType.BEFORE_END, 10, 1); - List timeBoxes = customizeTableDomainRepository.getCustomizeTimeBoxes( + List timeBoxes = customizeTableDomainRepository.getMemberCustomizeTimeBoxes( tableEntity.getId(), member); assertAll( From 1088eaef55e270c5bdfc98951397b50f83b6ebf0 Mon Sep 17 00:00:00 2001 From: coli Date: Mon, 29 Jun 2026 19:00:45 +0900 Subject: [PATCH 3/3] =?UTF-8?q?test:=20=EB=B9=84=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharing/SharingDocumentTest.java | 112 ++++++++++++++++++ .../sharing/SharingRestControllerTest.java | 51 ++++++++ .../customize/CustomizeServiceTest.java | 33 ++++++ 3 files changed, 196 insertions(+) create mode 100644 src/test/java/com/debatetimer/controller/sharing/SharingRestControllerTest.java diff --git a/src/test/java/com/debatetimer/controller/sharing/SharingDocumentTest.java b/src/test/java/com/debatetimer/controller/sharing/SharingDocumentTest.java index ac234072..afa7873a 100644 --- a/src/test/java/com/debatetimer/controller/sharing/SharingDocumentTest.java +++ b/src/test/java/com/debatetimer/controller/sharing/SharingDocumentTest.java @@ -3,7 +3,12 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.payload.JsonFieldType.ARRAY; +import static org.springframework.restdocs.payload.JsonFieldType.BOOLEAN; +import static org.springframework.restdocs.payload.JsonFieldType.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.OBJECT; import static org.springframework.restdocs.payload.JsonFieldType.STRING; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; @@ -12,10 +17,23 @@ import com.debatetimer.controller.RestDocumentationRequest; import com.debatetimer.controller.RestDocumentationResponse; import com.debatetimer.controller.Tag; +import com.debatetimer.domain.customize.BellType; +import com.debatetimer.domain.customize.CustomizeBoxType; +import com.debatetimer.domain.customize.Stance; import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.response.BellResponse; +import com.debatetimer.dto.customize.response.CustomizeTableInfoResponse; +import com.debatetimer.dto.customize.response.CustomizeTableResponse; +import com.debatetimer.dto.customize.response.CustomizeTimeBoxResponse; +import com.debatetimer.dto.member.TableType; +import com.debatetimer.exception.custom.DTClientErrorException; +import com.debatetimer.exception.errorcode.ClientErrorCode; import io.restassured.http.ContentType; +import java.util.List; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.springframework.http.HttpHeaders; public class SharingDocumentTest extends BaseDocumentTest { @@ -56,4 +74,98 @@ class IssueChairmanToken { .then().statusCode(200); } } + + @Nested + class GetTable { + + private final RestDocumentationRequest requestDocument = request() + .tag(Tag.SHARING_API) + .summary("비회원용 사용자 지정 토론 시간표 조회") + .description(""" + ### 타임 박스 종류에 따른 웅답 값 + | 타임 박스 종류 | 필수 입력 | 선택 입력 | null 입력 | + | :---: | ---| --- | --- | + | 커스텀 타임 박스 | stance, speechType, boxType, time | speaker | timePerTeam, timePerSpeaking | + | 자유 토론 타임 박스 | stance, speechType, boxType, timePerTeam | speaker, timePerSpeaking | time | + """) + .pathParameter( + parameterWithName("tableId").description("테이블 ID") + ); + + private final RestDocumentationResponse responseDocument = response() + .responseBodyField( + fieldWithPath("id").type(NUMBER).description("테이블 ID"), + fieldWithPath("info").type(OBJECT).description("토론 테이블 정보"), + fieldWithPath("info.name").type(STRING).description("테이블 이름"), + fieldWithPath("info.agenda").type(STRING).description("토론 주제"), + fieldWithPath("info.type").type(STRING).description("토론 테이블 유형"), + fieldWithPath("info.prosTeamName").type(STRING).description("찬성팀 팀명"), + fieldWithPath("info.consTeamName").type(STRING).description("반대팀 팀명"), + fieldWithPath("info.warningBell").type(BOOLEAN).description("30초 종소리 유무"), + fieldWithPath("info.finishBell").type(BOOLEAN).description("발언 종료 종소리 유무"), + fieldWithPath("table").type(ARRAY).description("토론 테이블 구성"), + fieldWithPath("table[].stance").type(STRING).description("입장"), + fieldWithPath("table[].speechType").type(STRING).description("발언 유형"), + fieldWithPath("table[].boxType").type(STRING).description("타임 박스 유형"), + fieldWithPath("table[].time").type(NUMBER).description("발언 시간(초)").optional(), + fieldWithPath("table[].bell").type(ARRAY).description("종소리 정보").optional(), + fieldWithPath("table[].bell[].type").type(STRING).description("종소리 종류"), + fieldWithPath("table[].bell[].time").type(NUMBER).description("종소리 울릴 시간(초)"), + fieldWithPath("table[].bell[].count").type(NUMBER).description("종소리 횟수"), + fieldWithPath("table[].timePerTeam").type(NUMBER).description("팀당 발언 시간 (초)").optional(), + fieldWithPath("table[].timePerSpeaking").type(NUMBER).description("1회 발언 시간 (초)").optional(), + fieldWithPath("table[].speaker").type(STRING).description("발언자 이름").optional() + ); + + @Test + void 비회원_사용자_지정_테이블_조회_성공() { + long tableId = 5L; + CustomizeTableResponse response = new CustomizeTableResponse( + 5L, + new CustomizeTableInfoResponse("나의 테이블", TableType.CUSTOMIZE, "토론 주제", + "찬성", "반대", true, true), + List.of( + new CustomizeTimeBoxResponse(Stance.PROS, "입론", CustomizeBoxType.NORMAL, + 120, List.of(new BellResponse(BellType.AFTER_START, 90, 1)), null, null, "콜리"), + new CustomizeTimeBoxResponse(Stance.CONS, "입론", CustomizeBoxType.NORMAL, + 120, List.of(new BellResponse(BellType.AFTER_START, 90, 1), + new BellResponse(BellType.AFTER_START, 120, 2)), null, null, "비토"), + new CustomizeTimeBoxResponse(Stance.NEUTRAL, "난상 토론", CustomizeBoxType.TIME_BASED, + null, null, 360, 120, null), + new CustomizeTimeBoxResponse(Stance.NEUTRAL, "존중 토론", CustomizeBoxType.TIME_BASED, + null, null, 360, null, null) + ) + ); + doReturn(response).when(customizeService).findTable(eq(tableId)); + + var document = document("sharing/get_table", 200) + .request(requestDocument) + .response(responseDocument) + .build(); + + given(document) + .contentType(ContentType.JSON) + .pathParam("tableId", tableId) + .when().get("/api/live/table/customize/{tableId}") + .then().statusCode(200); + } + + @ParameterizedTest + @EnumSource(value = ClientErrorCode.class, names = {"TABLE_NOT_FOUND"}) + void 비회원_사용자_지정_테이블_조회_실패(ClientErrorCode errorCode) { + long tableId = 5L; + doThrow(new DTClientErrorException(errorCode)).when(customizeService).findTable(eq(tableId)); + + var document = document("sharing/get_table", errorCode) + .request(requestDocument) + .response(ERROR_RESPONSE) + .build(); + + given(document) + .contentType(ContentType.JSON) + .pathParam("tableId", tableId) + .when().get("/api/live/table/customize/{tableId}") + .then().statusCode(errorCode.getStatus().value()); + } + } } diff --git a/src/test/java/com/debatetimer/controller/sharing/SharingRestControllerTest.java b/src/test/java/com/debatetimer/controller/sharing/SharingRestControllerTest.java new file mode 100644 index 00000000..4187f8fb --- /dev/null +++ b/src/test/java/com/debatetimer/controller/sharing/SharingRestControllerTest.java @@ -0,0 +1,51 @@ +package com.debatetimer.controller.sharing; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.debatetimer.controller.BaseControllerTest; +import com.debatetimer.domain.customize.CustomizeBoxType; +import com.debatetimer.domain.member.Member; +import com.debatetimer.dto.customize.response.CustomizeTableResponse; +import com.debatetimer.entity.customize.CustomizeTableEntity; +import io.restassured.http.ContentType; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class SharingRestControllerTest extends BaseControllerTest { + + @Nested + class GetTable { + + @Test + void 비회원이_사용자_지정_테이블을_조회한다() { + Member bito = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity bitoTable = customizeTableEntityGenerator.generate(bito); + customizeTimeBoxEntityGenerator.generate(bitoTable, CustomizeBoxType.NORMAL, 1); + customizeTimeBoxEntityGenerator.generateNotExistSpeaker(bitoTable, CustomizeBoxType.NORMAL, 2); + + CustomizeTableResponse response = given() + .contentType(ContentType.JSON) + .pathParam("tableId", bitoTable.getId()) + .when().get("/api/live/table/customize/{tableId}") + .then().statusCode(200) + .extract().as(CustomizeTableResponse.class); + + assertAll( + () -> assertThat(response.id()).isEqualTo(bitoTable.getId()), + () -> assertThat(response.table()).hasSize(2) + ); + } + + @Test + void 존재하지_않는_테이블을_조회하면_예외가_발생한다() { + long notExistTableId = 999L; + + given() + .contentType(ContentType.JSON) + .pathParam("tableId", notExistTableId) + .when().get("/api/live/table/customize/{tableId}") + .then().statusCode(404); + } + } +} diff --git a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java index f2bbb85a..2175ac6c 100644 --- a/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java +++ b/src/test/java/com/debatetimer/service/customize/CustomizeServiceTest.java @@ -99,6 +99,39 @@ class FindTable { } } + @Nested + class FindTableForGuest { + + @Test + void 비회원이_사용자_지정_토론_테이블을_조회한다() { + Member chan = memberGenerator.generate("default@gmail.com"); + CustomizeTableEntity chanTable = customizeTableEntityGenerator.generate(chan); + CustomizeTimeBoxEntity customizeTimeBox = customizeTimeBoxEntityGenerator.generate( + chanTable, CustomizeBoxType.NORMAL, 1); + customizeTimeBoxEntityGenerator.generate(chanTable, CustomizeBoxType.NORMAL, 2); + bellEntityGenerator.generate(customizeTimeBox, BellType.AFTER_START, 1, 1); + bellEntityGenerator.generate(customizeTimeBox, BellType.AFTER_START, 1, 2); + + CustomizeTableResponse foundResponse = customizeService.findTable(chanTable.getId()); + + assertAll( + () -> assertThat(foundResponse.id()).isEqualTo(chanTable.getId()), + () -> assertThat(foundResponse.table()).hasSize(2), + () -> assertThat(foundResponse.table().get(0).bell()).hasSize(2), + () -> assertThat(foundResponse.table().get(1).bell()).isNull() + ); + } + + @Test + void 존재하지_않는_테이블_조회_시_예외를_발생시킨다() { + long notExistTableId = 999L; + + assertThatThrownBy(() -> customizeService.findTable(notExistTableId)) + .isInstanceOf(DTClientErrorException.class) + .hasMessage(ClientErrorCode.TABLE_NOT_FOUND.getMessage()); + } + } + @Nested class FindDebateTime {