From fa8c78db49e3392a5092d743d849230d37fc028e Mon Sep 17 00:00:00 2001 From: k-kbk Date: Tue, 30 Jan 2024 21:11:03 +0900 Subject: [PATCH] =?UTF-8?q?mvc=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/curation/CurationMvcTest.kt | 227 ++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 src/test/kotlin/com/mjucow/eatda/presentation/curation/CurationMvcTest.kt diff --git a/src/test/kotlin/com/mjucow/eatda/presentation/curation/CurationMvcTest.kt b/src/test/kotlin/com/mjucow/eatda/presentation/curation/CurationMvcTest.kt new file mode 100644 index 0000000..22a7e1e --- /dev/null +++ b/src/test/kotlin/com/mjucow/eatda/presentation/curation/CurationMvcTest.kt @@ -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" + } +}