package kr.itn.itnhub;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.JdbcTemplate;

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

class SchemaMigrationTest extends AbstractDbTest {

    @Autowired
    JdbcTemplate jdbc;

    @Test
    void organization_테이블이_생성된다() {
        Integer count = jdbc.queryForObject(
                "select count(*) from information_schema.tables "
                        + "where table_schema = 'itnhub' and table_name = 'organization'",
                Integer.class);

        assertThat(count).isEqualTo(1);
    }

    @Test
    void 연번과_기관명_조합에_유니크_제약이_있다() {
        jdbc.update("insert into organization (org_no, org_name, channel_slug) "
                + "values ('008', '경찰청', '008')");

        // 같은 (org_no, org_name) 조합의 중복 삽입은 제약 위반으로 실패해야 한다.
        assertThatThrownBy(() -> jdbc.update(
                "insert into organization (org_no, org_name, channel_slug) "
                        + "values ('008', '경찰청', '008-dup')"))
                .isInstanceOf(DataIntegrityViolationException.class);

        // org_no는 같지만 org_name이 다르면(경찰청_치안정책연구소) 정상적으로 저장되어야 한다.
        jdbc.update("insert into organization (org_no, org_name, channel_slug) "
                + "values ('008', '경찰청_치안정책연구소', '008-2')");

        assertThat(jdbc.queryForObject(
                "select count(*) from organization where org_no = '008'", Integer.class))
                .isEqualTo(2);
    }
}
