From 76150ad16783b40f0055fed7ed8a54ea64747441 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Thu, 18 Jan 2024 00:04:02 +0900 Subject: [PATCH 01/22] =?UTF-8?q?[CHORE]=20Rest=20Docs=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 221f4119..1f97f835 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,11 @@ plugins { id 'java' id 'org.springframework.boot' version '3.1.4' id 'io.spring.dependency-management' version '1.1.3' + id "org.asciidoctor.jvm.convert" version '3.3.2' +} + +configurations { + asciidoctorExt } group = 'com.sports' @@ -56,12 +61,34 @@ dependencies { testImplementation "org.testcontainers:testcontainers:1.19.3" testImplementation "org.testcontainers:junit-jupiter:1.19.3" testImplementation "org.testcontainers:mysql:1.19.3" + + // rest docs + asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor' + testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' +} + +ext { + snippetsDir = file('build/generated-snippets') } -tasks.named('test') { +test { + outputs.dir snippetsDir useJUnitPlatform() } -jar { - enabled = false +asciidoctor { + configurations 'asciidoctorExt' + inputs.dir snippetsDir + dependsOn test } + +tasks.register('copyDocument', Copy) { // 8 + dependsOn asciidoctor + + from file("build/docs/asciidoc") + into file("src/main/resources/static/docs") +} + +bootJar { + dependsOn copyDocument +} \ No newline at end of file From f7a9703801dbd0966d67088415faefca77c9884c Mon Sep 17 00:00:00 2001 From: Jin409 Date: Thu, 18 Jan 2024 00:10:26 +0900 Subject: [PATCH 02/22] =?UTF-8?q?[FEAT]=20RestDocumentationResultHandler?= =?UTF-8?q?=20=EB=B9=88=EC=9C=BC=EB=A1=9C=20=EB=93=B1=EB=A1=9D=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/support/config/RestDocsConfig.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/com/sports/server/support/config/RestDocsConfig.java diff --git a/src/test/java/com/sports/server/support/config/RestDocsConfig.java b/src/test/java/com/sports/server/support/config/RestDocsConfig.java new file mode 100644 index 00000000..b33cd7b9 --- /dev/null +++ b/src/test/java/com/sports/server/support/config/RestDocsConfig.java @@ -0,0 +1,20 @@ +package com.sports.server.support.config; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.restdocs.operation.preprocess.Preprocessors; + +@TestConfiguration +public class RestDocsConfig { + + @Bean + public RestDocumentationResultHandler write() { + return MockMvcRestDocumentation.document( + "{class-name}/{method-name}", + Preprocessors.preprocessRequest(Preprocessors.prettyPrint()), + Preprocessors.preprocessResponse(Preprocessors.prettyPrint()) + ); + } +} \ No newline at end of file From faa7b93a406c0ec5c7a9049e595c5bf9cd000c76 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Thu, 18 Jan 2024 00:12:56 +0900 Subject: [PATCH 03/22] =?UTF-8?q?[FEAT]=20AcceptanceTest=20=EC=97=90=20Res?= =?UTF-8?q?t=20Docs=20=EA=B4=80=EB=A0=A8=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sports/server/support/AcceptanceTest.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/sports/server/support/AcceptanceTest.java b/src/test/java/com/sports/server/support/AcceptanceTest.java index 806f3f61..65dc4122 100644 --- a/src/test/java/com/sports/server/support/AcceptanceTest.java +++ b/src/test/java/com/sports/server/support/AcceptanceTest.java @@ -2,26 +2,47 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; import com.sports.server.command.report.infrastructure.ReportCheckClient; import com.sports.server.support.config.AsyncTestConfig; +import com.sports.server.support.config.RestDocsConfig; import com.sports.server.support.isolation.DatabaseIsolation; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; import java.util.List; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Import; import org.springframework.http.ResponseEntity; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.filter.CharacterEncodingFilter; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Import(AsyncTestConfig.class) @DatabaseIsolation +@AutoConfigureMockMvc +@ExtendWith(RestDocumentationExtension.class) +@Import({AsyncTestConfig.class, RestDocsConfig.class}) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class AcceptanceTest { + @Autowired + protected RestDocumentationResultHandler restDocsHandler; + + @Autowired + protected MockMvc mockMvc; + @LocalServerPort protected int port; @@ -29,11 +50,21 @@ public class AcceptanceTest { protected ReportCheckClient reportCheckClient; @BeforeEach - void setUp() { + void setUp( + final WebApplicationContext context, + final RestDocumentationContextProvider restDocumentation + ) { RestAssured.port = port; given(reportCheckClient.check(any())) .willReturn(ResponseEntity.ok().build()); + + this.mockMvc = MockMvcBuilders.webAppContextSetup(context) + .apply(documentationConfiguration(restDocumentation)) + .alwaysDo(MockMvcResultHandlers.print()) + .alwaysDo(restDocsHandler) + .addFilters(new CharacterEncodingFilter("UTF-8", true)) + .build(); } protected List toResponses(ExtractableResponse response, From 5875815db56c6dddf21fc56aa10be8b27a668595 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Thu, 18 Jan 2024 01:27:56 +0900 Subject: [PATCH 04/22] =?UTF-8?q?[TEST]=20=EC=9D=B8=EC=88=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=99=80=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B6=84=EB=A6=AC=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sports/server/support/AcceptanceTest.java | 34 +------------- .../sports/server/support/ControllerTest.java | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 src/test/java/com/sports/server/support/ControllerTest.java diff --git a/src/test/java/com/sports/server/support/AcceptanceTest.java b/src/test/java/com/sports/server/support/AcceptanceTest.java index 65dc4122..a8bf275f 100644 --- a/src/test/java/com/sports/server/support/AcceptanceTest.java +++ b/src/test/java/com/sports/server/support/AcceptanceTest.java @@ -2,47 +2,26 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; import com.sports.server.command.report.infrastructure.ReportCheckClient; import com.sports.server.support.config.AsyncTestConfig; -import com.sports.server.support.config.RestDocsConfig; import com.sports.server.support.isolation.DatabaseIsolation; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Import; import org.springframework.http.ResponseEntity; -import org.springframework.restdocs.RestDocumentationContextProvider; -import org.springframework.restdocs.RestDocumentationExtension; -import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.result.MockMvcResultHandlers; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.filter.CharacterEncodingFilter; @DatabaseIsolation -@AutoConfigureMockMvc -@ExtendWith(RestDocumentationExtension.class) -@Import({AsyncTestConfig.class, RestDocsConfig.class}) +@Import(AsyncTestConfig.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class AcceptanceTest { - @Autowired - protected RestDocumentationResultHandler restDocsHandler; - - @Autowired - protected MockMvc mockMvc; - @LocalServerPort protected int port; @@ -51,20 +30,11 @@ public class AcceptanceTest { @BeforeEach void setUp( - final WebApplicationContext context, - final RestDocumentationContextProvider restDocumentation ) { RestAssured.port = port; given(reportCheckClient.check(any())) .willReturn(ResponseEntity.ok().build()); - - this.mockMvc = MockMvcBuilders.webAppContextSetup(context) - .apply(documentationConfiguration(restDocumentation)) - .alwaysDo(MockMvcResultHandlers.print()) - .alwaysDo(restDocsHandler) - .addFilters(new CharacterEncodingFilter("UTF-8", true)) - .build(); } protected List toResponses(ExtractableResponse response, @@ -78,4 +48,4 @@ protected T toResponse(ExtractableResponse response, return response.jsonPath() .getObject(".", dtoType); } -} +} \ No newline at end of file diff --git a/src/test/java/com/sports/server/support/ControllerTest.java b/src/test/java/com/sports/server/support/ControllerTest.java new file mode 100644 index 00000000..e672bc80 --- /dev/null +++ b/src/test/java/com/sports/server/support/ControllerTest.java @@ -0,0 +1,45 @@ +package com.sports.server.support; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; + +import com.sports.server.support.config.RestDocsConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.context.annotation.Import; +import org.springframework.restdocs.RestDocumentationContextProvider; +import org.springframework.restdocs.RestDocumentationExtension; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.filter.CharacterEncodingFilter; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; + +@AutoConfigureRestDocs +@Import(RestDocsConfig.class) +@ExtendWith(RestDocumentationExtension.class) +public class ControllerTest { + @Autowired + protected RestDocumentationResultHandler restDocsHandler; + + @Autowired + protected MockMvc mockMvc; + + @Autowired + protected ObjectMapper objectMapper; + + @BeforeEach + void setUp( + final WebApplicationContext context, + final RestDocumentationContextProvider restDocumentation) { + this.mockMvc = MockMvcBuilders.webAppContextSetup(context) + .apply(documentationConfiguration(restDocumentation)) + .alwaysDo(MockMvcResultHandlers.print()) + .alwaysDo(restDocsHandler) + .addFilters(new CharacterEncodingFilter("UTF-8", true)) + .build(); + } +} From 8310407e320bc3a642499f6171fd305597de9dc1 Mon Sep 17 00:00:00 2001 From: does Date: Fri, 19 Jan 2024 20:32:23 +0900 Subject: [PATCH 05/22] =?UTF-8?q?[TEST]=20api=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=99=98=EA=B2=BD=20?= =?UTF-8?q?=EA=B5=AC=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 + src/docs/asciidoc/api.adoc | 11 + src/main/resources/static/docs/api.html | 536 ++++++++++++++++++ .../presentation/CheerTalkControllerTest.java | 37 ++ .../sports/server/support/ControllerTest.java | 45 -- .../server/support/DocumentationTest.java | 62 ++ 6 files changed, 650 insertions(+), 45 deletions(-) create mode 100644 src/docs/asciidoc/api.adoc create mode 100644 src/main/resources/static/docs/api.html create mode 100644 src/test/java/com/sports/server/command/cheertalk/presentation/CheerTalkControllerTest.java delete mode 100644 src/test/java/com/sports/server/support/ControllerTest.java create mode 100644 src/test/java/com/sports/server/support/DocumentationTest.java diff --git a/build.gradle b/build.gradle index 1f97f835..264334fb 100644 --- a/build.gradle +++ b/build.gradle @@ -89,6 +89,10 @@ tasks.register('copyDocument', Copy) { // 8 into file("src/main/resources/static/docs") } +asciidoctor.doFirst { + delete file('src/main/resources/static/docs') +} + bootJar { dependsOn copyDocument } \ No newline at end of file diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc new file mode 100644 index 00000000..077b9dc1 --- /dev/null +++ b/src/docs/asciidoc/api.adoc @@ -0,0 +1,11 @@ += 훕치치 관객 서버 API 문서 +:doctype: book +:icons: font +:source-highlighter: highlightjs +:toc: left +:toclevels: 1 +:sectlinks: + += 응원톡 API +== 응원톡 저장 +operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-request,request-fields,http-response'] diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html new file mode 100644 index 00000000..af5df696 --- /dev/null +++ b/src/main/resources/static/docs/api.html @@ -0,0 +1,536 @@ + + + + + + + +훕치치 관객 서버 API 문서 + + + + + + + +
+

응원톡 API

+
+

응원톡 저장

+
+
+

HTTP request

+
+
+
POST /cheer-talks HTTP/1.1
+Content-Type: application/json;charset=UTF-8
+Content-Length: 53
+Host: localhost:8080
+
+{
+  "content" : "응원해요~",
+  "gameTeamId" : 1
+}
+
+
+
+
+

Request fields

+ +++++ + + + + + + + + + + + + + + + + + + + +
PathTypeDescription

content

String

응원톡의 내용

gameTeamId

Number

응원하는 게임팀

+
+
+

HTTP response

+
+
+
HTTP/1.1 200 OK
+Vary: Origin
+Vary: Access-Control-Request-Method
+Vary: Access-Control-Request-Headers
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/test/java/com/sports/server/command/cheertalk/presentation/CheerTalkControllerTest.java b/src/test/java/com/sports/server/command/cheertalk/presentation/CheerTalkControllerTest.java new file mode 100644 index 00000000..3600c8aa --- /dev/null +++ b/src/test/java/com/sports/server/command/cheertalk/presentation/CheerTalkControllerTest.java @@ -0,0 +1,37 @@ +package com.sports.server.command.cheertalk.presentation; + +import com.sports.server.command.cheertalk.dto.CheerTalkRequest; +import com.sports.server.support.DocumentationTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; + +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class CheerTalkControllerTest extends DocumentationTest { + + @Test + void 응원톡을_저장한다() throws Exception { + // given + CheerTalkRequest request = new CheerTalkRequest("응원해요~", 1L); + + + // when + ResultActions result = mockMvc.perform(post("/cheer-talks") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + requestFields( + fieldWithPath("content").type(JsonFieldType.STRING).description("응원톡의 내용"), + fieldWithPath("gameTeamId").type(JsonFieldType.NUMBER).description("응원하는 게임팀") + ) + )); + } +} diff --git a/src/test/java/com/sports/server/support/ControllerTest.java b/src/test/java/com/sports/server/support/ControllerTest.java deleted file mode 100644 index e672bc80..00000000 --- a/src/test/java/com/sports/server/support/ControllerTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.sports.server.support; - -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; - -import com.sports.server.support.config.RestDocsConfig; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; -import org.springframework.context.annotation.Import; -import org.springframework.restdocs.RestDocumentationContextProvider; -import org.springframework.restdocs.RestDocumentationExtension; -import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.result.MockMvcResultHandlers; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.filter.CharacterEncodingFilter; -import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; - -@AutoConfigureRestDocs -@Import(RestDocsConfig.class) -@ExtendWith(RestDocumentationExtension.class) -public class ControllerTest { - @Autowired - protected RestDocumentationResultHandler restDocsHandler; - - @Autowired - protected MockMvc mockMvc; - - @Autowired - protected ObjectMapper objectMapper; - - @BeforeEach - void setUp( - final WebApplicationContext context, - final RestDocumentationContextProvider restDocumentation) { - this.mockMvc = MockMvcBuilders.webAppContextSetup(context) - .apply(documentationConfiguration(restDocumentation)) - .alwaysDo(MockMvcResultHandlers.print()) - .alwaysDo(restDocsHandler) - .addFilters(new CharacterEncodingFilter("UTF-8", true)) - .build(); - } -} diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java new file mode 100644 index 00000000..7d421c03 --- /dev/null +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -0,0 +1,62 @@ +package com.sports.server.support; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sports.server.command.cheertalk.application.CheerTalkService; +import com.sports.server.command.cheertalk.presentation.CheerTalkController; +import com.sports.server.command.game.presentation.GameController; +import com.sports.server.command.report.presentation.ReportController; +import com.sports.server.common.log.TimeLogTemplate; +import com.sports.server.query.presentation.CheerTalkQueryController; +import com.sports.server.query.presentation.GameQueryController; +import com.sports.server.query.presentation.LeagueQueryController; +import com.sports.server.query.presentation.TimelineQueryController; +import com.sports.server.support.config.RestDocsConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; +import org.springframework.restdocs.operation.preprocess.OperationRequestPreprocessor; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; + +@WebMvcTest(controllers = { + CheerTalkController.class, +// GameController.class, +// ReportController.class, +// CheerTalkQueryController.class, +// GameQueryController.class, +// LeagueQueryController.class, +// TimelineQueryController.class +}) +@Import({ + TimeLogTemplate.class, + RestDocsConfig.class +}) +@AutoConfigureRestDocs +public class DocumentationTest { + + private static final OperationRequestPreprocessor HOST_INFO = preprocessRequest(modifyUris() + .scheme("https") + .host("www.api.hufstreaming.site") + .removePort(), prettyPrint() + ); + + protected static final RestDocumentationResultHandler RESULT_HANDLER = document( + "{class-name}/{method-name}", + HOST_INFO, + preprocessResponse(prettyPrint()) + ); + + @Autowired + protected MockMvc mockMvc; + + @Autowired + protected ObjectMapper objectMapper; + + @MockBean + protected CheerTalkService cheerTalkService; +} From f05894984c43d33e9247028e22ae46b25b600ae7 Mon Sep 17 00:00:00 2001 From: does Date: Fri, 19 Jan 2024 23:09:12 +0900 Subject: [PATCH 06/22] =?UTF-8?q?[TEST]=20=EA=B2=8C=EC=9E=84=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20api=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 5 ++ .../presentation/GameQueryControllerTest.java | 61 +++++++++++++++++++ .../server/support/DocumentationTest.java | 14 ++++- 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 077b9dc1..c9900649 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -9,3 +9,8 @@ = 응원톡 API == 응원톡 저장 operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-request,request-fields,http-response'] + += 게임 API + +== 게임 상세 조회 +operation::game-query-controller-test/게임을_상세_조회한다[snippets='http-request,http-response,response-fields'] diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java new file mode 100644 index 00000000..7d4056d6 --- /dev/null +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -0,0 +1,61 @@ +package com.sports.server.query.presentation; + +import com.sports.server.query.dto.response.GameDetailResponse; +import com.sports.server.support.DocumentationTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class GameQueryControllerTest extends DocumentationTest { + + @Test + void 게임을_상세_조회한다() throws Exception { + // given + Long gameId = 1L; + List gameTeams = List.of( + new GameDetailResponse.TeamResponse( + 1L, "A팀", "logo.com", 2, 1), + new GameDetailResponse.TeamResponse( + 2L, "B팀", "logo.com", 1, 2) + ); + LocalDateTime startTime = LocalDateTime.of(2024, 1, 19, 13, 0, 0); + GameDetailResponse response = new GameDetailResponse( + startTime, "videoId", "전반전", "4강", "축구", gameTeams + ); + given(gameQueryService.getGameDetail(gameId)) + .willReturn(response); + + // when + ResultActions result = mockMvc.perform(get("/games/{gameId}", gameId) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + responseFields( + fieldWithPath("startTime").type(JsonFieldType.STRING).description("게임 시작 시간"), + fieldWithPath("videoId").type(JsonFieldType.STRING).description("게임 비디오 ID"), + fieldWithPath("gameQuarter").type(JsonFieldType.STRING).description("게임 쿼터"), + fieldWithPath("gameName").type(JsonFieldType.STRING).description("게임 이름"), + fieldWithPath("sportName").type(JsonFieldType.STRING).description("종목"), + fieldWithPath("sportName").type(JsonFieldType.STRING).description("종목"), + fieldWithPath("gameTeams[].gameTeamId").type(JsonFieldType.NUMBER).description("게임팀의 ID"), + fieldWithPath("gameTeams[].gameTeamName").type(JsonFieldType.STRING).description("게임팀의 이름"), + fieldWithPath("gameTeams[].logoImageUrl").type(JsonFieldType.STRING).description("게임팀의 이미지 URL"), + fieldWithPath("gameTeams[].score").type(JsonFieldType.NUMBER).description("게임팀의 현재 점수"), + fieldWithPath("gameTeams[].order").type(JsonFieldType.NUMBER).description("게임팀의 순서") + ) + )); + } +} diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 7d421c03..53dea975 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -6,6 +6,9 @@ import com.sports.server.command.game.presentation.GameController; import com.sports.server.command.report.presentation.ReportController; import com.sports.server.common.log.TimeLogTemplate; +import com.sports.server.query.application.GameQueryService; +import com.sports.server.query.application.GameTeamQueryService; +import com.sports.server.query.application.LineupPlayerQueryService; import com.sports.server.query.presentation.CheerTalkQueryController; import com.sports.server.query.presentation.GameQueryController; import com.sports.server.query.presentation.LeagueQueryController; @@ -28,7 +31,7 @@ // GameController.class, // ReportController.class, // CheerTalkQueryController.class, -// GameQueryController.class, + GameQueryController.class, // LeagueQueryController.class, // TimelineQueryController.class }) @@ -59,4 +62,13 @@ public class DocumentationTest { @MockBean protected CheerTalkService cheerTalkService; + + @MockBean + protected GameQueryService gameQueryService; + + @MockBean + protected GameTeamQueryService gameTeamQueryService; + + @MockBean + protected LineupPlayerQueryService lineupPlayerQueryService; } From 8cdb37b33e29e745be066a7f79610bd86f2c29d5 Mon Sep 17 00:00:00 2001 From: does Date: Fri, 19 Jan 2024 23:15:20 +0900 Subject: [PATCH 07/22] =?UTF-8?q?[TEST]=20=EA=B2=8C=EC=9E=84=20=EC=98=81?= =?UTF-8?q?=EC=83=81=20=EC=A1=B0=ED=9A=8C=20api=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 3 +++ .../presentation/GameQueryControllerTest.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index c9900649..95f55039 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -14,3 +14,6 @@ operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-r == 게임 상세 조회 operation::game-query-controller-test/게임을_상세_조회한다[snippets='http-request,http-response,response-fields'] + +== 게임 영상 조회 +operation::game-query-controller-test/게임_영상_id를_조회한다[snippets='http-request,http-response,response-fields'] diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index 7d4056d6..feaaad0c 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -1,6 +1,7 @@ package com.sports.server.query.presentation; import com.sports.server.query.dto.response.GameDetailResponse; +import com.sports.server.query.dto.response.VideoResponse; import com.sports.server.support.DocumentationTest; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -58,4 +59,25 @@ class GameQueryControllerTest extends DocumentationTest { ) )); } + + @Test + void 게임_영상_ID를_조회한다() throws Exception { + // given + Long gameId = 1L; + given(gameQueryService.getVideo(gameId)) + .willReturn(new VideoResponse("videoId")); + + // when + ResultActions result = mockMvc.perform(get("/games/{gameId}/video", gameId) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + responseFields( + fieldWithPath("videoId").type(JsonFieldType.STRING).description("게임 비디오 ID") + ) + )); + } } From cb36a23ad952190634c8496b763251233840a852 Mon Sep 17 00:00:00 2001 From: does Date: Sat, 20 Jan 2024 00:02:28 +0900 Subject: [PATCH 08/22] =?UTF-8?q?[TEST]=20=EA=B2=8C=EC=9E=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20api=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 3 + .../presentation/GameQueryControllerTest.java | 61 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 95f55039..9c895c5c 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -17,3 +17,6 @@ operation::game-query-controller-test/게임을_상세_조회한다[snippets='ht == 게임 영상 조회 operation::game-query-controller-test/게임_영상_id를_조회한다[snippets='http-request,http-response,response-fields'] + +== 게임 목록 조회 +operation::game-query-controller-test/게임_목록을_조회한다[snippets='http-request,query-parameters,http-response,response-fields'] diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index feaaad0c..45a8c303 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -1,19 +1,24 @@ package com.sports.server.query.presentation; import com.sports.server.query.dto.response.GameDetailResponse; +import com.sports.server.query.dto.response.GameResponseDto; import com.sports.server.query.dto.response.VideoResponse; import com.sports.server.support.DocumentationTest; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.ResultActions; import java.time.LocalDateTime; import java.util.List; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -80,4 +85,60 @@ class GameQueryControllerTest extends DocumentationTest { ) )); } + + @Test + void 게임_목록을_조회한다() throws Exception { + // given + LocalDateTime startTime = LocalDateTime.of(2024, 1, 19, 13, 0, 0); + List gameTeams1 = List.of( + new GameResponseDto.TeamResponse(1L, "A팀", "logo.com", 2, 1), + new GameResponseDto.TeamResponse(2L, "B팀", "logo.com", 1, 2) + ); + List gameTeams2 = List.of( + new GameResponseDto.TeamResponse(3L, "C팀", "logo.com", 2, 1), + new GameResponseDto.TeamResponse(4L, "D팀", "logo.com", 2, 2) + ); + List responses = List.of( + new GameResponseDto(1L, startTime, "전반전", "4강", gameTeams1, "축구"), + new GameResponseDto(2L, startTime, "1쿼터", "결승전", gameTeams2, "농구") + ); + + given(gameQueryService.getAllGames(any(), any())) + .willReturn(responses); + + // when + ResultActions result = mockMvc.perform(RestDocumentationRequestBuilders.get("/games") + .queryParam("league_id", "1") + .queryParam("status", "PLAYING") + .queryParam("sport_id", "1") + .queryParam("sport_id", "2") + .queryParam("cursor", String.valueOf(12)) + .queryParam("size", String.valueOf(10)) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + queryParameters( + parameterWithName("league_id").description("대회의 ID"), + parameterWithName("status").description("게임의 상태"), + parameterWithName("sport_id").description("게임의 종목"), + parameterWithName("cursor").description("페이징 커서"), + parameterWithName("size").description("페이징 사이즈") + ), + responseFields( + fieldWithPath("[].id").type(JsonFieldType.NUMBER).description("게임의 ID"), + fieldWithPath("[].startTime").type(JsonFieldType.STRING).description("게임 시작 시간"), + fieldWithPath("[].gameQuarter").type(JsonFieldType.STRING).description("게임 쿼터"), + fieldWithPath("[].gameName").type(JsonFieldType.STRING).description("게임 이름"), + fieldWithPath("[].sportsName").type(JsonFieldType.STRING).description("종목"), + fieldWithPath("[].gameTeams[].gameTeamId").type(JsonFieldType.NUMBER).description("게임팀의 ID"), + fieldWithPath("[].gameTeams[].gameTeamName").type(JsonFieldType.STRING).description("게임팀의 이름"), + fieldWithPath("[].gameTeams[].logoImageUrl").type(JsonFieldType.STRING).description("게임팀의 이미지 URL"), + fieldWithPath("[].gameTeams[].score").type(JsonFieldType.NUMBER).description("게임팀의 현재 점수"), + fieldWithPath("[].gameTeams[].order").type(JsonFieldType.NUMBER).description("게임팀의 순서") + ) + )); + } } From 1bb2610186a92d187a4f40bed1dd1bda37f8500b Mon Sep 17 00:00:00 2001 From: does Date: Sat, 20 Jan 2024 00:10:11 +0900 Subject: [PATCH 09/22] =?UTF-8?q?[TEST]=20=EA=B2=8C=EC=9E=84=20=EC=9D=91?= =?UTF-8?q?=EC=9B=90=ED=9A=9F=EC=88=98=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 3 ++ .../presentation/GameQueryControllerTest.java | 38 ++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 9c895c5c..922b3c48 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -20,3 +20,6 @@ operation::game-query-controller-test/게임_영상_id를_조회한다[snippets= == 게임 목록 조회 operation::game-query-controller-test/게임_목록을_조회한다[snippets='http-request,query-parameters,http-response,response-fields'] + +== 게임 응원횟수 조회 +operation::game-query-controller-test/응원_횟수를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index 45a8c303..059a25e0 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -2,11 +2,11 @@ import com.sports.server.query.dto.response.GameDetailResponse; import com.sports.server.query.dto.response.GameResponseDto; +import com.sports.server.query.dto.response.GameTeamCheerResponseDto; import com.sports.server.query.dto.response.VideoResponse; import com.sports.server.support.DocumentationTest; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.ResultActions; @@ -15,11 +15,10 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.restdocs.request.RequestDocumentation.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; class GameQueryControllerTest extends DocumentationTest { @@ -107,7 +106,7 @@ class GameQueryControllerTest extends DocumentationTest { .willReturn(responses); // when - ResultActions result = mockMvc.perform(RestDocumentationRequestBuilders.get("/games") + ResultActions result = mockMvc.perform(get("/games") .queryParam("league_id", "1") .queryParam("status", "PLAYING") .queryParam("sport_id", "1") @@ -141,4 +140,33 @@ class GameQueryControllerTest extends DocumentationTest { ) )); } + + @Test + void 응원_횟수를_조회한다() throws Exception { + // given + Long gameId = 1L; + given(gameTeamQueryService.getCheerCountOfGameTeams(gameId)) + .willReturn(List.of( + new GameTeamCheerResponseDto(1L, 100, 1), + new GameTeamCheerResponseDto(2L, 150, 2) + )); + + // when + ResultActions result = mockMvc.perform(get("/games/{gameId}/cheer", gameId) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), + responseFields( + fieldWithPath("[].gameTeamId").type(JsonFieldType.NUMBER).description("게임팀의 ID"), + fieldWithPath("[].cheerCount").type(JsonFieldType.NUMBER).description("응원 횟수"), + fieldWithPath("[].order").type(JsonFieldType.NUMBER).description("게임팀의 순서") + ) + )); + } } From 4a3cd7e5747c1aed5cfa515f0da95b85ea4236d5 Mon Sep 17 00:00:00 2001 From: does Date: Sat, 20 Jan 2024 00:12:01 +0900 Subject: [PATCH 10/22] =?UTF-8?q?[TEST]=20path-parameter=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 6 +++--- .../server/query/presentation/GameQueryControllerTest.java | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 922b3c48..937b5a7e 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -13,13 +13,13 @@ operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-r = 게임 API == 게임 상세 조회 -operation::game-query-controller-test/게임을_상세_조회한다[snippets='http-request,http-response,response-fields'] +operation::game-query-controller-test/게임을_상세_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] == 게임 영상 조회 -operation::game-query-controller-test/게임_영상_id를_조회한다[snippets='http-request,http-response,response-fields'] +operation::game-query-controller-test/게임_영상_id를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] == 게임 목록 조회 operation::game-query-controller-test/게임_목록을_조회한다[snippets='http-request,query-parameters,http-response,response-fields'] -== 게임 응원횟수 조회 +== 게임 응원 횟수 조회 operation::game-query-controller-test/응원_횟수를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index 059a25e0..804ceb07 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -48,6 +48,9 @@ class GameQueryControllerTest extends DocumentationTest { // then result.andExpect((status().isOk())) .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), responseFields( fieldWithPath("startTime").type(JsonFieldType.STRING).description("게임 시작 시간"), fieldWithPath("videoId").type(JsonFieldType.STRING).description("게임 비디오 ID"), @@ -79,6 +82,9 @@ class GameQueryControllerTest extends DocumentationTest { // then result.andExpect((status().isOk())) .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), responseFields( fieldWithPath("videoId").type(JsonFieldType.STRING).description("게임 비디오 ID") ) From 8fd09df47f00ada2227374f93e65daf8ee6b385f Mon Sep 17 00:00:00 2001 From: does Date: Sat, 20 Jan 2024 00:21:12 +0900 Subject: [PATCH 11/22] =?UTF-8?q?[TEST]=20=EB=9D=BC=EC=9D=B8=EC=97=85=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EB=AC=B8=EC=84=9C=ED=99=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 3 ++ .../presentation/GameQueryControllerTest.java | 51 +++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 937b5a7e..75dbb7a1 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -23,3 +23,6 @@ operation::game-query-controller-test/게임_목록을_조회한다[snippets='ht == 게임 응원 횟수 조회 operation::game-query-controller-test/응원_횟수를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] + +== 게임 라인업 조회 +operation::game-query-controller-test/라인업을_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index 804ceb07..feaac1ef 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -1,9 +1,6 @@ package com.sports.server.query.presentation; -import com.sports.server.query.dto.response.GameDetailResponse; -import com.sports.server.query.dto.response.GameResponseDto; -import com.sports.server.query.dto.response.GameTeamCheerResponseDto; -import com.sports.server.query.dto.response.VideoResponse; +import com.sports.server.query.dto.response.*; import com.sports.server.support.DocumentationTest; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -175,4 +172,50 @@ class GameQueryControllerTest extends DocumentationTest { ) )); } + + @Test + void 라인업을_조회한다() throws Exception { + // given + Long gameId = 1L; + List playersA = List.of( + new LineupPlayerResponse.PlayerResponse("선수A", "탑"), + new LineupPlayerResponse.PlayerResponse("선수B", "미드"), + new LineupPlayerResponse.PlayerResponse("선수C", "정글"), + new LineupPlayerResponse.PlayerResponse("선수D", "원딜"), + new LineupPlayerResponse.PlayerResponse("선수E", "서폿") + ); + List playersB = List.of( + new LineupPlayerResponse.PlayerResponse("선수F", "탑"), + new LineupPlayerResponse.PlayerResponse("선수G", "미드"), + new LineupPlayerResponse.PlayerResponse("선수H", "정글"), + new LineupPlayerResponse.PlayerResponse("선수I", "원딜"), + new LineupPlayerResponse.PlayerResponse("선수J", "서폿") + ); + + given(lineupPlayerQueryService.getLineup(gameId)) + .willReturn(List.of( + new LineupPlayerResponse(1L, "팀A", playersA, 1), + new LineupPlayerResponse(2L, "팀B", playersB, 2) + )); + + // when + ResultActions result = mockMvc.perform(get("/games/{gameId}/lineup", gameId) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), + responseFields( + fieldWithPath("[].gameTeamId").type(JsonFieldType.NUMBER).description("게임팀의 ID"), + fieldWithPath("[].teamName").type(JsonFieldType.STRING).description("게임팀 이름"), + fieldWithPath("[].order").type(JsonFieldType.NUMBER).description("게임팀의 순서"), + fieldWithPath("[].gameTeamPlayers[].playerName").type(JsonFieldType.STRING).description("선수 이름"), + fieldWithPath("[].gameTeamPlayers[]업.description").type(JsonFieldType.STRING).description("선수 설명") + ) + )); + } } From aaff582121bc89113daa2cebd0cafb24eda051b7 Mon Sep 17 00:00:00 2001 From: does Date: Sat, 20 Jan 2024 00:23:41 +0900 Subject: [PATCH 12/22] =?UTF-8?q?[DOCS]=20api.html=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/docs/api.html | 639 +++++++++++++++++- .../presentation/GameQueryControllerTest.java | 2 +- 2 files changed, 639 insertions(+), 2 deletions(-) diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index af5df696..eb8933c2 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -452,6 +452,15 @@

훕치치 관객 서버 API 문서

  • 응원톡 저장
  • +
  • 게임 API + +
  • @@ -518,11 +527,639 @@

    게임 API

    +
    +

    게임 상세 조회

    +
    +
    +

    HTTP request

    +
    +
    +
    GET /games/1 HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /games/{gameId}
    ParameterDescription

    gameId

    게임의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 414
    +
    +{
    +  "startTime" : "2024-01-19T13:00:00",
    +  "videoId" : "videoId",
    +  "gameQuarter" : "전반전",
    +  "gameName" : "4강",
    +  "sportName" : "축구",
    +  "gameTeams" : [ {
    +    "gameTeamId" : 1,
    +    "gameTeamName" : "A팀",
    +    "logoImageUrl" : "logo.com",
    +    "score" : 2,
    +    "order" : 1
    +  }, {
    +    "gameTeamId" : 2,
    +    "gameTeamName" : "B팀",
    +    "logoImageUrl" : "logo.com",
    +    "score" : 1,
    +    "order" : 2
    +  } ]
    +}
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    startTime

    String

    게임 시작 시간

    videoId

    String

    게임 비디오 ID

    gameQuarter

    String

    게임 쿼터

    gameName

    String

    게임 이름

    sportName

    String

    종목

    sportName

    String

    종목

    gameTeams[].gameTeamId

    Number

    게임팀의 ID

    gameTeams[].gameTeamName

    String

    게임팀의 이름

    gameTeams[].logoImageUrl

    String

    게임팀의 이미지 URL

    gameTeams[].score

    Number

    게임팀의 현재 점수

    gameTeams[].order

    Number

    게임팀의 순서

    +
    +
    +
    +
    +

    게임 영상 조회

    +
    +
    +

    HTTP request

    +
    +
    +
    GET /games/1/video HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /games/{gameId}/video
    ParameterDescription

    gameId

    게임의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 27
    +
    +{
    +  "videoId" : "videoId"
    +}
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + +
    PathTypeDescription

    videoId

    String

    게임 비디오 ID

    +
    +
    +
    +
    +

    게임 목록 조회

    +
    +
    +

    HTTP request

    +
    +
    +
    GET /games?league_id=1&status=PLAYING&sport_id=1&sport_id=2&cursor=12&size=10 HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Query parameters

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDescription

    league_id

    대회의 ID

    status

    게임의 상태

    sport_id

    게임의 종목

    cursor

    페이징 커서

    size

    페이징 사이즈

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 813
    +
    +[ {
    +  "id" : 1,
    +  "startTime" : "2024-01-19T13:00:00",
    +  "gameQuarter" : "전반전",
    +  "gameName" : "4강",
    +  "gameTeams" : [ {
    +    "gameTeamId" : 1,
    +    "gameTeamName" : "A팀",
    +    "logoImageUrl" : "logo.com",
    +    "score" : 2,
    +    "order" : 1
    +  }, {
    +    "gameTeamId" : 2,
    +    "gameTeamName" : "B팀",
    +    "logoImageUrl" : "logo.com",
    +    "score" : 1,
    +    "order" : 2
    +  } ],
    +  "sportsName" : "축구"
    +}, {
    +  "id" : 2,
    +  "startTime" : "2024-01-19T13:00:00",
    +  "gameQuarter" : "1쿼터",
    +  "gameName" : "결승전",
    +  "gameTeams" : [ {
    +    "gameTeamId" : 3,
    +    "gameTeamName" : "C팀",
    +    "logoImageUrl" : "logo.com",
    +    "score" : 2,
    +    "order" : 1
    +  }, {
    +    "gameTeamId" : 4,
    +    "gameTeamName" : "D팀",
    +    "logoImageUrl" : "logo.com",
    +    "score" : 2,
    +    "order" : 2
    +  } ],
    +  "sportsName" : "농구"
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].id

    Number

    게임의 ID

    [].startTime

    String

    게임 시작 시간

    [].gameQuarter

    String

    게임 쿼터

    [].gameName

    String

    게임 이름

    [].sportsName

    String

    종목

    [].gameTeams[].gameTeamId

    Number

    게임팀의 ID

    [].gameTeams[].gameTeamName

    String

    게임팀의 이름

    [].gameTeams[].logoImageUrl

    String

    게임팀의 이미지 URL

    [].gameTeams[].score

    Number

    게임팀의 현재 점수

    [].gameTeams[].order

    Number

    게임팀의 순서

    +
    +
    +
    +
    +

    게임 응원 횟수 조회

    +
    +
    +

    HTTP request

    +
    +
    +
    GET /games/1/cheer HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /games/{gameId}/cheer
    ParameterDescription

    gameId

    게임의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 124
    +
    +[ {
    +  "gameTeamId" : 1,
    +  "cheerCount" : 100,
    +  "order" : 1
    +}, {
    +  "gameTeamId" : 2,
    +  "cheerCount" : 150,
    +  "order" : 2
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].gameTeamId

    Number

    게임팀의 ID

    [].cheerCount

    Number

    응원 횟수

    [].order

    Number

    게임팀의 순서

    +
    +
    +
    +
    +

    게임 라인업 조회

    +
    +
    +

    HTTP request

    +
    +
    +
    GET /games/1/lineup HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /games/{gameId}/lineup
    ParameterDescription

    gameId

    게임의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 832
    +
    +[ {
    +  "gameTeamId" : 1,
    +  "teamName" : "팀A",
    +  "gameTeamPlayers" : [ {
    +    "playerName" : "선수A",
    +    "description" : "탑"
    +  }, {
    +    "playerName" : "선수B",
    +    "description" : "미드"
    +  }, {
    +    "playerName" : "선수C",
    +    "description" : "정글"
    +  }, {
    +    "playerName" : "선수D",
    +    "description" : "원딜"
    +  }, {
    +    "playerName" : "선수E",
    +    "description" : "서폿"
    +  } ],
    +  "order" : 1
    +}, {
    +  "gameTeamId" : 2,
    +  "teamName" : "팀B",
    +  "gameTeamPlayers" : [ {
    +    "playerName" : "선수F",
    +    "description" : "탑"
    +  }, {
    +    "playerName" : "선수G",
    +    "description" : "미드"
    +  }, {
    +    "playerName" : "선수H",
    +    "description" : "정글"
    +  }, {
    +    "playerName" : "선수I",
    +    "description" : "원딜"
    +  }, {
    +    "playerName" : "선수J",
    +    "description" : "서폿"
    +  } ],
    +  "order" : 2
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].gameTeamId

    Number

    게임팀의 ID

    [].teamName

    String

    게임팀 이름

    [].order

    Number

    게임팀의 순서

    [].gameTeamPlayers[].playerName

    String

    선수 이름

    [].gameTeamPlayers[].description

    String

    선수 설명

    +
    +
    +
    diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index feaac1ef..289744eb 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -214,7 +214,7 @@ class GameQueryControllerTest extends DocumentationTest { fieldWithPath("[].teamName").type(JsonFieldType.STRING).description("게임팀 이름"), fieldWithPath("[].order").type(JsonFieldType.NUMBER).description("게임팀의 순서"), fieldWithPath("[].gameTeamPlayers[].playerName").type(JsonFieldType.STRING).description("선수 이름"), - fieldWithPath("[].gameTeamPlayers[]업.description").type(JsonFieldType.STRING).description("선수 설명") + fieldWithPath("[].gameTeamPlayers[].description").type(JsonFieldType.STRING).description("선수 설명") ) )); } From 42c2862a95dcb62b05253e1fedb2b1af845ba4fd Mon Sep 17 00:00:00 2001 From: does Date: Sat, 20 Jan 2024 15:24:46 +0900 Subject: [PATCH 13/22] =?UTF-8?q?[DOCS]=20api.adoc=20=EB=AA=A9=EC=B0=A8=20?= =?UTF-8?q?=EB=8E=81=EC=8A=A4=20=EC=88=98=EC=A0=95=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 19 ++-- src/main/resources/static/docs/api.html | 124 ++++++++++++------------ 2 files changed, 69 insertions(+), 74 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 75dbb7a1..bfbc7dae 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -3,26 +3,25 @@ :icons: font :source-highlighter: highlightjs :toc: left -:toclevels: 1 +:toclevels: 2 :sectlinks: -= 응원톡 API -== 응원톡 저장 +== 응원톡 API +=== 응원톡 저장 operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-request,request-fields,http-response'] -= 게임 API - -== 게임 상세 조회 +== 게임 API +=== 게임 상세 조회 operation::game-query-controller-test/게임을_상세_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] -== 게임 영상 조회 +=== 게임 영상 조회 operation::game-query-controller-test/게임_영상_id를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] -== 게임 목록 조회 +=== 게임 목록 조회 operation::game-query-controller-test/게임_목록을_조회한다[snippets='http-request,query-parameters,http-response,response-fields'] -== 게임 응원 횟수 조회 +=== 게임 응원 횟수 조회 operation::game-query-controller-test/응원_횟수를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] -== 게임 라인업 조회 +=== 게임 라인업 조회 operation::game-query-controller-test/라인업을_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index eb8933c2..060afc13 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -446,14 +446,14 @@

    훕치치 관객 서버 API 문서

    Table of Contents
    -
    -

    응원톡 API

    -

    응원톡 저장

    +

    응원톡 API

    -

    HTTP request

    +

    응원톡 저장

    +
    +

    HTTP request

    POST /cheer-talks HTTP/1.1
    @@ -485,8 +486,8 @@ 

    -

    Request fields

    +
    +

    Request fields

    @@ -514,8 +515,8 @@

    -

    HTTP response

    +
    +

    HTTP response

    HTTP/1.1 200 OK
    @@ -527,12 +528,14 @@ 

    게임 API

    +

    @@ -563,8 +566,8 @@

    -

    HTTP response

    +
    +

    HTTP response

    HTTP/1.1 200 OK
    @@ -597,8 +600,8 @@ 

    -

    Response fields

    +

    Table 1. /games/{gameId}
    @@ -672,12 +675,10 @@

    -

    게임 영상 조회

    -
    -

    HTTP request

    +

    게임 영상 조회

    +
    +

    HTTP request

    GET /games/1/video HTTP/1.1
    @@ -686,8 +687,8 @@ 

    -

    Path parameters

    +

    @@ -708,8 +709,8 @@

    -

    HTTP response

    +
    +

    HTTP response

    HTTP/1.1 200 OK
    @@ -725,8 +726,8 @@ 

    -

    Response fields

    +

    Table 1. /games/{gameId}/video
    @@ -750,12 +751,10 @@

    -

    게임 목록 조회

    -
    -

    HTTP request

    +

    게임 목록 조회

    +
    +

    HTTP request

    GET /games?league_id=1&status=PLAYING&sport_id=1&sport_id=2&cursor=12&size=10 HTTP/1.1
    @@ -764,8 +763,8 @@ 

    -

    Query parameters

    +

    @@ -801,8 +800,8 @@

    -

    HTTP response

    +
    +

    HTTP response

    HTTP/1.1 200 OK
    @@ -854,8 +853,8 @@ 

    -

    Response fields

    +

    @@ -924,12 +923,10 @@

    -

    게임 응원 횟수 조회

    -
    -

    HTTP request

    +

    게임 응원 횟수 조회

    +
    +

    HTTP request

    GET /games/1/cheer HTTP/1.1
    @@ -938,8 +935,8 @@ 

    -

    Path parameters

    +

    @@ -960,8 +957,8 @@

    -

    HTTP response

    +
    +

    HTTP response

    HTTP/1.1 200 OK
    @@ -983,8 +980,8 @@ 

    -

    Response fields

    +

    Table 1. /games/{gameId}/cheer
    @@ -1018,12 +1015,10 @@

    -

    게임 라인업 조회

    -
    -

    HTTP request

    +

    게임 라인업 조회

    +
    +

    HTTP request

    GET /games/1/lineup HTTP/1.1
    @@ -1032,8 +1027,8 @@ 

    -

    Path parameters

    +

    @@ -1054,8 +1049,8 @@

    -

    HTTP response

    +
    +

    HTTP response

    HTTP/1.1 200 OK
    @@ -1109,8 +1104,8 @@ 

    -

    Response fields

    +

    Table 1. /games/{gameId}/lineup
    @@ -1156,10 +1151,11 @@

    From 08f2c04feb19503a40cb65aefcc1dbf6c9122c20 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Sun, 21 Jan 2024 18:58:18 +0900 Subject: [PATCH 14/22] =?UTF-8?q?[TEST]=20=EC=9D=91=EC=9B=90=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20api=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 14 ++++ .../game/presentation/GameController.java | 6 +- src/main/resources/static/docs/api.html | 71 ++++++++++++++++++- .../game/presentation/GameControllerTest.java | 46 ++++++++++++ .../server/support/DocumentationTest.java | 19 ++--- 5 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index bfbc7dae..a62250b9 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -7,21 +7,35 @@ :sectlinks: == 응원톡 API + === 응원톡 저장 + operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-request,request-fields,http-response'] == 게임 API + === 게임 상세 조회 + operation::game-query-controller-test/게임을_상세_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] === 게임 영상 조회 + operation::game-query-controller-test/게임_영상_id를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] === 게임 목록 조회 + operation::game-query-controller-test/게임_목록을_조회한다[snippets='http-request,query-parameters,http-response,response-fields'] === 게임 응원 횟수 조회 + operation::game-query-controller-test/응원_횟수를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] === 게임 라인업 조회 + operation::game-query-controller-test/라인업을_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] + +== 응원 횟수 API + +=== 응원 횟수 업데이트 + +operation::game-controller-test/응원_횟수를_업데이트한다[snippets='http-request,request-fields,http-response'] \ No newline at end of file diff --git a/src/main/java/com/sports/server/command/game/presentation/GameController.java b/src/main/java/com/sports/server/command/game/presentation/GameController.java index b975937b..c8e1fcb6 100644 --- a/src/main/java/com/sports/server/command/game/presentation/GameController.java +++ b/src/main/java/com/sports/server/command/game/presentation/GameController.java @@ -5,7 +5,11 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 060afc13..e4d89541 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -461,6 +461,11 @@

    훕치치 관객 서버 API 문서

  • 게임 라인업 조회
  • +
  • 응원 횟수 API + +
  • @@ -1151,11 +1156,75 @@

    +

    응원 횟수 API

    +
    +
    +

    응원 횟수 업데이트

    +
    +

    HTTP request

    +
    +
    +
    POST /games/1/cheer HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Content-Length: 42
    +Host: localhost:8080
    +
    +{
    +  "gameTeamId" : 1,
    +  "cheerCount" : 1
    +}
    +
    +
    +
    +

    +++++ + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    gameTeamId

    Number

    게임팀의 id

    cheerCount

    Number

    증가시킬 응원 횟수

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +
    +
    +
    +

    +
    +
    diff --git a/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java b/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java new file mode 100644 index 00000000..0e6e6b43 --- /dev/null +++ b/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java @@ -0,0 +1,46 @@ +package com.sports.server.command.game.presentation; + + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.sports.server.command.game.dto.CheerCountUpdateRequest; +import com.sports.server.support.DocumentationTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; + +public class GameControllerTest extends DocumentationTest { + + @Test + void 응원_횟수를_업데이트한다() throws Exception { + + //given + Long gameId = 1L; + CheerCountUpdateRequest request = new CheerCountUpdateRequest(1L, 1); + + //when + ResultActions result = mockMvc.perform(post("/games/{gameId}/cheer", gameId, request) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + //then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), + requestFields( + fieldWithPath("gameTeamId").type(JsonFieldType.NUMBER).description("게임팀의 id"), + fieldWithPath("cheerCount").type(JsonFieldType.NUMBER).description("증가시킬 응원 횟수") + + ) + )); + } +} diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 53dea975..1c856162 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -1,18 +1,21 @@ package com.sports.server.support; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; + import com.fasterxml.jackson.databind.ObjectMapper; import com.sports.server.command.cheertalk.application.CheerTalkService; import com.sports.server.command.cheertalk.presentation.CheerTalkController; +import com.sports.server.command.game.application.GameTeamService; import com.sports.server.command.game.presentation.GameController; -import com.sports.server.command.report.presentation.ReportController; import com.sports.server.common.log.TimeLogTemplate; import com.sports.server.query.application.GameQueryService; import com.sports.server.query.application.GameTeamQueryService; import com.sports.server.query.application.LineupPlayerQueryService; -import com.sports.server.query.presentation.CheerTalkQueryController; import com.sports.server.query.presentation.GameQueryController; -import com.sports.server.query.presentation.LeagueQueryController; -import com.sports.server.query.presentation.TimelineQueryController; import com.sports.server.support.config.RestDocsConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; @@ -23,12 +26,9 @@ import org.springframework.restdocs.operation.preprocess.OperationRequestPreprocessor; import org.springframework.test.web.servlet.MockMvc; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; - @WebMvcTest(controllers = { CheerTalkController.class, -// GameController.class, + GameController.class, // ReportController.class, // CheerTalkQueryController.class, GameQueryController.class, @@ -71,4 +71,7 @@ public class DocumentationTest { @MockBean protected LineupPlayerQueryService lineupPlayerQueryService; + + @MockBean + protected GameTeamService gameTeamService; } From 370b7fe16f6c9feba1fb166f43ee5ca2c5d5f936 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Sun, 21 Jan 2024 23:33:49 +0900 Subject: [PATCH 15/22] =?UTF-8?q?[TEST]=20=EC=8B=A0=EA=B3=A0=20api=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 8 ++- src/main/resources/static/docs/api.html | 65 ++++++++++++++++++- .../presentation/ReportControllerTest.java | 38 +++++++++++ .../server/support/DocumentationTest.java | 7 +- 4 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/sports/server/command/report/presentation/ReportControllerTest.java diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index a62250b9..6950ff4b 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -38,4 +38,10 @@ operation::game-query-controller-test/라인업을_조회한다[snippets='http-r === 응원 횟수 업데이트 -operation::game-controller-test/응원_횟수를_업데이트한다[snippets='http-request,request-fields,http-response'] \ No newline at end of file +operation::game-controller-test/응원_횟수를_업데이트한다[snippets='http-request,request-fields,http-response'] + +== 신고 API + +=== 응원톡 신고 + +operation::report-controller-test/응원톡을_신고한다[snippets='http-request,request-fields,http-response'] \ No newline at end of file diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index e4d89541..575cc1d3 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -466,6 +466,11 @@

    훕치치 관객 서버 API 문서

  • 응원 횟수 업데이트
  • +
  • 신고 API + +
  • @@ -1220,11 +1225,69 @@

    +

    신고 API

    +
    +
    +

    응원톡 신고

    +
    +

    HTTP request

    +
    +
    +
    POST /reports HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Content-Length: 23
    +Host: localhost:8080
    +
    +{
    +  "cheerTalkId" : 1
    +}
    +
    +
    +
    +
    +

    Request fields

    + +++++ + + + + + + + + + + + + + + +
    PathTypeDescription

    cheerTalkId

    Number

    신고하는 응원톡의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 204 No Content
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +
    +
    +
    +
    +
    +

    diff --git a/src/test/java/com/sports/server/command/report/presentation/ReportControllerTest.java b/src/test/java/com/sports/server/command/report/presentation/ReportControllerTest.java new file mode 100644 index 00000000..e1858b45 --- /dev/null +++ b/src/test/java/com/sports/server/command/report/presentation/ReportControllerTest.java @@ -0,0 +1,38 @@ +package com.sports.server.command.report.presentation; + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.sports.server.command.report.dto.ReportRequest; +import com.sports.server.support.DocumentationTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; + +public class ReportControllerTest extends DocumentationTest { + + @Test + void 응원톡을_신고한다() throws Exception { + + //given + ReportRequest request = new ReportRequest(1L); + + //when + ResultActions result = mockMvc.perform(post("/reports", request) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + //then + result.andExpect((status().isNoContent())) + .andDo(RESULT_HANDLER.document( + requestFields( + fieldWithPath("cheerTalkId").type(JsonFieldType.NUMBER).description("신고하는 응원톡의 ID") + ) + )); + } + +} diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 1c856162..30b487fc 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -11,6 +11,8 @@ import com.sports.server.command.cheertalk.presentation.CheerTalkController; import com.sports.server.command.game.application.GameTeamService; import com.sports.server.command.game.presentation.GameController; +import com.sports.server.command.report.application.ReportService; +import com.sports.server.command.report.presentation.ReportController; import com.sports.server.common.log.TimeLogTemplate; import com.sports.server.query.application.GameQueryService; import com.sports.server.query.application.GameTeamQueryService; @@ -29,7 +31,7 @@ @WebMvcTest(controllers = { CheerTalkController.class, GameController.class, -// ReportController.class, + ReportController.class, // CheerTalkQueryController.class, GameQueryController.class, // LeagueQueryController.class, @@ -74,4 +76,7 @@ public class DocumentationTest { @MockBean protected GameTeamService gameTeamService; + + @MockBean + protected ReportService reportService; } From d0bf338702d40167ec3e353da42749a6ecf28b3f Mon Sep 17 00:00:00 2001 From: Jin409 Date: Sun, 21 Jan 2024 23:42:56 +0900 Subject: [PATCH 16/22] =?UTF-8?q?[REFACTOR]=20comment=20=EB=A5=BC=20cheerT?= =?UTF-8?q?alk=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/CheerTalkQueryService.java | 21 +++++++-------- ...ntResponse.java => CheerTalkResponse.java} | 4 +-- .../presentation/CheerTalkEventHandler.java | 4 +-- .../CheerTalkQueryController.java | 11 ++++---- .../acceptance/CheerTalkEventHandlerTest.java | 12 ++++----- .../CheerTalkQueryAcceptanceTest.java | 26 +++++++++---------- .../CheerTalkQueryServiceTest.java | 8 +++--- .../CheerTalkQueryControllerTest.java | 17 ++++++++++++ 8 files changed, 59 insertions(+), 44 deletions(-) rename src/main/java/com/sports/server/query/dto/response/{CommentResponse.java => CheerTalkResponse.java} (87%) create mode 100644 src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java diff --git a/src/main/java/com/sports/server/query/application/CheerTalkQueryService.java b/src/main/java/com/sports/server/query/application/CheerTalkQueryService.java index a3d4ecef..b018e9c4 100644 --- a/src/main/java/com/sports/server/query/application/CheerTalkQueryService.java +++ b/src/main/java/com/sports/server/query/application/CheerTalkQueryService.java @@ -1,16 +1,15 @@ package com.sports.server.query.application; import com.sports.server.command.cheertalk.domain.CheerTalk; -import com.sports.server.query.repository.CheerTalkDynamicRepository; -import com.sports.server.query.dto.response.CommentResponse; import com.sports.server.common.dto.PageRequestDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - +import com.sports.server.query.dto.response.CheerTalkResponse; +import com.sports.server.query.repository.CheerTalkDynamicRepository; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -19,17 +18,17 @@ public class CheerTalkQueryService { private final CheerTalkDynamicRepository cheerTalkDynamicRepository; - public List getCommentsByGameId(final Long gameId, final PageRequestDto pageRequest) { + public List getCheerTalksByGameId(final Long gameId, final PageRequestDto pageRequest) { List cheerTalks = cheerTalkDynamicRepository.findByGameIdOrderByStartTime( gameId, pageRequest.cursor(), pageRequest.size() ); List gameTeamIds = getOrderedGameTeamIds(cheerTalks); - List responses = cheerTalks.stream() - .map(comment -> new CommentResponse( - comment, - getOrderOfGameTeamId(comment.getGameTeamId(), gameTeamIds) + List responses = cheerTalks.stream() + .map(cheerTalk -> new CheerTalkResponse( + cheerTalk, + getOrderOfGameTeamId(cheerTalk.getGameTeamId(), gameTeamIds) )) .collect(Collectors.toList()); diff --git a/src/main/java/com/sports/server/query/dto/response/CommentResponse.java b/src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java similarity index 87% rename from src/main/java/com/sports/server/query/dto/response/CommentResponse.java rename to src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java index 0ded3928..fbc29f5b 100644 --- a/src/main/java/com/sports/server/query/dto/response/CommentResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java @@ -4,7 +4,7 @@ import java.time.LocalDateTime; -public record CommentResponse( +public record CheerTalkResponse( Long commentId, String content, Long gameTeamId, @@ -12,7 +12,7 @@ public record CommentResponse( Boolean isBlocked, int order ) { - public CommentResponse(CheerTalk cheerTalk, final int order) { + public CheerTalkResponse(CheerTalk cheerTalk, final int order) { this( cheerTalk.getId(), checkCommentBlocked(cheerTalk), diff --git a/src/main/java/com/sports/server/query/presentation/CheerTalkEventHandler.java b/src/main/java/com/sports/server/query/presentation/CheerTalkEventHandler.java index 74b098a7..c341b651 100644 --- a/src/main/java/com/sports/server/query/presentation/CheerTalkEventHandler.java +++ b/src/main/java/com/sports/server/query/presentation/CheerTalkEventHandler.java @@ -2,7 +2,7 @@ import com.sports.server.command.cheertalk.domain.CheerTalk; import com.sports.server.command.cheertalk.domain.CheerTalkCreateEvent; -import com.sports.server.query.dto.response.CommentResponse; +import com.sports.server.query.dto.response.CheerTalkResponse; import com.sports.server.common.application.EntityUtils; import com.sports.server.query.application.GameTeamServiceUtils; import com.sports.server.command.game.domain.Game; @@ -33,7 +33,7 @@ public void handle(CheerTalkCreateEvent event) { messagingTemplate.convertAndSend( DESTINATION + game.getId(), - new CommentResponse(cheerTalk, + new CheerTalkResponse(cheerTalk, gameTeamServiceUtils.calculateOrderOfGameTeam(game, cheerTalk.getGameTeamId())) ); diff --git a/src/main/java/com/sports/server/query/presentation/CheerTalkQueryController.java b/src/main/java/com/sports/server/query/presentation/CheerTalkQueryController.java index 7852afeb..4d1235b5 100644 --- a/src/main/java/com/sports/server/query/presentation/CheerTalkQueryController.java +++ b/src/main/java/com/sports/server/query/presentation/CheerTalkQueryController.java @@ -1,8 +1,9 @@ package com.sports.server.query.presentation; -import com.sports.server.query.dto.response.CommentResponse; import com.sports.server.common.dto.PageRequestDto; import com.sports.server.query.application.CheerTalkQueryService; +import com.sports.server.query.dto.response.CheerTalkResponse; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -10,8 +11,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RestController @RequiredArgsConstructor public class CheerTalkQueryController { @@ -19,9 +18,9 @@ public class CheerTalkQueryController { private final CheerTalkQueryService cheerTalkQueryService; @GetMapping("games/{gameId}/cheer-talks") - public ResponseEntity> getAllComments(@PathVariable final Long gameId, - @ModelAttribute final PageRequestDto pageRequest) { + public ResponseEntity> getAllCheerTalks(@PathVariable final Long gameId, + @ModelAttribute final PageRequestDto pageRequest) { - return ResponseEntity.ok(cheerTalkQueryService.getCommentsByGameId(gameId, pageRequest)); + return ResponseEntity.ok(cheerTalkQueryService.getCheerTalksByGameId(gameId, pageRequest)); } } diff --git a/src/test/java/com/sports/server/query/acceptance/CheerTalkEventHandlerTest.java b/src/test/java/com/sports/server/query/acceptance/CheerTalkEventHandlerTest.java index 4af7b9d1..a11120ad 100644 --- a/src/test/java/com/sports/server/query/acceptance/CheerTalkEventHandlerTest.java +++ b/src/test/java/com/sports/server/query/acceptance/CheerTalkEventHandlerTest.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import com.sports.server.command.cheertalk.application.CheerTalkService; import com.sports.server.command.cheertalk.dto.CheerTalkRequest; -import com.sports.server.query.dto.response.CommentResponse; +import com.sports.server.query.dto.response.CheerTalkResponse; import com.sports.server.support.AcceptanceTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -30,7 +30,7 @@ class CheerTalkEventHandlerTest extends AcceptanceTest { private String URL; - private final CompletableFuture completableFuture = new CompletableFuture<>(); + private final CompletableFuture completableFuture = new CompletableFuture<>(); @Autowired private CheerTalkService cheerTalkService; @@ -58,7 +58,7 @@ public void setup() { cheerTalkService.register(new CheerTalkRequest("응원톡입니다.", 1L)); //then - CommentResponse actual = completableFuture.get(10, SECONDS); + CheerTalkResponse actual = completableFuture.get(10, SECONDS); assertThat(actual.content()).isEqualTo("응원톡입니다."); } @@ -80,19 +80,19 @@ public void setup() { cheerTalkService.register(new CheerTalkRequest("응원톡입니다.", 2L)); //then - CommentResponse actual = completableFuture.get(10, SECONDS); + CheerTalkResponse actual = completableFuture.get(10, SECONDS); assertThat(actual.order()).isEqualTo(2); } private class CommentStompFrameHandler implements StompFrameHandler { @Override public Type getPayloadType(StompHeaders stompHeaders) { - return CommentResponse.class; + return CheerTalkResponse.class; } @Override public void handleFrame(StompHeaders stompHeaders, Object o) { - completableFuture.complete((CommentResponse) o); + completableFuture.complete((CheerTalkResponse) o); } } } diff --git a/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java b/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java index 4e3f9398..37420ae2 100644 --- a/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java +++ b/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java @@ -1,6 +1,6 @@ package com.sports.server.query.acceptance; -import com.sports.server.query.dto.response.CommentResponse; +import com.sports.server.query.dto.response.CheerTalkResponse; import com.sports.server.support.AcceptanceTest; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; @@ -38,11 +38,11 @@ class GetCommentsTest { .extract(); // then - List actual = toResponses(response, CommentResponse.class); + List actual = toResponses(response, CheerTalkResponse.class); assertAll( () -> assertThat(actual).hasSize(10), () -> assertThat(actual.get(0)) - .isEqualTo(new CommentResponse( + .isEqualTo(new CheerTalkResponse( 5L, "응원톡5", 1L, @@ -50,7 +50,7 @@ class GetCommentsTest { false, 1 )), () -> assertThat(actual) - .map(CommentResponse::commentId) + .map(CheerTalkResponse::commentId) .containsExactly(5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L) ); } @@ -71,12 +71,12 @@ class GetCommentsTest { .extract(); // then - List actual = toResponses(response, CommentResponse.class); + List actual = toResponses(response, CheerTalkResponse.class); assertAll( () -> assertThat(actual).hasSize(10), () -> assertThat(actual) - .map(CommentResponse::commentId) + .map(CheerTalkResponse::commentId) .containsExactly(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L) ); } @@ -97,12 +97,12 @@ class GetCommentsTest { .extract(); // then - List actual = toResponses(response, CommentResponse.class); + List actual = toResponses(response, CheerTalkResponse.class); assertAll( () -> assertThat(actual).hasSize(size), () -> assertThat(actual) - .map(CommentResponse::commentId) + .map(CheerTalkResponse::commentId) .containsExactly(10L, 11L, 12L, 13L, 14L) ); } @@ -125,12 +125,12 @@ class GetCommentsTest { .extract(); // then - List actual = toResponses(response, CommentResponse.class); + List actual = toResponses(response, CheerTalkResponse.class); assertAll( () -> assertThat(actual).hasSize(size), () -> assertThat(actual) - .map(CommentResponse::commentId) + .map(CheerTalkResponse::commentId) .containsExactly(3L, 4L, 5L, 6L, 7L) ); } @@ -149,10 +149,10 @@ class GetCommentsTest { .extract(); // then - List actual = toResponses(response, CommentResponse.class); + List actual = toResponses(response, CheerTalkResponse.class); assertThat(actual) - .filteredOn(CommentResponse::isBlocked) - .map(CommentResponse::content) + .filteredOn(CheerTalkResponse::isBlocked) + .map(CheerTalkResponse::content) .containsOnlyNulls(); } } diff --git a/src/test/java/com/sports/server/query/application/CheerTalkQueryServiceTest.java b/src/test/java/com/sports/server/query/application/CheerTalkQueryServiceTest.java index c491f3a4..ef1e3d85 100644 --- a/src/test/java/com/sports/server/query/application/CheerTalkQueryServiceTest.java +++ b/src/test/java/com/sports/server/query/application/CheerTalkQueryServiceTest.java @@ -1,6 +1,6 @@ package com.sports.server.query.application; -import com.sports.server.query.dto.response.CommentResponse; +import com.sports.server.query.dto.response.CheerTalkResponse; import com.sports.server.common.dto.PageRequestDto; import com.sports.server.support.ServiceTest; import org.junit.jupiter.api.Test; @@ -26,15 +26,15 @@ class CheerTalkQueryServiceTest extends ServiceTest { PageRequestDto pageRequestDto = new PageRequestDto(null, 14); // when - List commentsByGameId = cheerTalkQueryService.getCommentsByGameId(gameId, pageRequestDto); + List commentsByGameId = cheerTalkQueryService.getCheerTalksByGameId(gameId, pageRequestDto); // then Map orderOfGameTeams = new HashMap<>(); orderOfGameTeams.put(1L, 1); orderOfGameTeams.put(2L, 2); - for (CommentResponse commentResponse : commentsByGameId) { - assertEquals((int) orderOfGameTeams.get(commentResponse.gameTeamId()), commentResponse.order()); + for (CheerTalkResponse cheerTalkResponse : commentsByGameId) { + assertEquals((int) orderOfGameTeams.get(cheerTalkResponse.gameTeamId()), cheerTalkResponse.order()); } } } diff --git a/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java new file mode 100644 index 00000000..3cd2bdc6 --- /dev/null +++ b/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java @@ -0,0 +1,17 @@ +package com.sports.server.query.presentation; + +import com.sports.server.support.DocumentationTest; +import org.junit.jupiter.api.Test; + +public class CheerTalkQueryControllerTest extends DocumentationTest { + + @Test + void 응원톡을_조회한다() { + + //given + Long gameId = 1L; + + + } + +} From d78d8f88426b035c3d111caa4f3fdde9cd96ba04 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Mon, 22 Jan 2024 00:12:56 +0900 Subject: [PATCH 17/22] =?UTF-8?q?[REFACTOR]=20comment=20=EB=A5=BC=20cheerT?= =?UTF-8?q?alk=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/query/dto/response/CheerTalkResponse.java | 7 +++---- .../query/acceptance/CheerTalkQueryAcceptanceTest.java | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java b/src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java index fbc29f5b..f347d359 100644 --- a/src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/CheerTalkResponse.java @@ -1,11 +1,10 @@ package com.sports.server.query.dto.response; import com.sports.server.command.cheertalk.domain.CheerTalk; - import java.time.LocalDateTime; public record CheerTalkResponse( - Long commentId, + Long cheerTalkId, String content, Long gameTeamId, LocalDateTime createdAt, @@ -15,7 +14,7 @@ public record CheerTalkResponse( public CheerTalkResponse(CheerTalk cheerTalk, final int order) { this( cheerTalk.getId(), - checkCommentBlocked(cheerTalk), + checkCheerTalkIsBlocked(cheerTalk), cheerTalk.getGameTeamId(), cheerTalk.getCreatedAt(), cheerTalk.isBlocked(), @@ -23,7 +22,7 @@ public CheerTalkResponse(CheerTalk cheerTalk, final int order) { ); } - private static String checkCommentBlocked(CheerTalk cheerTalk) { + private static String checkCheerTalkIsBlocked(CheerTalk cheerTalk) { if (cheerTalk.isBlocked()) { return null; } diff --git a/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java b/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java index 37420ae2..3bdf3f07 100644 --- a/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java +++ b/src/test/java/com/sports/server/query/acceptance/CheerTalkQueryAcceptanceTest.java @@ -50,7 +50,7 @@ class GetCommentsTest { false, 1 )), () -> assertThat(actual) - .map(CheerTalkResponse::commentId) + .map(CheerTalkResponse::cheerTalkId) .containsExactly(5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L) ); } @@ -76,7 +76,7 @@ class GetCommentsTest { () -> assertThat(actual).hasSize(10), () -> assertThat(actual) - .map(CheerTalkResponse::commentId) + .map(CheerTalkResponse::cheerTalkId) .containsExactly(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L) ); } @@ -102,7 +102,7 @@ class GetCommentsTest { () -> assertThat(actual).hasSize(size), () -> assertThat(actual) - .map(CheerTalkResponse::commentId) + .map(CheerTalkResponse::cheerTalkId) .containsExactly(10L, 11L, 12L, 13L, 14L) ); } @@ -130,7 +130,7 @@ class GetCommentsTest { () -> assertThat(actual).hasSize(size), () -> assertThat(actual) - .map(CheerTalkResponse::commentId) + .map(CheerTalkResponse::cheerTalkId) .containsExactly(3L, 4L, 5L, 6L, 7L) ); } From 25eb7d050c5ce7f4d804d72e98499e74ff24013c Mon Sep 17 00:00:00 2001 From: Jin409 Date: Mon, 22 Jan 2024 00:28:02 +0900 Subject: [PATCH 18/22] =?UTF-8?q?[TEST]=20=EC=9D=91=EC=9B=90=ED=86=A1=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20=EB=AC=B8=EC=84=9C=ED=99=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 4 + src/main/resources/static/docs/api.html | 141 +++++++++++++++++- .../CheerTalkQueryControllerTest.java | 59 +++++++- .../server/support/DocumentationTest.java | 7 +- 4 files changed, 208 insertions(+), 3 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 6950ff4b..e77b02d6 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -12,6 +12,10 @@ operation::cheer-talk-controller-test/응원톡을_저장한다[snippets='http-request,request-fields,http-response'] +=== 응원톡 조회 + +operation::cheer-talk-query-controller-test/응원톡을_조회한다[snippets='http-request,query-parameters,path-parameters,http-response,response-fields'] + == 게임 API === 게임 상세 조회 diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 575cc1d3..dc3c4f7c 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -450,6 +450,7 @@

    훕치치 관객 서버 API 문서

  • 응원톡 API
  • 게임 API @@ -537,6 +538,144 @@

    +

    응원톡 조회

    +
    +

    HTTP request

    +
    +
    +
    GET /games/1/cheer-talks?cursor=1&size=2 HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Query parameters

    + ++++ + + + + + + + + + + + + + + + + +
    ParameterDescription

    cursor

    마지막 응원톡의 ID

    size

    조회하고자 하는 응원톡의 개수

    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /games/{gameId}/cheer-talks
    ParameterDescription

    gameId

    게임의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 303
    +
    +[ {
    +  "cheerTalkId" : 2,
    +  "content" : "응원해요",
    +  "gameTeamId" : 1,
    +  "createdAt" : "2024-01-21T11:46:00",
    +  "isBlocked" : false,
    +  "order" : 1
    +}, {
    +  "cheerTalkId" : 3,
    +  "content" : "파이팅",
    +  "gameTeamId" : 2,
    +  "createdAt" : "2024-01-21T11:46:00",
    +  "isBlocked" : false,
    +  "order" : 2
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].cheerTalkId

    Number

    응원톡의 ID

    [].content

    String

    응원톡의 내용

    [].gameTeamId

    Number

    응원톡에 해당하는 게임팀의 ID

    [].createdAt

    String

    생성된 날짜 및 시각

    [].isBlocked

    Boolean

    응원톡의 블락 여부

    [].order

    Number

    게임팀의 순서

    +
    + diff --git a/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java index 3cd2bdc6..d4c69485 100644 --- a/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/CheerTalkQueryControllerTest.java @@ -1,17 +1,74 @@ package com.sports.server.query.presentation; + +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.restdocs.request.RequestDocumentation.queryParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.sports.server.common.dto.PageRequestDto; +import com.sports.server.query.dto.response.CheerTalkResponse; import com.sports.server.support.DocumentationTest; +import java.time.LocalDateTime; +import java.util.List; import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; public class CheerTalkQueryControllerTest extends DocumentationTest { @Test - void 응원톡을_조회한다() { + void 응원톡을_조회한다() throws Exception { //given Long gameId = 1L; + PageRequestDto pageRequestDto = new PageRequestDto(1L, 2); + + LocalDateTime createdAt = LocalDateTime.of(2024, 1, 21, 11, 46, 0); + List response = List.of( + new CheerTalkResponse( + 2L, "응원해요", 1L, createdAt, false, 1 + ), + new CheerTalkResponse( + 3L, "파이팅", 2L, createdAt, false, 2 + ) + ); + + given(cheerTalkQueryService.getCheerTalksByGameId(gameId, pageRequestDto)) + .willReturn(response); + + // when + ResultActions result = mockMvc.perform(get("/games/{gameId}/cheer-talks", gameId) + .queryParam("cursor", String.valueOf(1)) + .queryParam("size", String.valueOf(2)) + .contentType(MediaType.APPLICATION_JSON) + ); + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + queryParameters( + parameterWithName("cursor").description("마지막 응원톡의 ID"), + parameterWithName("size").description("조회하고자 하는 응원톡의 개수") + ), + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), + responseFields( + fieldWithPath("[].cheerTalkId").type(JsonFieldType.NUMBER).description("응원톡의 ID"), + fieldWithPath("[].content").type(JsonFieldType.STRING).description("응원톡의 내용"), + fieldWithPath("[].gameTeamId").type(JsonFieldType.NUMBER) + .description("응원톡에 해당하는 게임팀의 ID"), + fieldWithPath("[].createdAt").type(JsonFieldType.STRING).description("생성된 날짜 및 시각"), + fieldWithPath("[].isBlocked").type(JsonFieldType.BOOLEAN).description("응원톡의 블락 여부"), + fieldWithPath("[].order").type(JsonFieldType.NUMBER).description("게임팀의 순서") + ) + )); } } diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 30b487fc..1264d0e0 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -14,9 +14,11 @@ import com.sports.server.command.report.application.ReportService; import com.sports.server.command.report.presentation.ReportController; import com.sports.server.common.log.TimeLogTemplate; +import com.sports.server.query.application.CheerTalkQueryService; import com.sports.server.query.application.GameQueryService; import com.sports.server.query.application.GameTeamQueryService; import com.sports.server.query.application.LineupPlayerQueryService; +import com.sports.server.query.presentation.CheerTalkQueryController; import com.sports.server.query.presentation.GameQueryController; import com.sports.server.support.config.RestDocsConfig; import org.springframework.beans.factory.annotation.Autowired; @@ -32,7 +34,7 @@ CheerTalkController.class, GameController.class, ReportController.class, -// CheerTalkQueryController.class, + CheerTalkQueryController.class, GameQueryController.class, // LeagueQueryController.class, // TimelineQueryController.class @@ -79,4 +81,7 @@ public class DocumentationTest { @MockBean protected ReportService reportService; + + @MockBean + protected CheerTalkQueryService cheerTalkQueryService; } From 42c6a0554e5f4f4c36877b92df0f196bdf826d20 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Mon, 22 Jan 2024 00:42:34 +0900 Subject: [PATCH 19/22] =?UTF-8?q?[TEST]=20=EB=A6=AC=EA=B7=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=B0=8F=20=EB=A6=AC=EA=B7=B8=EC=9D=98=20=EC=8A=A4?= =?UTF-8?q?=ED=8F=AC=EC=B8=A0=20=EC=A1=B0=ED=9A=8C=20api=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 12 +- src/main/resources/static/docs/api.html | 161 +++++++++++++++++- .../LeagueQueryControllerTest.java | 80 +++++++++ .../server/support/DocumentationTest.java | 7 +- 4 files changed, 257 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/sports/server/query/presentation/LeagueQueryControllerTest.java diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index e77b02d6..61e41fee 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -48,4 +48,14 @@ operation::game-controller-test/응원_횟수를_업데이트한다[snippets='ht === 응원톡 신고 -operation::report-controller-test/응원톡을_신고한다[snippets='http-request,request-fields,http-response'] \ No newline at end of file +operation::report-controller-test/응원톡을_신고한다[snippets='http-request,request-fields,http-response'] + +== 리그 API + +=== 리그 전체 조회 + +operation::league-query-controller-test/리그_전체를_조회한다[snippets='http-request,http-response,response-fields'] + +=== 리그에 해당하는 스포츠 종목 조히 + +operation::league-query-controller-test/리그의_해당하는_스포츠_전체를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] \ No newline at end of file diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index dc3c4f7c..a6f69e14 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -472,6 +472,12 @@

    훕치치 관객 서버 API 문서

  • 응원톡 신고
  • +
  • 리그 API + +
  • @@ -1422,11 +1428,164 @@

    +

    리그 API

    +
    +
    +

    리그 전체 조회

    +
    +

    HTTP request

    +
    +
    +
    GET /leagues HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 108
    +
    +[ {
    +  "leagueId" : 1,
    +  "name" : "리그 첫번쨰"
    +}, {
    +  "leagueId" : 2,
    +  "name" : "리그 두번째"
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].leagueId

    Number

    리그의 ID

    [].name

    String

    리그의 이름

    +
    +
    +
    +

    리그에 해당하는 스포츠 종목 조히

    +
    +

    HTTP request

    +
    +
    +
    GET /leagues/1/sports HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /leagues/{leagueId}/sports
    ParameterDescription

    leagueId

    리그의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 86
    +
    +[ {
    +  "sportId" : 1,
    +  "name" : "축구"
    +}, {
    +  "sportId" : 2,
    +  "name" : "농구"
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].sportId

    Number

    스포츠의 ID

    [].name

    String

    스포츠의 이름

    +
    +
    +
    + diff --git a/src/test/java/com/sports/server/query/presentation/LeagueQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/LeagueQueryControllerTest.java new file mode 100644 index 00000000..0ab20d39 --- /dev/null +++ b/src/test/java/com/sports/server/query/presentation/LeagueQueryControllerTest.java @@ -0,0 +1,80 @@ +package com.sports.server.query.presentation; + +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.sports.server.query.dto.response.LeagueResponse; +import com.sports.server.query.dto.response.LeagueSportResponse; +import com.sports.server.support.DocumentationTest; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; + +public class LeagueQueryControllerTest extends DocumentationTest { + + @Test + void 리그_전체를_조회한다() throws Exception { + + // given + List responses = List.of( + new LeagueResponse(1L, "리그 첫번쨰"), + new LeagueResponse(2L, "리그 두번째") + ); + + given(leagueQueryService.findAll()) + .willReturn(responses); + + // when + ResultActions result = mockMvc.perform(get("/leagues") + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + responseFields( + fieldWithPath("[].leagueId").type(JsonFieldType.NUMBER).description("리그의 ID"), + fieldWithPath("[].name").type(JsonFieldType.STRING).description("리그의 이름") + ) + )); + } + + @Test + void 리그의_해당하는_스포츠_전체를_조회한다() throws Exception { + + // given + Long leagueId = 1L; + + List responses = List.of( + new LeagueSportResponse(1L, "축구"), + new LeagueSportResponse(2L, "농구") + ); + + given(leagueQueryService.findSportsByLeague(leagueId)) + .willReturn(responses); + + // when + ResultActions result = mockMvc.perform(get("/leagues/{leagueId}/sports", leagueId) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("leagueId").description("리그의 ID") + ), + responseFields( + fieldWithPath("[].sportId").type(JsonFieldType.NUMBER).description("스포츠의 ID"), + fieldWithPath("[].name").type(JsonFieldType.STRING).description("스포츠의 이름") + ) + )); + } +} diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 1264d0e0..54608eb8 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -17,9 +17,11 @@ import com.sports.server.query.application.CheerTalkQueryService; import com.sports.server.query.application.GameQueryService; import com.sports.server.query.application.GameTeamQueryService; +import com.sports.server.query.application.LeagueQueryService; import com.sports.server.query.application.LineupPlayerQueryService; import com.sports.server.query.presentation.CheerTalkQueryController; import com.sports.server.query.presentation.GameQueryController; +import com.sports.server.query.presentation.LeagueQueryController; import com.sports.server.support.config.RestDocsConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; @@ -36,7 +38,7 @@ ReportController.class, CheerTalkQueryController.class, GameQueryController.class, -// LeagueQueryController.class, + LeagueQueryController.class, // TimelineQueryController.class }) @Import({ @@ -84,4 +86,7 @@ public class DocumentationTest { @MockBean protected CheerTalkQueryService cheerTalkQueryService; + + @MockBean + protected LeagueQueryService leagueQueryService; } From ba9a587ff9364663e9891b3207a8bf3e078dbfdd Mon Sep 17 00:00:00 2001 From: Jin409 Date: Mon, 22 Jan 2024 01:29:41 +0900 Subject: [PATCH 20/22] =?UTF-8?q?[TEST]=20=ED=83=80=EC=9E=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20api=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 6 +- src/main/resources/static/docs/api.html | 132 +++++++++++++++++- .../TimelineQueryControllerTest.java | 66 +++++++++ .../server/support/DocumentationTest.java | 7 +- 4 files changed, 208 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 61e41fee..61fd1931 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -58,4 +58,8 @@ operation::league-query-controller-test/리그_전체를_조회한다[snippets=' === 리그에 해당하는 스포츠 종목 조히 -operation::league-query-controller-test/리그의_해당하는_스포츠_전체를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] \ No newline at end of file +operation::league-query-controller-test/리그의_해당하는_스포츠_전체를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] + +== 타임라인 API +=== 게임의 타임라인 조회 +operation::timeline-query-controller-test/타임라인을_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index a6f69e14..6c690ada 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -478,6 +478,11 @@

    훕치치 관객 서버 API 문서

  • 리그에 해당하는 스포츠 종목 조히
  • +
  • 타임라인 API + +
  • @@ -1581,11 +1586,136 @@

    +
    +

    타임라인 API

    +
    +
    +

    게임의 타임라인 조회

    +
    +

    HTTP request

    +
    +
    +
    GET /games/1/timeline HTTP/1.1
    +Content-Type: application/json;charset=UTF-8
    +Host: localhost:8080
    +
    +
    +
    +
    +

    Path parameters

    + + ++++ + + + + + + + + + + + + +
    Table 1. /games/{gameId}/timeline
    ParameterDescription

    gameId

    게임의 ID

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +Content-Type: application/json
    +Content-Length: 540
    +
    +[ {
    +  "gameQuarter" : "쿼터1",
    +  "records" : [ {
    +    "scoredAt" : 25,
    +    "playerName" : "선수이름",
    +    "teamName" : "팀이름",
    +    "score" : 1
    +  }, {
    +    "scoredAt" : 30,
    +    "playerName" : "선수이름",
    +    "teamName" : "팀이름",
    +    "score" : 1
    +  } ]
    +}, {
    +  "gameQuarter" : "쿼터2",
    +  "records" : [ {
    +    "scoredAt" : 25,
    +    "playerName" : "선수이름",
    +    "teamName" : "팀이름",
    +    "score" : 1
    +  }, {
    +    "scoredAt" : 30,
    +    "playerName" : "선수이름",
    +    "teamName" : "팀이름",
    +    "score" : 1
    +  } ]
    +} ]
    +
    +
    +
    +
    +

    Response fields

    + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PathTypeDescription

    [].gameQuarter

    String

    쿼터의 이름

    [].records[].scoredAt

    Number

    득점한 시간

    [].records[].playerName

    String

    득점한 선수의 이름

    [].records[].teamName

    String

    팀 이름

    [].records[].score

    Number

    득점한 점수

    +
    +
    +
    +
    diff --git a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java new file mode 100644 index 00000000..90a0c4dd --- /dev/null +++ b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java @@ -0,0 +1,66 @@ +package com.sports.server.query.presentation; + +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.sports.server.query.dto.response.TimelineResponse; +import com.sports.server.query.dto.response.TimelineResponse.RecordResponse; +import com.sports.server.support.DocumentationTest; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; + +public class TimelineQueryControllerTest extends DocumentationTest { + + @Test + void 타임라인을_조회한다() throws Exception { + + // given + Long gameId = 1L; + + List responses = List.of( + new TimelineResponse("쿼터1", List.of( + new RecordResponse(25, "선수이름", "팀이름", 1), + new RecordResponse(30, "선수이름", "팀이름", 1) + )), + new TimelineResponse("쿼터2", List.of( + new RecordResponse(25, "선수이름", "팀이름", 1), + new RecordResponse(30, "선수이름", "팀이름", 1) + )) + + ); + + given(timelineQueryService.getTimeline(gameId)) + .willReturn(responses); + + // when + ResultActions result = mockMvc.perform(get("/games/{gameId}/timeline", gameId) + .contentType(MediaType.APPLICATION_JSON) + ); + + // then + result.andExpect((status().isOk())) + .andDo(RESULT_HANDLER.document( + pathParameters( + parameterWithName("gameId").description("게임의 ID") + ), + responseFields( + fieldWithPath("[].gameQuarter").type(JsonFieldType.STRING).description("쿼터의 이름"), + fieldWithPath("[].records[].scoredAt").type(JsonFieldType.NUMBER).description("득점한 시간"), + fieldWithPath("[].records[].playerName").type(JsonFieldType.STRING) + .description("득점한 선수의 이름"), + fieldWithPath("[].records[].teamName").type(JsonFieldType.STRING).description("팀 이름"), + fieldWithPath("[].records[].score").type(JsonFieldType.NUMBER).description("득점한 점수") + ) + )); + + + } +} diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 54608eb8..ed241b3a 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -19,9 +19,11 @@ import com.sports.server.query.application.GameTeamQueryService; import com.sports.server.query.application.LeagueQueryService; import com.sports.server.query.application.LineupPlayerQueryService; +import com.sports.server.query.application.TimelineQueryService; import com.sports.server.query.presentation.CheerTalkQueryController; import com.sports.server.query.presentation.GameQueryController; import com.sports.server.query.presentation.LeagueQueryController; +import com.sports.server.query.presentation.TimelineQueryController; import com.sports.server.support.config.RestDocsConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; @@ -39,7 +41,7 @@ CheerTalkQueryController.class, GameQueryController.class, LeagueQueryController.class, -// TimelineQueryController.class + TimelineQueryController.class }) @Import({ TimeLogTemplate.class, @@ -89,4 +91,7 @@ public class DocumentationTest { @MockBean protected LeagueQueryService leagueQueryService; + + @MockBean + protected TimelineQueryService timelineQueryService; } From ed3e0eb363102e45046313d4e22bb28fde58677d Mon Sep 17 00:00:00 2001 From: Jin409 Date: Tue, 23 Jan 2024 16:42:00 +0900 Subject: [PATCH 21/22] =?UTF-8?q?[DEL]=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20RestDocsConfig=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/support/DocumentationTest.java | 4 +--- .../server/support/config/RestDocsConfig.java | 20 ------------------- 2 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 src/test/java/com/sports/server/support/config/RestDocsConfig.java diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index ed241b3a..7cf635c7 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -24,7 +24,6 @@ import com.sports.server.query.presentation.GameQueryController; import com.sports.server.query.presentation.LeagueQueryController; import com.sports.server.query.presentation.TimelineQueryController; -import com.sports.server.support.config.RestDocsConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -44,8 +43,7 @@ TimelineQueryController.class }) @Import({ - TimeLogTemplate.class, - RestDocsConfig.class + TimeLogTemplate.class }) @AutoConfigureRestDocs public class DocumentationTest { diff --git a/src/test/java/com/sports/server/support/config/RestDocsConfig.java b/src/test/java/com/sports/server/support/config/RestDocsConfig.java deleted file mode 100644 index b33cd7b9..00000000 --- a/src/test/java/com/sports/server/support/config/RestDocsConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.sports.server.support.config; - -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; -import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler; -import org.springframework.restdocs.operation.preprocess.Preprocessors; - -@TestConfiguration -public class RestDocsConfig { - - @Bean - public RestDocumentationResultHandler write() { - return MockMvcRestDocumentation.document( - "{class-name}/{method-name}", - Preprocessors.preprocessRequest(Preprocessors.prettyPrint()), - Preprocessors.preprocessResponse(Preprocessors.prettyPrint()) - ); - } -} \ No newline at end of file From 09d90d4226610829cb107392541259824c02e739 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Tue, 23 Jan 2024 18:47:38 +0900 Subject: [PATCH 22/22] =?UTF-8?q?[DOCS]=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 2 +- src/main/resources/static/docs/api.html | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 61fd1931..5b735952 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -56,7 +56,7 @@ operation::report-controller-test/응원톡을_신고한다[snippets='http-reque operation::league-query-controller-test/리그_전체를_조회한다[snippets='http-request,http-response,response-fields'] -=== 리그에 해당하는 스포츠 종목 조히 +=== 리그에 해당하는 스포츠 종목 조회 operation::league-query-controller-test/리그의_해당하는_스포츠_전체를_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 6c690ada..dacff4ca 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -475,7 +475,7 @@

    훕치치 관객 서버 API 문서

  • 리그 API
  • 타임라인 API @@ -1500,9 +1500,9 @@

    -

    리그에 해당하는 스포츠 종목 조히

    +

    리그에 해당하는 스포츠 종목 조회

    -

    HTTP request

    +

    HTTP request

    GET /leagues/1/sports HTTP/1.1
    @@ -1512,7 +1512,7 @@ 

    -

    Path parameters

    +

    Path parameters

    @@ -1534,7 +1534,7 @@

    Table 1. /leagues/{leagueId}/sports
    @@ -1715,7 +1715,7 @@