test: 회원 API 테스트 코틀린 변환

This commit is contained in:
이상진 2025-07-12 19:57:47 +09:00
parent 3763e3c8b5
commit 7143948fd5

View File

@ -1,72 +1,68 @@
package roomescape.member.controller; package roomescape.member.controller
import java.util.Map; import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import io.kotest.assertions.assertSoftly
import io.kotest.matchers.collections.shouldContainAll
import io.kotest.matchers.shouldBe
import io.mockk.every
import io.restassured.module.kotlin.extensions.Extract
import org.hamcrest.Matchers.containsString
import roomescape.common.MemberFixture
import roomescape.common.NoSqlInitialize
import roomescape.common.RoomescapeApiTest
import roomescape.member.web.MembersResponse
import org.junit.jupiter.api.BeforeEach; @NoSqlInitialize
import org.junit.jupiter.api.DisplayName; class MemberControllerTest : RoomescapeApiTest() {
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.test.context.jdbc.Sql;
import io.restassured.RestAssured; init {
import io.restassured.http.ContentType; given("GET /members 요청을") {
import io.restassured.http.Header; val endpoint = "/members"
import roomescape.member.infrastructure.entity.Member;
import roomescape.member.infrastructure.entity.Role;
import roomescape.member.infrastructure.entity.MemberRepository;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) every { memberRepository.findAll() } returns listOf(
@Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) MemberFixture.create(name = "name1"),
class MemberControllerTest { MemberFixture.create(name = "name2"),
MemberFixture.create(name = "name3"),
)
@Autowired `when`("관리자가 보내면") {
private MemberRepository memberRepository; setUpAdmin()
@LocalServerPort then("성공한다.") {
private int port; val result: Any = runTest(endpoint) {
statusCode(200)
} Extract {
path("data")
}
@BeforeEach val response: MembersResponse = jacksonObjectMapper().convertValue(result, MembersResponse::class.java)
void setUp() {
RestAssured.port = port;
}
@Test assertSoftly(response.members) {
@DisplayName("/members 로 GET 요청을 보내면 회원 정보와 200 OK 를 받는다.") it.size shouldBe 3
void getAdminPage() { it.map { m -> m.name } shouldContainAll listOf("name1", "name2", "name3")
// given }
String accessTokenCookie = getAdminAccessTokenCookieByLogin("admin@admin.com", "12341234"); }
}
memberRepository.save(new Member("이름1", "test@test.com", "password", Role.MEMBER)); `when`("관리자가 아니면 로그인 페이지로 이동한다.") {
memberRepository.save(new Member("이름2", "test@test.com", "password", Role.MEMBER)); then("비회원") {
memberRepository.save(new Member("이름3", "test@test.com", "password", Role.MEMBER)); setUpNotLoggedIn()
memberRepository.save(new Member("이름4", "test@test.com", "password", Role.MEMBER));
// when & then runTest(endpoint) {
RestAssured.given().log().all() statusCode(200)
.port(port) body(containsString("<title>Login</title>"))
.header(new Header("Cookie", accessTokenCookie)) }
.when().get("/members") }
.then().log().all()
.statusCode(200);
}
private String getAdminAccessTokenCookieByLogin(final String email, final String password) { then("일반 회원") {
memberRepository.save(new Member("이름", email, password, Role.ADMIN)); setUpUser()
Map<String, String> loginParams = Map.of( runTest(endpoint) {
"email", email, statusCode(200)
"password", password body(containsString("<title>Login</title>"))
); }
}
String accessToken = RestAssured.given().log().all() }
.contentType(ContentType.JSON) }
.port(port) }
.body(loginParams)
.when().post("/login")
.then().log().all().extract().cookie("accessToken");
return "accessToken=" + accessToken;
}
} }