Skip to content

Commit

Permalink
mvc 테스트 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
k-kbk committed Jan 30, 2024
1 parent c652c07 commit fa8c78d
Showing 1 changed file with 227 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
package com.mjucow.eatda.presentation.curation

import autoparams.kotlin.AutoKotlinSource
import com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper
import com.epages.restdocs.apispec.ResourceDocumentation
import com.epages.restdocs.apispec.ResourceSnippetParametersBuilder
import com.mjucow.eatda.domain.curation.entity.objectmother.CurationMother
import com.mjucow.eatda.domain.curation.service.command.CurationCommandService
import com.mjucow.eatda.domain.curation.service.command.dto.AddStoreCommand
import com.mjucow.eatda.domain.curation.service.command.dto.CreateCurationCommand
import com.mjucow.eatda.domain.curation.service.command.dto.UpdateCurationCommand
import com.mjucow.eatda.domain.curation.service.query.CurationQueryService
import com.mjucow.eatda.domain.curation.service.query.dto.CurationDto
import com.mjucow.eatda.domain.curation.service.query.dto.Curations
import com.mjucow.eatda.presentation.AbstractMockMvcTest
import com.ninjasquad.springmockk.MockkBean
import io.mockk.every
import org.hamcrest.core.Is
import org.hamcrest.core.IsNull
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.http.MediaType
import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders
import org.springframework.restdocs.payload.JsonFieldType
import org.springframework.restdocs.payload.PayloadDocumentation
import org.springframework.restdocs.request.RequestDocumentation
import org.springframework.test.web.servlet.result.MockMvcResultMatchers

@WebMvcTest(CurationController::class)
class CurationMvcTest : AbstractMockMvcTest() {
@MockkBean(relaxUnitFun = true)
lateinit var curationQueryService: CurationQueryService

@MockkBean(relaxUnitFun = true)
lateinit var curationCommandService: CurationCommandService

@Test
fun findAll() {
// given
val entityId = 1L
val curations =
Curations(listOf(CurationDto.from(CurationMother.createWithId(id = entityId))))
every { curationQueryService.findAll() } returns curations

// when & then
mockMvc.perform(
RestDocumentationRequestBuilders.get(BASE_URI)
)
.andExpect(MockMvcResultMatchers.status().isOk)
.andExpect(MockMvcResultMatchers.jsonPath("message", Is.`is`(IsNull.nullValue())))
.andExpect(MockMvcResultMatchers.jsonPath("body").exists())
.andDo(
MockMvcRestDocumentationWrapper.document(
identifier = "curation-findAll",
resourceDetails = ResourceSnippetParametersBuilder()
.tag("curation")
.description("큐레이션 전체 조회")
.responseFields(
PayloadDocumentation.fieldWithPath("message").type(JsonFieldType.STRING)
.description("에러 메세지"),
PayloadDocumentation.fieldWithPath("body").type(JsonFieldType.ARRAY)
.description("큐레이션 데이터"),
PayloadDocumentation.fieldWithPath("body[].id")
.type(JsonFieldType.NUMBER)
.description("큐레이션 식별자"),
PayloadDocumentation.fieldWithPath("body[].title")
.type(JsonFieldType.STRING)
.description("큐레이션 제목"),
PayloadDocumentation.fieldWithPath("body[].description")
.type(JsonFieldType.STRING)
.description("큐레이션 설명"),
PayloadDocumentation.fieldWithPath("body[].stores")
.type(JsonFieldType.ARRAY)
.description("큐레이션 가게들")
)
)
)
}

@ParameterizedTest
@AutoKotlinSource
fun create(id: Long) {
// given
val createCurationCommand = CreateCurationCommand(
title = CurationMother.TITLE,
description = CurationMother.DESCRIPTION
)
val content = objectMapper.writeValueAsString(createCurationCommand)
every { curationCommandService.create(any()) } returns id

// when & then
mockMvc.perform(
RestDocumentationRequestBuilders.post(BASE_URI)
.contentType(MediaType.APPLICATION_JSON)
.content(content)
)
.andExpect(MockMvcResultMatchers.status().isCreated)
.andExpect(MockMvcResultMatchers.jsonPath("body", Is.`is`(id)))
.andDo(
MockMvcRestDocumentationWrapper.document(
identifier = "curation-create",
resourceDetails = ResourceSnippetParametersBuilder()
.tag("curation")
.description("큐레이션 생성")
.requestFields(
PayloadDocumentation.fieldWithPath("title").type(JsonFieldType.STRING)
.description("큐레이션 제목"),
PayloadDocumentation.fieldWithPath("description")
.type(JsonFieldType.STRING)
.description("큐레이션 설명")
)
.responseFields(
PayloadDocumentation.fieldWithPath("message").type(JsonFieldType.STRING)
.description("에러 메세지"),
PayloadDocumentation.fieldWithPath("body").type(JsonFieldType.NUMBER)
.description("생성된 큐레이션 식별자")
)
)
)
}

@Test
fun update() {
// given
val id = 1L
val updateCurationCommand = UpdateCurationCommand(
title = CurationMother.TITLE,
description = CurationMother.DESCRIPTION
)
val content = objectMapper.writeValueAsString(updateCurationCommand)

// when & then
mockMvc.perform(
RestDocumentationRequestBuilders.patch("$BASE_URI/{curationId}", id)
.contentType(MediaType.APPLICATION_JSON)
.content(content)
)
.andExpect(MockMvcResultMatchers.status().isOk)
.andDo(
MockMvcRestDocumentationWrapper.document(
identifier = "curation-update",
resourceDetails = ResourceSnippetParametersBuilder()
.tag("curation")
.description("큐레이션 수정")
.pathParameters(
ResourceDocumentation.parameterWithName("curationId")
.description("큐레이션 식별자")
)
.requestFields(
PayloadDocumentation.fieldWithPath("title").type(JsonFieldType.STRING)
.description("수정할 큐레이션 제목"),
PayloadDocumentation.fieldWithPath("description")
.type(JsonFieldType.STRING)
.description("수정할 큐레이션 설명")
)
)
)
}

@Test
fun delete() {
// given

// when & then
mockMvc.perform(
RestDocumentationRequestBuilders.delete("$BASE_URI/{curationId}", 1)
)
.andExpect(MockMvcResultMatchers.status().isNoContent)
.andDo(
MockMvcRestDocumentationWrapper.document(
identifier = "curation-delete",
resourceDetails = ResourceSnippetParametersBuilder()
.tag("curation")
.description("큐레이션 삭제")
.pathParameters(
RequestDocumentation.parameterWithName("curationId")
.description("큐레이션 식별자")
)
)
)
}

@Test
fun addStore() {
// given
val id = 1L
val addStoreCommand = AddStoreCommand(Long.MAX_VALUE)
val content = objectMapper.writeValueAsString(addStoreCommand)
every { curationCommandService.addStore(id, any()) } returns id

// when & then
mockMvc.perform(
RestDocumentationRequestBuilders.post("$BASE_URI/{curationId}/store", id)
.contentType(MediaType.APPLICATION_JSON)
.content(content)
)
.andExpect(MockMvcResultMatchers.status().isCreated)
.andExpect(MockMvcResultMatchers.jsonPath("body", Is.`is`(id.toInt())))
.andDo(
MockMvcRestDocumentationWrapper.document(
identifier = "curation-create",
resourceDetails = ResourceSnippetParametersBuilder()
.tag("curation")
.description("큐레이션 생성")
.pathParameters(
RequestDocumentation.parameterWithName("curationId")
.description("큐레이션 식별자")
)
.requestFields(
PayloadDocumentation.fieldWithPath("storeId").type(JsonFieldType.NUMBER)
.description("가게 식별자")
)
.responseFields(
PayloadDocumentation.fieldWithPath("message").type(JsonFieldType.STRING)
.description("에러 메세지"),
PayloadDocumentation.fieldWithPath("body").type(JsonFieldType.NUMBER)
.description("가게를 추가한 큐레이션 식별자")
)
)
)
}

companion object {
const val BASE_URI = "/api/v1/curations"
}
}

0 comments on commit fa8c78d

Please sign in to comment.