#!/usr/bin/env bash
# 작업용 드라이버 (커밋 산출물 아님). 격리 MySQL m6c-iso-t1 을 띄워 스키마 · 저장 함수 · 마이그레이션 · 합성 시드를 적재하고 itspec 을 돈다.
# 사용: m6c-run-itspec.sh <jest 결과 json> <파일(서버 기준 상대경로)...>
set -euo pipefail
WT=/home/madsc/work/insuniverse-temp/.worktrees/admin-rbac
META=.claude/meta/2026-10-21-admin-rbac-m6c
SCHEMA=/home/madsc/work/security-review/insuniverse-isolated/initdb
OUT=$1; shift
NAME=m6c-iso-t1
PW="t1-$RANDOM$RANDOM"
PORT=$(node -e 'const s=require("net").createServer();s.listen(0,"127.0.0.1",()=>{console.log(s.address().port);s.close()})')
docker rm -f $NAME >/dev/null 2>&1 || true
trap 'docker rm -f $NAME >/dev/null 2>&1 || true' EXIT
docker run -d --rm --name $NAME -e MYSQL_ROOT_PASSWORD="$PW" -e MYSQL_DATABASE=insuniverse -p "127.0.0.1:$PORT:3306" mysql:8.0.42 --log-bin-trust-function-creators=1 --sql-mode="" --skip-log-bin --innodb-redo-log-capacity=16777216 >/dev/null
for i in $(seq 1 120); do docker exec -e MYSQL_PWD="$PW" $NAME mysql -h127.0.0.1 -uroot -e 'SELECT 1' >/dev/null 2>&1 && break; sleep 1; done
q() { docker exec -i -e MYSQL_PWD="$PW" $NAME mysql -h127.0.0.1 -uroot --default-character-set=utf8mb4 -N -B "$@"; }
q -e 'DROP DATABASE IF EXISTS insuniverse; CREATE DATABASE insuniverse;'
q insuniverse < $SCHEMA/02-schema.sql
q insuniverse < $SCHEMA/01-functions.sql
q insuniverse < $WT/insuniverse-server/drizzle/0031_admin_audit.sql
q insuniverse < $WT/insuniverse-server/drizzle/0036_auth_permission.sql
q insuniverse < $WT/$META/synthetic-tenants.sql
cd $WT/insuniverse-server
export IT_MYSQL_PORT=$PORT IT_MYSQL_PASSWORD="$PW" IT_MYSQL_DATABASE=insuniverse
rc=0
npx jest --json --outputFile="$OUT" --config $WT/$META/jest-itspec.config.cjs "$@" > "$OUT.log" 2>&1 || rc=$?
echo "JEST_RC=$rc"
node -e 'const j=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));console.log(JSON.stringify({failed:j.numFailedTests,passed:j.numPassedTests,total:j.numTotalTests,pending:j.numPendingTests,suiteFail:j.numFailedTestSuites,rtErr:j.numRuntimeErrorTestSuites}));for(const t of j.testResults)for(const a of t.assertionResults)if(a.status!=="passed")console.log("NOT-PASSED: "+a.fullName+" :: "+a.status)' "$OUT"
