#!/usr/bin/env bash set -euo pipefail if ! command -v docker >/dev/null || ! docker ps --format '{{.Names}}' | grep -qx 'wygj-mysql'; then echo "SKIP: AIHR schema migration test requires wygj-mysql" exit 0 fi ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" MYSQL_CONTAINER="wygj-mysql" DB="wygj_aihr_schema_test_$$" LEGACY_DB="wygj_aihr_candidate_legacy_test_$$" mysql() { docker exec -i "$MYSQL_CONTAINER" mysql -uroot -proot --default-character-set=utf8mb4 "$@" } cleanup() { mysql -e "DROP DATABASE IF EXISTS \`$DB\`;" >/dev/null 2>&1 || true mysql -e "DROP DATABASE IF EXISTS \`$LEGACY_DB\`;" >/dev/null 2>&1 || true } trap cleanup EXIT mysql -e "CREATE DATABASE \`$DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_case_media_mysql8.sql" mysql "$DB" <<'SQL' CREATE TABLE aihr_case_record ( id bigint NOT NULL AUTO_INCREMENT, tenant_id varchar(20) DEFAULT '000000', case_id varchar(80) NOT NULL, summary varchar(1000) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_aihr_case_record_case (tenant_id, case_id) ) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_case_media_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_case_media_mysql8.sql" case_media_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_case_record' AND column_name IN ('media_oss_id','media_url');")" test "$case_media_columns" = 'media_oss_id,media_url' mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_case_learning_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_case_learning_mysql8.sql" case_learning_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_case_record' AND column_name IN ('learning_points','supervisor_comment');")" test "$case_learning_columns" = 'learning_points,supervisor_comment' mysql "$DB" <<'SQL' CREATE TABLE aihr_prompt_template ( id bigint NOT NULL AUTO_INCREMENT, tenant_id varchar(20) DEFAULT '000000', code varchar(80) NOT NULL, name varchar(100) NOT NULL, category varchar(50) NOT NULL, output_format varchar(50) NOT NULL, system_prompt text, template text NOT NULL, variables varchar(1000), version varchar(30) DEFAULT 'v1', enabled tinyint DEFAULT 1, description varchar(500), create_time datetime, update_time datetime, PRIMARY KEY (id), UNIQUE KEY uk_aihr_prompt_template (tenant_id, code, output_format, version) ) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_prompt_template_seed_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_prompt_template_seed_mysql8.sql" prompt_template_count="$(mysql "$DB" -N -B -e "SELECT COUNT(*) FROM aihr_prompt_template WHERE tenant_id='000000';")" test "$prompt_template_count" = '6' mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_knowledge_feedback_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_knowledge_feedback_mysql8.sql" knowledge_feedback_tables="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(table_name ORDER BY table_name) FROM information_schema.tables WHERE table_schema='$DB' AND table_name IN ('aihr_knowledge_answer_feedback','aihr_knowledge_gap');")" test "$knowledge_feedback_tables" = 'aihr_knowledge_answer_feedback,aihr_knowledge_gap' mysql "$DB" -e "DROP TABLE aihr_knowledge_answer_feedback" mysql "$DB" <<'SQL' CREATE TABLE aihr_knowledge_answer_feedback ( id bigint NOT NULL AUTO_INCREMENT, tenant_id varchar(20) DEFAULT '000000', query_text varchar(1000) NOT NULL, query_norm varchar(500) NOT NULL, fragment_id bigint NOT NULL, verdict varchar(10) NOT NULL, category varchar(100), position varchar(80), source varchar(50), review_status varchar(30), create_time datetime, update_time datetime, PRIMARY KEY (id) ) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_knowledge_feedback_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_knowledge_feedback_mysql8.sql" feedback_review_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_knowledge_answer_feedback' AND column_name IN ('review_id','reviewer','reviewed_time');")" test "$feedback_review_columns" = 'review_id,reviewer,reviewed_time' mysql "$DB" <<'SQL' CREATE TABLE aihr_practice_session ( id bigint NOT NULL AUTO_INCREMENT, session_id varchar(100) NOT NULL, total_score int, ai_comment varchar(1000), PRIMARY KEY (id) ) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_practice_session_evidence_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_practice_session_evidence_mysql8.sql" practice_session_evidence_columns="$(mysql "$DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_practice_session' AND column_name IN ('annotations_json','review_advice','incentive_point','satisfaction_score','satisfaction_comment');")" test "$practice_session_evidence_columns" = '5' mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_practice_evidence_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_practice_evidence_mysql8.sql" evidence_tables="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(table_name ORDER BY table_name) FROM information_schema.tables WHERE table_schema='$DB' AND table_name IN ('aihr_practice_audio','aihr_practice_audio_upload','aihr_practice_calibration');")" test "$evidence_tables" = 'aihr_practice_audio,aihr_practice_audio_upload,aihr_practice_calibration' mysql "$DB" <<'SQL' CREATE TABLE aihr_sop_answer_review ( id bigint NOT NULL AUTO_INCREMENT, snippet_count int DEFAULT 0, PRIMARY KEY (id) ) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_sop_requester_identity_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_sop_requester_identity_mysql8.sql" sop_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_sop_answer_review' AND column_name IN ('source','prompt_version','requester_ext_party_id');")" test "$sop_columns" = 'source,prompt_version,requester_ext_party_id' mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql" mysql "$DB" <<'SQL' CREATE TABLE aihr_org_snapshot ( id bigint NOT NULL AUTO_INCREMENT, ext_party_id varchar(100), PRIMARY KEY (id) ) ENGINE=InnoDB; SQL mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql" mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql" org_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_org_snapshot' AND column_name='hire_date';")" test "$org_columns" = 'hire_date' mysql -e "CREATE DATABASE \`$LEGACY_DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;" mysql "$LEGACY_DB" <<'SQL' CREATE TABLE aihr_candidate_material ( id bigint NOT NULL AUTO_INCREMENT, status varchar(20) DEFAULT '待审核', PRIMARY KEY (id) ) ENGINE=InnoDB; CREATE TABLE aihr_interview_result ( id bigint NOT NULL AUTO_INCREMENT, session_id varchar(100) NOT NULL, total_score int, answers_json text, PRIMARY KEY (id) ) ENGINE=InnoDB; SQL mysql "$LEGACY_DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_candidate_interview_review_mysql8.sql" mysql "$LEGACY_DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_candidate_interview_review_mysql8.sql" candidate_interview_tables="$(mysql "$LEGACY_DB" -N -B -e "SELECT GROUP_CONCAT(table_name ORDER BY table_name) FROM information_schema.tables WHERE table_schema='$LEGACY_DB' AND table_name IN ('aihr_candidate_material','aihr_interview_result','aihr_candidate_employee_link');")" test "$candidate_interview_tables" = 'aihr_candidate_employee_link,aihr_candidate_material,aihr_interview_result' candidate_interview_columns="$(mysql "$LEGACY_DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$LEGACY_DB' AND ((table_name = 'aihr_candidate_material' AND column_name IN ('reviewer','reviewed_time')) OR (table_name = 'aihr_interview_result' AND column_name IN ('questions_json','reviewed_score','review_status','reviewer','review_note','reviewed_time')));")" test "$candidate_interview_columns" = '8' echo "PASS: AIHR legacy schema migrations are idempotent, including practice evidence, knowledge feedback, and candidate interview review fields"