#!/usr/bin/env php $key) { $g5[$key] = $test_absent_prefix . $index; } // 복합 ALTER의 첫 컬럼만 없는 역방향 부분 적용 상태에서도 과거 마이그레이션이 중단되지 않아야 한다. g5_migration_test_execute(g5_migration_parse_file(G5_PATH . '/migrations/20140331_001_shop_cart_shipping.sql')); g5_migration_test_execute(g5_migration_parse_file(G5_PATH . '/migrations/20180330_001_social_login.sql')); g5_migration_test_execute(g5_migration_parse_file(G5_PATH . '/migrations/20260723_001_inicis_pro.sql')); if (!g5_migration_column_exists($test_cart_table, 'it_sc_type') || !g5_migration_column_exists($test_config_table, 'cf_social_login_use') || !g5_migration_column_exists($test_config_table, 'cf_member_img_size') || !g5_migration_column_exists($test_shop_default_table, 'de_inicis_pro_alert_use')) { g5_migration_test_fail('역방향 부분 적용 스키마에서 과거 복합 변경의 기준 컬럼을 복구하지 못했습니다.'); } $schema_migration = g5_migration_parse_file(G5_PATH . '/migrations/20260904_002_reconcile_partial_schema.sql'); g5_migration_test_execute($schema_migration); if (!g5_migration_column_exists($test_config_table, 'cf_google_secret') || !g5_migration_column_exists($test_config_table, 'cf_member_img_width') || !g5_migration_column_exists($test_config_table, 'cf_member_img_height')) { g5_migration_test_fail('부분 적용 설정 테이블의 누락 컬럼을 복구하지 못했습니다.'); } if (!g5_migration_column_exists($test_cart_table, 'it_sc_method') || !g5_migration_column_exists($test_shop_default_table, 'de_inicis_pro_monitor_message') || !g5_migration_column_exists($test_inicis_pay_table, 'ip_pg_status') || !g5_migration_index_exists($test_inicis_pay_table, 'ip_refund_required')) { g5_migration_test_fail('부분 적용 쇼핑몰 테이블의 누락 컬럼 또는 인덱스를 복구하지 못했습니다.'); } $write_column = sql_fetch("SHOW COLUMNS FROM `{$test_write_table}` LIKE 'wr_seo_title'", false); if (!isset($write_column['Type']) || strtolower($write_column['Type']) !== 'varchar(255)') { g5_migration_test_fail('게시판 글 SEO 컬럼의 최종 자료형을 보정하지 못했습니다.'); } sql_query("INSERT INTO `{$test_config_table}` SET cf_member_img_size = 0, cf_member_img_width = 0, cf_member_img_height = 0", false); sql_query("INSERT INTO `{$test_content_table}` SET co_id = 'company', co_subject = '회사 소개', co_seo_title = ''", false); sql_query("INSERT INTO `{$test_item_table}` SET it_id = 'item-1', it_sc_type = 2, it_sc_method = 1, it_sc_price = 3000, it_sc_minimum = 50000, it_sc_qty = 2", false); sql_query("INSERT INTO `{$test_cart_table}` SET it_id = 'item-1'", false); $data_migration = g5_migration_parse_file(G5_PATH . '/migrations/20260904_003_backfill_legacy_data.sql'); g5_migration_test_execute($data_migration); $config_row = sql_fetch("SELECT cf_member_img_size, cf_member_img_width, cf_member_img_height FROM `{$test_config_table}` LIMIT 1", false); if ((int) $config_row['cf_member_img_size'] !== 50000 || (int) $config_row['cf_member_img_width'] !== 60 || (int) $config_row['cf_member_img_height'] !== 60) { g5_migration_test_fail('회원 이미지 설정 기본값을 보정하지 못했습니다.'); } $content_row = sql_fetch("SELECT co_seo_title FROM `{$test_content_table}` WHERE co_id = 'company'", false); if (!isset($content_row['co_seo_title']) || $content_row['co_seo_title'] === '') { g5_migration_test_fail('콘텐츠 SEO 제목을 보정하지 못했습니다.'); } $cart_row = sql_fetch("SELECT it_sc_type, it_sc_method, it_sc_price, it_sc_minimum, it_sc_qty FROM `{$test_cart_table}` WHERE it_id = 'item-1'", false); if ((int) $cart_row['it_sc_type'] !== 2 || (int) $cart_row['it_sc_method'] !== 1 || (int) $cart_row['it_sc_price'] !== 3000 || (int) $cart_row['it_sc_minimum'] !== 50000 || (int) $cart_row['it_sc_qty'] !== 2) { g5_migration_test_fail('장바구니 배송비 데이터를 보정하지 못했습니다.'); } $migrations = g5_migration_discover(); $migration_ids = array(); $dependency_records = array(); foreach ($migrations as $migration) { if (isset($migration['error'])) { g5_migration_test_fail($migration['error']); } $migration_ids[] = $migration['id']; $dependency_records[$migration['id']] = array('status' => 'success', 'checksum' => $migration['checksum']); } $sorted_ids = $migration_ids; sort($sorted_ids, SORT_STRING); if ($migration_ids !== $sorted_ids) { g5_migration_test_fail('전체 마이그레이션이 오래된 순서로 정렬되지 않았습니다.'); } $last_migration = $migrations[count($migrations) - 1]; unset($dependency_records[$migrations[0]['id']]); if (g5_migration_validate_target_dependencies($migrations, $dependency_records, $last_migration['id']) === '') { g5_migration_test_fail('누락된 선행 마이그레이션을 차단하지 못했습니다.'); } echo "실행 순서·선행 조건·부분 적용 스키마·기존 데이터 보정 검사가 통과했습니다.\n";