89 lines
3.1 KiB
Kotlin

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")
}
}
}
}
}
}
}