package com.ga.api.support;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.postgresql.ds.PGSimpleDataSource;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * 테스트용 MyBatis 인프라.
 *
 * application-test.yml 이 MybatisAutoConfiguration / DataSourceAutoConfiguration 을 제외하므로
 * 컨텍스트에 SqlSessionFactory 가 없다. 그런데 MyBatisConfig 의
 * {@code @MapperScan(basePackages = "com.ga")} 가 모든 @Mapper 인터페이스의 MapperFactoryBean 을
 * 생성하고, 이들은 SqlSessionFactory(또는 SqlSessionTemplate)를 요구한다.
 *
 * 과거에는 AbstractControllerTest 가 매퍼를 하나씩 @MockBean 으로 막아 이 요구를 회피했으나,
 * 새 매퍼가 추가될 때마다 목록을 갱신해야 했고 누락 시
 * "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required" 로 컨텍스트 로딩이 깨졌다.
 *
 * 여기서 미접속 DataSource 기반 SqlSessionFactory 를 한 번 제공하면 매퍼 빈이 모두 생성되어
 * 그 문제가 사라진다. 컨트롤러 테스트는 Service 를 mock 하므로 실제 쿼리는 실행되지 않는다.
 */
@TestConfiguration
public class TestMyBatisConfig {

    /** 실제 연결하지 않는다. SqlSessionFactory 생성과 Mapper 빈 등록 용도로만 존재. */
    @Bean
    public DataSource dataSource() {
        PGSimpleDataSource ds = new PGSimpleDataSource();
        ds.setUrl("jdbc:postgresql://localhost:5432/test");
        ds.setUser("test");
        ds.setPassword("test");
        return ds;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        return factory.getObject();
    }
}
