package roomescape.member.controller import io.kotest.assertions.assertSoftly import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.shouldBe import io.mockk.every import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest import org.springframework.test.web.servlet.MockMvc import roomescape.member.web.MemberController import roomescape.member.web.MemberRetrieveListResponse import roomescape.util.MemberFixture import roomescape.util.RoomescapeApiTest import kotlin.random.Random @WebMvcTest(controllers = [MemberController::class]) class MemberControllerTest( @Autowired private val mockMvc: MockMvc ) : RoomescapeApiTest() { init { given("GET /members 요청을") { val endpoint = "/members" every { memberRepository.findAll() } returns listOf( MemberFixture.create(id = Random.nextLong(), name = "name1"), MemberFixture.create(id = Random.nextLong(), name = "name2"), MemberFixture.create(id = Random.nextLong(), name = "name3"), ) `when`("관리자가 보내면") { loginAsAdmin() then("성공한다.") { val result: String = runGetTest( mockMvc = mockMvc, endpoint = endpoint, log = true ) { status { isOk() } }.andReturn().response.contentAsString val response: MemberRetrieveListResponse = readValue( responseJson = result, valueType = MemberRetrieveListResponse::class.java ) assertSoftly(response.members) { it.size shouldBe 3 it.map { m -> m.name } shouldContainAll listOf("name1", "name2", "name3") } } } `when`("관리자가 아니면 로그인 페이지로 이동한다.") { then("비회원") { doNotLogin() runGetTest( mockMvc = mockMvc, endpoint = endpoint, log = true ) { status { is3xxRedirection() } header { string("Location", "/login") } } } then("일반 회원") { loginAsUser() runGetTest( mockMvc = mockMvc, endpoint = endpoint, log = true ) { status { is3xxRedirection() } header { string("Location", "/login") } } } } } } }