diff --git a/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleLoginControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleLoginControllerTest.kt index 7148693..1cc0639 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleLoginControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleLoginControllerTest.kt @@ -21,7 +21,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.http.MediaType import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.setup.MockMvcBuilders @@ -65,13 +64,11 @@ class AppleLoginControllerTest : BehaviorSpec({ .param("code", code) .param("clientToken", clientToken) ).andExpect(status().isOk) - .andDo( - document( - "apple-login", - requestParameters( - "code" parameterTypeOf STRING parameterMeans "애플에서 제공해주는 인증 코드", - "clientToken" parameterTypeOf STRING parameterMeans "FCM Token" - ) + .andDocument( + "apple-login", + requestParameters( + "code" parameterTypeOf STRING parameterMeans "애플에서 제공해주는 인증 코드", + "clientToken" parameterTypeOf STRING parameterMeans "FCM Token" ) ).andReturn() @@ -91,15 +88,13 @@ class AppleLoginControllerTest : BehaviorSpec({ .content(refreshTokenRequest.toRequest()) .contentType(MediaType.APPLICATION_JSON) ).andExpect(status().isOk) - .andDo( - document( - "apple-relogin", - requestFields( - "refreshToken" typeOf STRING means "Apple의 RefreshToken" - ), - responseFields( - "idToken" typeOf STRING means "Apple의 JWT Token" - ) + .andDocument( + "apple-relogin", + requestFields( + "refreshToken" typeOf STRING means "Apple의 RefreshToken" + ), + responseFields( + "idToken" typeOf STRING means "Apple의 JWT Token" ) ).andReturn() diff --git a/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleRevokeControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleRevokeControllerTest.kt index 33eadac..0b2c2de 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleRevokeControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/oauth/apple/presentation/AppleRevokeControllerTest.kt @@ -5,6 +5,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.kotlin.KotlinModule import io.junseok.todeveloperdo.oauth.apple.service.AppleMemberService import io.junseok.todeveloperdo.util.ObjectMappers +import io.junseok.todeveloperdo.util.dsl.andDocument import io.junseok.todeveloperdo.util.dsl.authorizationHeader import io.junseok.todeveloperdo.util.setAuthorization import io.kotest.core.spec.style.BehaviorSpec @@ -13,7 +14,6 @@ import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDoc import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.setup.MockMvcBuilders @@ -53,11 +53,9 @@ class AppleRevokeControllerTest : BehaviorSpec({ post(APPLE_REVOKE) .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "revoke-apple", - authorizationHeader() - ) + .andDocument( + "revoke-apple", + authorizationHeader() ) verify(exactly = 1) { appleMemberService.revoke("username") } diff --git a/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/GitHubControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/GitHubControllerTest.kt index bf47d13..2612c93 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/GitHubControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/GitHubControllerTest.kt @@ -19,7 +19,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.http.MediaType import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status @@ -65,22 +64,20 @@ class GitHubControllerTest : BehaviorSpec({ .content(gitHubRequest.toRequest()) .contentType(MediaType.APPLICATION_JSON) ).andExpect(status().isOk) - .andDo( - document( - "github-repo-create", - authorizationHeader(), - requestFields( - "repoName" typeOf STRING means "레포 이름", - "description" typeOf STRING means "레포 설명 글", - "isPrivate" typeOf BOOLEAN means "레포 공개 유무(true면 비공개)" - ), - responseFields( - "id" typeOf NUMBER means "레포 고유 ID", - "name" typeOf STRING means "레포 이름", - "full_name" typeOf STRING means "owner/repo-name 형식의 전체 이름", - "owner" typeOf OBJECT means "Owner객체", - "owner.login" typeOf STRING means "깃허브 사용자" - ) + .andDocument( + "github-repo-create", + authorizationHeader(), + requestFields( + "repoName" typeOf STRING means "레포 이름", + "description" typeOf STRING means "레포 설명 글", + "isPrivate" typeOf BOOLEAN means "레포 공개 유무(true면 비공개)" + ), + responseFields( + "id" typeOf NUMBER means "레포 고유 ID", + "name" typeOf STRING means "레포 이름", + "full_name" typeOf STRING means "owner/repo-name 형식의 전체 이름", + "owner" typeOf OBJECT means "Owner객체", + "owner.login" typeOf STRING means "깃허브 사용자" ) ).andReturn() @@ -97,12 +94,11 @@ class GitHubControllerTest : BehaviorSpec({ get(GITHUB_PATH + "check") .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "check-git-link", - authorizationHeader() - ) + .andDocument( + "check-git-link", + authorizationHeader() ) + verify(exactly = 1) { gitHubService.checkGitLink("username") } } } @@ -120,17 +116,16 @@ class GitHubControllerTest : BehaviorSpec({ .content(payload.toRequest()) .contentType(MediaType.APPLICATION_JSON) ).andExpect(status().isOk) - .andDo( - document( - "setting-git-webhook", - requestFields( - "key" typeOf STRING means "페이로드 내 key 값" - ), - requestHeaders( - "X-GitHub-Event" headerTypeOf STRING means "Github 이벤트 종류" - ) + .andDocument( + "setting-git-webhook", + requestFields( + "key" typeOf STRING means "페이로드 내 key 값" + ), + requestHeaders( + "X-GitHub-Event" headerTypeOf STRING means "Github 이벤트 종류" ) ) + verify(exactly = 1) { gitHubService.webhookProcess(payload, event) } } } diff --git a/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/LoginControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/LoginControllerTest.kt index 61bdd15..88df637 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/LoginControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/oauth/git/presentation/LoginControllerTest.kt @@ -6,6 +6,7 @@ import io.junseok.todeveloperdo.oauth.git.service.GitHubOAuthService import io.junseok.todeveloperdo.oauth.git.service.createGitTokenResponse import io.junseok.todeveloperdo.util.ObjectMappers import io.junseok.todeveloperdo.util.dsl.STRING +import io.junseok.todeveloperdo.util.dsl.andDocument import io.junseok.todeveloperdo.util.dsl.parameterTypeOf import io.junseok.todeveloperdo.util.dsl.requestParameters import io.kotest.core.spec.style.BehaviorSpec @@ -17,7 +18,6 @@ import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDoc import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get import org.springframework.test.web.servlet.result.MockMvcResultMatchers.header import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status @@ -69,13 +69,10 @@ class LoginControllerTest : BehaviorSpec({ startsWith("https://github.com/login/oauth/authorize") ) ) - - .andDo( - document( - "redirect-to-github", - requestParameters( - "appleId" parameterTypeOf STRING parameterMeans "애플 ID" - ) + .andDocument( + "redirect-to-github", + requestParameters( + "appleId" parameterTypeOf STRING parameterMeans "애플 ID" ) ) } @@ -86,26 +83,30 @@ class LoginControllerTest : BehaviorSpec({ val tokenResponse = createGitTokenResponse() val code = "code" val appleId = "appleId" - every { gitHubOAuthService.processGitHubOAuth(code,appleId) } returns tokenResponse + every { gitHubOAuthService.processGitHubOAuth(code, appleId) } returns tokenResponse When("GET /login/oauth2/code/github 요청") { Then("딥링크로 리디렉션되고 토큰이 포함된다") { mockMvc.perform( get("/login/oauth2/code/github") - .param("code",code) - .param("state",appleId) - ) .andExpect(status().is3xxRedirection) - .andExpect(header().string("Location", "myapp://callback?token=${tokenResponse.token}")) - .andDo( - document( - "callback-from-github", - requestParameters( - "code" parameterTypeOf STRING parameterMeans "GitHub에서 전달된 인증 코드", - "state" parameterTypeOf STRING parameterMeans "초기 로그인 시 전달한 Apple ID" - ) + .param("code", code) + .param("state", appleId) + ).andExpect(status().is3xxRedirection) + .andExpect( + header().string( + "Location", + "myapp://callback?token=${tokenResponse.token}" + ) + ) + .andDocument( + "callback-from-github", + requestParameters( + "code" parameterTypeOf STRING parameterMeans "GitHub에서 전달된 인증 코드", + "state" parameterTypeOf STRING parameterMeans "초기 로그인 시 전달한 Apple ID" ) ) - verify(exactly = 1) { gitHubOAuthService.processGitHubOAuth(code,appleId) } + + verify(exactly = 1) { gitHubOAuthService.processGitHubOAuth(code, appleId) } } } } diff --git a/src/test/kotlin/io/junseok/todeveloperdo/presentation/member/MemberControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/presentation/member/MemberControllerTest.kt index 9a3586a..5b14ae9 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/presentation/member/MemberControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/presentation/member/MemberControllerTest.kt @@ -17,7 +17,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.http.MediaType import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.* import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.setup.MockMvcBuilders @@ -31,18 +30,14 @@ class MemberControllerTest : BehaviorSpec({ val memberController = MemberController(memberService) val restDocumentation = ManualRestDocumentation() - val mockMvc = MockMvcBuilders - .standaloneSetup(memberController) - .apply( - MockMvcRestDocumentation.documentationConfiguration( - restDocumentation - ) + val mockMvc = MockMvcBuilders.standaloneSetup(memberController).apply( + MockMvcRestDocumentation.documentationConfiguration( + restDocumentation ) - .build() + ).build() beforeSpec { - ObjectMappers.objectMapper = ObjectMapper() - .registerModules(KotlinModule.Builder().build()) + ObjectMappers.objectMapper = ObjectMapper().registerModules(KotlinModule.Builder().build()) restDocumentation.beforeTest(javaClass, "MemberController") } @@ -53,9 +48,7 @@ class MemberControllerTest : BehaviorSpec({ Given("인증된 사용자가 멤버 정보를 조회할 때") { val userName = "username" val expectedResponse = MemberInfoResponse( - username = "testUser", - avatarUrl = "test", - gitUrl = "gitUrl" + username = "testUser", avatarUrl = "test", gitUrl = "gitUrl" ) every { memberService.findMember(userName) } returns expectedResponse @@ -63,22 +56,17 @@ class MemberControllerTest : BehaviorSpec({ When("GET /api/member 요청을 보내면") { Then("멤버 정보를 정상적으로 반환한다") { val mvcResult = mockMvc.perform( - get("/api/member") - .setAuthorization() - ) - .andExpect(status().isOk) - .andDo( - document( - "member-info", - authorizationHeader(), - responseFields( - "username" typeOf STRING means "회원 이름", - "avatarUrl" typeOf STRING means "GitHub 프로필 URL", - "gitUrl" typeOf STRING means "GitHub URL", - ) - ) - ) - .andReturn() + get("/api/member").setAuthorization() + ).andExpect(status().isOk) + .andDocument( + "member-info", + authorizationHeader(), + responseFields( + "username" typeOf STRING means "회원 이름", + "avatarUrl" typeOf STRING means "GitHub 프로필 URL", + "gitUrl" typeOf STRING means "GitHub URL", + ), + ).andReturn() mvcResult.toResponse() shouldBe expectedResponse verify(exactly = 1) { memberService.findMember(userName) } } @@ -91,19 +79,15 @@ class MemberControllerTest : BehaviorSpec({ When("DELETE /api/member 요청을 보내면") { Then("정상적으로 탈퇴가 되어야한다.") { mockMvc.perform( - delete("/api/member") - .principal(MockkPrincipal(userName)) + delete("/api/member").principal(MockkPrincipal(userName)) .contentType(MediaType.APPLICATION_JSON) .header("Authorization", "Bearer test-token") - ) - .andExpect(status().isOk) - .andDo( - document( - "delete-member", - authorizationHeader() - ) + ).andExpect(status().isOk) + .andDocument( + "delete-member", authorizationHeader() ) + verify(exactly = 1) { memberService.deleteMember(userName) } } } @@ -119,25 +103,17 @@ class MemberControllerTest : BehaviorSpec({ When("GET /api/member/all를 호출하면") { Then("등록된 사용자 리스트가 반환되어야한다.") { val mvcResult = mockMvc.perform( - get("/api/member/all") - .header("Authorization", "Bearer test-token") + get("/api/member/all").header("Authorization", "Bearer test-token") .principal(MockkPrincipal(userName)) - ) - .andExpect(status().isOk) - .andDo( - document( - "find-all-user", - authorizationHeader(), - responseFields( - "memberId" arrayTypeOf NUMBER means "회원 ID", - "username" arrayTypeOf STRING means "회원 이름", - "avatarUrl" arrayTypeOf STRING means "GitHub 프로필 URL", - "gitUrl" arrayTypeOf STRING means "GitHub URL", - "friendStatus" arrayTypeOf STRING means "친구 상태" - ) - ) + ).andExpect(status().isOk).andDocument( + "find-all-user", authorizationHeader(), responseFields( + "memberId" arrayTypeOf NUMBER means "회원 ID", + "username" arrayTypeOf STRING means "회원 이름", + "avatarUrl" arrayTypeOf STRING means "GitHub 프로필 URL", + "gitUrl" arrayTypeOf STRING means "GitHub URL", + "friendStatus" arrayTypeOf STRING means "친구 상태" ) - .andReturn() + ).andReturn() mvcResult.toResponse>() shouldBe memberResponses verify(exactly = 1) { memberService.findAllMember(userName) } @@ -153,21 +129,17 @@ class MemberControllerTest : BehaviorSpec({ When("POST /api/member/fcm 을 호출하면") { Then("FCM 토큰이 정상적으로 재발급되어야한다.") { mockMvc.perform( - post("/api/member/fcm") - .principal(MockkPrincipal(userName)) - .content(fcmRequest.toRequest()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk) - .andDo( - document( - "reissue-fcm-token", - requestFields( - "fcmToken" typeOf STRING means "FCM토큰" - ), - ) + post("/api/member/fcm").principal(MockkPrincipal(userName)) + .content(fcmRequest.toRequest()).contentType(MediaType.APPLICATION_JSON) + ).andExpect(status().isOk) + .andDocument( + "reissue-fcm-token", + requestFields( + "fcmToken" typeOf STRING means "FCM토큰" + ), ) + verify(exactly = 1) { memberService.reIssued(userName, fcmRequest.fcmToken) } } } diff --git a/src/test/kotlin/io/junseok/todeveloperdo/presentation/memberfriend/MemberFriendControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/presentation/memberfriend/MemberFriendControllerTest.kt index da04cf8..47093ae 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/presentation/memberfriend/MemberFriendControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/presentation/memberfriend/MemberFriendControllerTest.kt @@ -24,7 +24,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.http.MediaType import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.* import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.setup.MockMvcBuilders @@ -66,16 +65,14 @@ class MemberFriendControllerTest : FunSpec({ get(PATH) .setAuthorization("username") ).andExpect(status().isOk) - .andDo( - document( - "Follow member-Friend", - authorizationHeader(), - responseFields( - "memberId" arrayTypeOf NUMBER means "사용자 ID", - "friendUsername" arrayTypeOf STRING means "사용자 깃허브 닉네임", - "friendGitUrl" arrayTypeOf STRING means "사용자 깃허브 URL", - "avatarUrl" arrayTypeOf STRING means "사용자 깃허브 프로필URL" - ) + .andDocument( + "Follow member-Friend", + authorizationHeader(), + responseFields( + "memberId" arrayTypeOf NUMBER means "사용자 ID", + "friendUsername" arrayTypeOf STRING means "사용자 깃허브 닉네임", + "friendGitUrl" arrayTypeOf STRING means "사용자 깃허브 URL", + "avatarUrl" arrayTypeOf STRING means "사용자 깃허브 프로필URL" ) ).andReturn() @@ -94,16 +91,14 @@ class MemberFriendControllerTest : FunSpec({ get(PATH + "request-list") .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "request-Friend-list", - authorizationHeader(), - responseFields( - "memberId" arrayTypeOf NUMBER means "사용자 ID", - "friendUsername" arrayTypeOf STRING means "사용자 깃허브 닉네임", - "friendGitUrl" arrayTypeOf STRING means "사용자 깃허브 URL", - "avatarUrl" arrayTypeOf STRING means "사용자 깃허브 프로필URL" - ) + .andDocument( + "request-Friend-list", + authorizationHeader(), + responseFields( + "memberId" arrayTypeOf NUMBER means "사용자 ID", + "friendUsername" arrayTypeOf STRING means "사용자 깃허브 닉네임", + "friendGitUrl" arrayTypeOf STRING means "사용자 깃허브 URL", + "avatarUrl" arrayTypeOf STRING means "사용자 깃허브 프로필URL" ) ) .andReturn() @@ -124,19 +119,17 @@ class MemberFriendControllerTest : FunSpec({ .setAuthorization() ) .andExpect(status().isOk) - .andDo( - document( - "single-friend", - pathParameters( - "memberId" parameterTypeOf NUMBER parameterMeans "조회할 사용자 ID" - ), - authorizationHeader(), - responseFields( - "memberId" typeOf NUMBER means "사용자 ID", - "friendUsername" typeOf STRING means "사용자 깃허브 닉네임", - "friendGitUrl" typeOf STRING means "사용자 깃허브 URL", - "avatarUrl" typeOf STRING means "사용자 깃허브 프로필URL" - ) + .andDocument( + "single-friend", + pathParameters( + "memberId" parameterTypeOf NUMBER parameterMeans "조회할 사용자 ID" + ), + authorizationHeader(), + responseFields( + "memberId" typeOf NUMBER means "사용자 ID", + "friendUsername" typeOf STRING means "사용자 깃허브 닉네임", + "friendGitUrl" typeOf STRING means "사용자 깃허브 URL", + "avatarUrl" typeOf STRING means "사용자 깃허브 프로필URL" ) ).andReturn() mvcResult.toResponse() shouldBe friendResponse @@ -149,15 +142,14 @@ class MemberFriendControllerTest : FunSpec({ .setAuthorization() ) .andExpect(status().isOk) - .andDo( - document( - "request-friend", - pathParameters( - "friendId" parameterTypeOf NUMBER parameterMeans "요청할 사용자 ID" - ), - authorizationHeader() - ) + .andDocument( + "request-friend", + pathParameters( + "friendId" parameterTypeOf NUMBER parameterMeans "요청할 사용자 ID" + ), + authorizationHeader() ) + verify(exactly = 1) { memberFriendService.registerFriend(1L, any()) } } @@ -168,18 +160,17 @@ class MemberFriendControllerTest : FunSpec({ .setAuthorization() .queryParam("type", "FOLLOW") ).andExpect(status().isOk) - .andDo( - document( - "unfollow-friend", - authorizationHeader(), - pathParameters( - "friendId" parameterTypeOf NUMBER parameterMeans "언팔할 사용자 ID" - ), - requestParameters( - "type" parameterTypeOf NUMBER requestParamMeans "FriendStatus 상태값" - ) + .andDocument( + "unfollow-friend", + authorizationHeader(), + pathParameters( + "friendId" parameterTypeOf NUMBER parameterMeans "언팔할 사용자 ID" + ), + requestParameters( + "type" parameterTypeOf NUMBER requestParamMeans "FriendStatus 상태값" ) ) + verify(exactly = 1) { memberFriendService.deleteFriend(1L, any(), any()) } } @@ -190,14 +181,12 @@ class MemberFriendControllerTest : FunSpec({ get(PATH + "accept/{friendId}", 1L) .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "accept-friend", - pathParameters( - "friendId" parameterTypeOf NUMBER parameterMeans "친구요청을 수락할 사용자 ID" - ), - authorizationHeader() - ) + .andDocument( + "accept-friend", + pathParameters( + "friendId" parameterTypeOf NUMBER parameterMeans "친구요청을 수락할 사용자 ID" + ), + authorizationHeader() ) verify(exactly = 1) { memberFriendService.approveRequest(1L, any()) } @@ -214,16 +203,14 @@ class MemberFriendControllerTest : FunSpec({ get(PATH + "send-list") .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "find-send-list", - authorizationHeader(), - responseFields( - "memberId" arrayTypeOf NUMBER means "사용자 ID", - "friendUsername" arrayTypeOf STRING means "사용자 깃허브 닉네임", - "friendGitUrl" arrayTypeOf STRING means "사용자 깃허브 URL", - "avatarUrl" arrayTypeOf STRING means "사용자 깃허브 프로필URL" - ) + .andDocument( + "find-send-list", + authorizationHeader(), + responseFields( + "memberId" arrayTypeOf NUMBER means "사용자 ID", + "friendUsername" arrayTypeOf STRING means "사용자 깃허브 닉네임", + "friendGitUrl" arrayTypeOf STRING means "사용자 깃허브 URL", + "avatarUrl" arrayTypeOf STRING means "사용자 깃허브 프로필URL" ) ).andReturn() @@ -240,21 +227,19 @@ class MemberFriendControllerTest : FunSpec({ .characterEncoding("UTF-8") ) .andExpect(status().isOk) - .andDo( - document( - "search-friend-todolist", - pathParameters( - "friendId" parameterTypeOf NUMBER parameterMeans "조회할 사용자 Id" - ), - authorizationHeader() - ) + .andDocument( + "search-friend-todolist", + pathParameters( + "friendId" parameterTypeOf NUMBER parameterMeans "조회할 사용자 Id" + ), + authorizationHeader() ).andReturn() mvcResult.toResponse>() shouldBe todoResponses } test("친구 깃허브 이름으로 친구 검색 API") { val memberResponse = createMemberResponse(1L, "apple") - every { memberFriendService.getGitFriend(any(),any()) } returns memberResponse + every { memberFriendService.getGitFriend(any(), any()) } returns memberResponse val mvcResult = mockMvc.perform( post(PATH + "search") @@ -264,21 +249,19 @@ class MemberFriendControllerTest : FunSpec({ FriendNameRequest("friendName").toRequest() ) ).andExpect(status().isOk) - .andDo( - document( - "find-by-gitName", - requestFields( - "gitUserName" typeOf STRING means "검색하려는 사용자 Git 닉네임" - ), - responseFields( - "memberId" typeOf NUMBER means "사용자 ID", - "username" typeOf STRING means "사용자 Git 닉네임", - "avatarUrl" typeOf STRING means "Git 프로필 URL", - "gitUrl" typeOf STRING means "사용자 gitUrl", - "friendStatus" typeOf STRING means "친구상태" - ), - authorizationHeader() - ) + .andDocument( + "find-by-gitName", + requestFields( + "gitUserName" typeOf STRING means "검색하려는 사용자 Git 닉네임" + ), + responseFields( + "memberId" typeOf NUMBER means "사용자 ID", + "username" typeOf STRING means "사용자 Git 닉네임", + "avatarUrl" typeOf STRING means "Git 프로필 URL", + "gitUrl" typeOf STRING means "사용자 gitUrl", + "friendStatus" typeOf STRING means "친구상태" + ), + authorizationHeader() ).andReturn() mvcResult.toResponse() shouldBe memberResponse diff --git a/src/test/kotlin/io/junseok/todeveloperdo/presentation/membertodolist/MemberTodoControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/presentation/membertodolist/MemberTodoControllerTest.kt index 28a87b1..6073601 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/presentation/membertodolist/MemberTodoControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/presentation/membertodolist/MemberTodoControllerTest.kt @@ -24,7 +24,6 @@ import io.mockk.* import org.springframework.http.MediaType import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.* import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.setup.MockMvcBuilders @@ -34,11 +33,9 @@ import java.time.LocalDate class MemberTodoControllerTest : FunSpec({ val memberTodoService = mockk() val fcmScheduler = mockk() - //val rabbitMQProducer = mockk() val memberTodoController = MemberTodoController( memberTodoService, fcmScheduler, - //rabbitMQProducer ) val restDocumentation = ManualRestDocumentation() @@ -72,24 +69,23 @@ class MemberTodoControllerTest : FunSpec({ .contentType(MediaType.APPLICATION_JSON) .content(todoRequests.toRequest()) ).andExpect(status().isOk) - .andDo( - document( - "create-todo", - authorizationHeader(), - requestFields( - "todos" typeOf ARRAY means "할 일 리스트", - "todos[].content" typeOf STRING means "할 일 내용", - "todos[].memo" typeOf STRING means "메모", - "todos[].tag" typeOf STRING means "태그", - "todos[].deadline" typeOf STRING means "마감일 (yyyy-MM-dd)" - ), - ) - ).andReturn() + .andDocument( + "create-todo", + authorizationHeader(), + requestFields( + "todos" typeOf ARRAY means "할 일 리스트", + "todos[].content" typeOf STRING means "할 일 내용", + "todos[].memo" typeOf STRING means "메모", + "todos[].tag" typeOf STRING means "태그", + "todos[].deadline" typeOf STRING means "마감일 (yyyy-MM-dd)" + ), + + ).andReturn() mvcResult.toResponse() shouldBe 1L } test("해당 요일에 있는 할 일 목록 조회 API") { - val today = LocalDate.now() + val today = LocalDate.of(2025, 5, 13) val createDateRequest = createDateRequest() val todoResponses = listOf( createTodoResponse(1L, "", today), @@ -102,21 +98,19 @@ class MemberTodoControllerTest : FunSpec({ .contentType(MediaType.APPLICATION_JSON) .content(createDateRequest.toRequest()) ).andExpect(status().isOk) - .andDo( - document( - "find-todoList", - authorizationHeader(), - requestFields( - "deadline" typeOf STRING means "마감일 (yyyy-MM-dd)" - ), - responseFields( - "todoListId" arrayTypeOf NUMBER means "할 일 Id", - "content" arrayTypeOf STRING means "할 일 내용", - "memo" arrayTypeOf STRING means "메모", - "tag" arrayTypeOf STRING means "태크", - "deadline" arrayTypeOf ARRAY means "마감일 (yyyy-MM-dd)", - "todoStatus" arrayTypeOf STRING means "할 일 상태" - ) + .andDocument( + "find-todoList", + authorizationHeader(), + requestFields( + "deadline" typeOf STRING means "마감일 (yyyy-MM-dd)" + ), + responseFields( + "todoListId" arrayTypeOf NUMBER means "할 일 Id", + "content" arrayTypeOf STRING means "할 일 내용", + "memo" arrayTypeOf STRING means "메모", + "tag" arrayTypeOf STRING means "태크", + "deadline" arrayTypeOf ARRAY means "마감일 (yyyy-MM-dd)", + "todoStatus" arrayTypeOf STRING means "할 일 상태" ) ).andReturn() @@ -129,13 +123,11 @@ class MemberTodoControllerTest : FunSpec({ patch(TODO_PATH + "done/{todoListId}", 1L) .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "done-todoList", - authorizationHeader(), - pathParameters( - "todoListId" parameterTypeOf NUMBER parameterMeans "완료한 TodoListId" - ) + .andDocument( + "done-todoList", + authorizationHeader(), + pathParameters( + "todoListId" parameterTypeOf NUMBER parameterMeans "완료한 TodoListId" ) ) verify(exactly = 1) { memberTodoService.finishTodoList(any(), any(), any()) } @@ -152,21 +144,20 @@ class MemberTodoControllerTest : FunSpec({ .contentType(MediaType.APPLICATION_JSON) ) .andExpect(status().isOk) - .andDo( - document( - "modify-todoList", - authorizationHeader(), - requestFields( - "content" typeOf STRING means "할 일 내용", - "memo" typeOf STRING means "메모", - "tag" typeOf STRING means "태그", - "deadline" typeOf STRING means "마감일 (yyyy-MM-dd)" - ), - pathParameters( - "todoListId" parameterTypeOf NUMBER parameterMeans "수정할 TodoListId" - ) + .andDocument( + "modify-todoList", + authorizationHeader(), + requestFields( + "content" typeOf STRING means "할 일 내용", + "memo" typeOf STRING means "메모", + "tag" typeOf STRING means "태그", + "deadline" typeOf STRING means "마감일 (yyyy-MM-dd)" + ), + pathParameters( + "todoListId" parameterTypeOf NUMBER parameterMeans "수정할 TodoListId" ) ) + verify(exactly = 1) { memberTodoService.modifyTodoList(any(), any(), any()) } } @@ -177,13 +168,11 @@ class MemberTodoControllerTest : FunSpec({ .setAuthorization() ) .andExpect(status().isOk) - .andDo( - document( - "remove-todoList", - authorizationHeader(), - pathParameters( - "todoListId" parameterTypeOf NUMBER parameterMeans "삭제할 TodoListId" - ) + .andDocument( + "remove-todoList", + authorizationHeader(), + pathParameters( + "todoListId" parameterTypeOf NUMBER parameterMeans "삭제할 TodoListId" ) ) @@ -209,18 +198,16 @@ class MemberTodoControllerTest : FunSpec({ .contentType(MediaType.APPLICATION_JSON) .content(todoCountRequest.toRequest()) ).andExpect(status().isOk) - .andDo( - document( - "calculate-todoList", - authorizationHeader(), - requestFields( - "year" typeOf NUMBER means "조회하는 연(년)도", - "month" typeOf NUMBER means "조회하는 달" - ), - responseFields( - "deadline" arrayTypeOf ARRAY means "마감기한 일", - "count" arrayTypeOf NUMBER means "할 일 갯수" - ) + .andDocument( + "calculate-todoList", + authorizationHeader(), + requestFields( + "year" typeOf NUMBER means "조회하는 연(년)도", + "month" typeOf NUMBER means "조회하는 달" + ), + responseFields( + "deadline" arrayTypeOf ARRAY means "마감기한 일", + "count" arrayTypeOf NUMBER means "할 일 갯수" ) ).andReturn() @@ -230,20 +217,18 @@ class MemberTodoControllerTest : FunSpec({ test("할 일을 미진행 -> 진행으로 변경하는 API") { every { memberTodoService.unFinishedTodoList(any(), any(), any()) } just runs mockMvc.perform( - patch(TODO_PATH+"proceed/{todoListId}",1L) + patch(TODO_PATH + "proceed/{todoListId}", 1L) .setAuthorization() ) .andExpect(status().isOk) - .andDo( - document( - "change-todoList-status", - authorizationHeader(), - pathParameters( - "todoListId" parameterTypeOf NUMBER parameterMeans "진행할 TodoListId" - ) + .andDocument( + "change-todoList-status", + authorizationHeader(), + pathParameters( + "todoListId" parameterTypeOf NUMBER parameterMeans "진행할 TodoListId" ) ) - verify(exactly = 1) { memberTodoService.unFinishedTodoList(any(),any(),any()) } + verify(exactly = 1) { memberTodoService.unFinishedTodoList(any(), any(), any()) } } }) { companion object { @@ -252,7 +237,7 @@ class MemberTodoControllerTest : FunSpec({ } fun createTodoRequest(): TodoRequest { - val today = LocalDate.of(2025,5,13) + val today = LocalDate.of(2025, 5, 13) return TodoRequest( content = "content", memo = "memo", diff --git a/src/test/kotlin/io/junseok/todeveloperdo/presentation/plan/PlanControllerTest.kt b/src/test/kotlin/io/junseok/todeveloperdo/presentation/plan/PlanControllerTest.kt index b2eb7c2..7030b5b 100644 --- a/src/test/kotlin/io/junseok/todeveloperdo/presentation/plan/PlanControllerTest.kt +++ b/src/test/kotlin/io/junseok/todeveloperdo/presentation/plan/PlanControllerTest.kt @@ -17,7 +17,6 @@ import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDoc import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.restdocs.ManualRestDocumentation import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation -import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status import org.springframework.test.web.servlet.setup.MockMvcBuilders @@ -61,18 +60,16 @@ class PlanControllerTest : FunSpec({ get("/api/plan") .setAuthorization() ).andExpect(status().isOk) - .andDo( - document( - "show-all-plan", - authorizationHeader(), - responseFields( - "planId" arrayTypeOf NUMBER means "생성된 플랜 ID", - "position" arrayTypeOf STRING means "개발 포지션", - "stack" arrayTypeOf STRING means "기술 스택", - "experienceLevel" arrayTypeOf STRING means "경험 수준", - "targetPeriod" arrayTypeOf NUMBER means "희망 학습 기간", - "createDt" arrayTypeOf ARRAY means "생성된 일자" - ) + .andDocument( + "show-all-plan", + authorizationHeader(), + responseFields( + "planId" arrayTypeOf NUMBER means "생성된 플랜 ID", + "position" arrayTypeOf STRING means "개발 포지션", + "stack" arrayTypeOf STRING means "기술 스택", + "experienceLevel" arrayTypeOf STRING means "경험 수준", + "targetPeriod" arrayTypeOf NUMBER means "희망 학습 기간", + "createDt" arrayTypeOf ARRAY means "생성된 일자" ) ).andReturn() diff --git a/src/test/kotlin/io/junseok/todeveloperdo/util/dsl/Document.kt b/src/test/kotlin/io/junseok/todeveloperdo/util/dsl/Document.kt new file mode 100644 index 0000000..e25860b --- /dev/null +++ b/src/test/kotlin/io/junseok/todeveloperdo/util/dsl/Document.kt @@ -0,0 +1,10 @@ +package io.junseok.todeveloperdo.util.dsl + +import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document +import org.springframework.restdocs.snippet.Snippet +import org.springframework.test.web.servlet.ResultActions + +fun ResultActions.andDocument( + identifier: String, + vararg snippets: Snippet +) : ResultActions = andDo(document(identifier, *snippets))