package kr.itn.itnhub; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @SpringBootTest @Testcontainers class SchemaMigrationTest { @Container @ServiceConnection static PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:16"); @DynamicPropertySource static void secrets(DynamicPropertyRegistry registry) { registry.add("app.admin.username", () -> "admin"); registry.add("app.admin.password", () -> "test-password"); registry.add("mattermost.base-url", () -> "http://localhost:1"); registry.add("mattermost.token", () -> "test-token"); registry.add("mattermost.team-id", () -> "test-team"); } @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); } }