package incheon.product.geoview3d.traffic.config;

import org.junit.jupiter.api.Test;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

import static org.assertj.core.api.Assertions.assertThat;

/**
 * TrafficAsyncConfig 단위 테스트.
 * 교통/CCTV 비동기 스레드풀 설정값을 검증한다.
 */
class TrafficAsyncConfigTest {

    private final TrafficAsyncConfig config = new TrafficAsyncConfig();

    @Test
    void productTrfExecutorCreatedWithCorrectConfig() {
        Executor executor = config.productTrfExecutor();

        assertThat(executor).isInstanceOf(ThreadPoolTaskExecutor.class);
        ThreadPoolTaskExecutor pool = (ThreadPoolTaskExecutor) executor;
        assertThat(pool.getCorePoolSize()).isEqualTo(2);
        assertThat(pool.getMaxPoolSize()).isEqualTo(8);
        assertThat(pool.getThreadNamePrefix()).isEqualTo("product-trf-");
    }

    @Test
    void productTrfCctvExecutorCreatedWithCorrectConfig() {
        Executor executor = config.productTrfCctvExecutor();

        assertThat(executor).isInstanceOf(ThreadPoolTaskExecutor.class);
        ThreadPoolTaskExecutor pool = (ThreadPoolTaskExecutor) executor;
        assertThat(pool.getCorePoolSize()).isEqualTo(2);
        assertThat(pool.getMaxPoolSize()).isEqualTo(8);
        assertThat(pool.getThreadNamePrefix()).isEqualTo("product-trf-cctv-");
    }

    @Test
    void executorsAreIndependentInstances() {
        Executor trf = config.productTrfExecutor();
        Executor cctv = config.productTrfCctvExecutor();

        assertThat(trf).isNotSameAs(cctv);
    }
}
