package kr.xit.core.spring.test;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.restdocs.RestDocumentationExtension;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.transaction.annotation.Transactional;

/**
 * <pre>
 * description : 통합 테스트에 공통적으로 사용할 수 있는 공통 클래스
 *  <code>@Disabled</code> : 테스트 클래스 또는 테스트 메서드를 실행하지 않는다
 *              -> 상속만을 위한 클래스이기 때문에 실행할 필요가 없다.
 *  <code>@Transactional</code> : 각각의 테스트 메서드가 실행될 때마다, 데이터베이스를 롤백
 *                   -> @Rollback(false) 애너테이션을 추가시 데이타베이스 반영
 *  <code>@AutoConfigureMockMvc</code> : @WebMvcTest가 아닌 @SpringBootTest 애너테이션을 사용하면서
 *                          MockMvc를 이용한 테스트를 해야 할 때 필요
 *  <code>@ActiveProfiles</code> : 테스트 수행시 사용할 프로파일 지정
 *  <code>@AutoConfigureRestDocs</code> : Spring REST Docs를 사용하기 위해 MockMvc 빈을 커스터마이즈
 *                           -> Mock MVC, REST Assured 또는 WebTestClient로 테스트할 때 Spring REST Docs 사용 가능
 *  <code>@ExtendWith(RestDocumentationExtension.class)</code> : Spring REST Docs를 활성화하는 데 사용되는 JUNit 5 애너테이션
 * packageName : kr.xit.core.spring.test
 * fileName    : BaseIntegrationTest
 * author      : julim
 * date        : 2023-11-29
 * ======================================================================
 * 변경일         변경자        변경 내용
 * ----------------------------------------------------------------------
 * 2023-11-29    julim       최초 생성
 *
 * </pre>
 */
@Disabled
@Transactional
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureRestDocs
@ActiveProfiles("test")
@ExtendWith(RestDocumentationExtension.class)
public class BaseIntegrationTest {

    @Autowired
    protected MockMvc mockMvc;

}
