package com.zioinfo.kintex.common;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.fail;

import java.util.Set;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.Configuration;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;

/**
 * 전 @Mapper 인터페이스의 어노테이션 SQL(@Select/@Insert/@Update/@Delete, &lt;script&gt; 포함) 파싱 회귀 테스트.
 *
 * 배경(2026-07-12 배포 크래시): &lt;script&gt; 블록 안의 이스케이프 안 된 비교연산 `<`가 XML(SAX) 파싱을 깨면
 * compileJava·일반 단위테스트(스프링 컨텍스트 미기동)는 통과하고 서버 부팅에서만 크래시 루프가 난다.
 * 이 테스트는 DB·스프링 컨텍스트 없이 MyBatis Configuration.addMapper 로 파싱만 수행해 그 유형을 로컬에서 잡는다.
 */
class MapperAnnotationParseTest {

    @Test
    void allMapperAnnotationSqlParses() throws Exception {
        ClassPathScanningCandidateComponentProvider scanner =
                new ClassPathScanningCandidateComponentProvider(false) {
                    @Override
                    protected boolean isCandidateComponent(AnnotatedBeanDefinition bd) {
                        return bd.getMetadata().isInterface();
                    }
                };
        scanner.addIncludeFilter(new AnnotationTypeFilter(Mapper.class));
        Set<BeanDefinition> defs = scanner.findCandidateComponents("com.zioinfo.kintex");
        assertFalse(defs.isEmpty(), "@Mapper 스캔 결과 0건 — 패키지/애노테이션 확인");

        Configuration cfg = new Configuration();
        for (BeanDefinition bd : defs) {
            Class<?> mapper = Class.forName(bd.getBeanClassName());
            try {
                cfg.addMapper(mapper);
            } catch (Exception e) {
                fail("매퍼 어노테이션 SQL 파싱 실패: " + mapper.getName()
                        + " — <script> 블록의 '<'는 &lt; 로 이스케이프하거나 비교를 뒤집어라. 원인: " + e.getMessage());
            }
        }
    }
}
