Files
prop-ai-hr/scripts/tests/aihr-schema-migrations.test.sh
T

189 lines
11 KiB
Bash
Executable File

#!/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_$$"
while IFS= read -r migration; do
migration_name="$(basename "$migration")"
grep -Fq "backend/script/sql/update/$migration_name" "$ROOT_DIR/docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md" || {
echo "FAIL: AIHR migration missing from production Runbook: $migration_name" >&2
exit 1
}
done < <(find "$ROOT_DIR/backend/script/sql/update" -maxdepth 1 -type f -name 'aihr_*_mysql8.sql' -print | sort)
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 "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_position_sop_qualification_mysql8.sql"
mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260715_position_sop_qualification_mysql8.sql"
position_sop_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_onboard_task','aihr_position_responsibility','aihr_qualification_gate','aihr_sop_applicability');")"
test "$position_sop_tables" = 'aihr_onboard_task,aihr_position_responsibility,aihr_qualification_gate,aihr_sop_applicability'
position_responsibility_columns="$(mysql "$DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_position_responsibility' AND column_name IN ('position_code','responsibility_text','sop_id','sop_code');")"
test "$position_responsibility_columns" = '4'
sop_applicability_columns="$(mysql "$DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_sop_applicability' AND column_name IN ('sop_id','sop_code','project_type','industry','org_scope');")"
test "$sop_applicability_columns" = '5'
onboard_task_columns="$(mysql "$DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_onboard_task' AND column_name IN ('ext_party_id','position_code','task_type','status','assign_by');")"
test "$onboard_task_columns" = '5'
qualification_gate_columns="$(mysql "$DB" -N -B -e "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_qualification_gate' AND column_name IN ('ext_party_id','position_code','cert_id','passed','valid_thru');")"
test "$qualification_gate_columns" = '5'
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, candidate interview review, and position/SOP qualification contracts"