skillhub/scripts/tests/identity-binding-v2-postgres-test.sh
XiaoSeS 9557478dd8 feat(auth): add explicit identity link and safe unlink flow
Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
2026-07-31 07:02:17 +08:00

137 lines
4.4 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
RUN_ID="skillhub-identity-v2-$$"
POSTGRES_CONTAINER="${RUN_ID}-postgres"
NETWORK="${RUN_ID}-network"
POSTGRES_USER="identity_v2"
POSTGRES_PASSWORD="identity-v2-test-password"
POSTGRES_DB="identity_v2"
MAVEN_CACHE_DIR="${MAVEN_CACHE_DIR:-${HOME}/.m2}"
log() {
printf '[identity-binding-v2] %s\n' "$*"
}
cleanup() {
exit_code="$?"
if [[ "${exit_code}" -ne 0 ]]; then
log "failed with exit code ${exit_code}"
docker ps -a \
--filter "label=skillhub.test.run=${RUN_ID}" \
--format 'resource={{.Names}} status={{.Status}}' || true
docker logs "${POSTGRES_CONTAINER}" 2>&1 || true
fi
docker rm -f "${POSTGRES_CONTAINER}" >/dev/null 2>&1 || true
docker network rm "${NETWORK}" >/dev/null 2>&1 || true
}
trap cleanup EXIT
log "creating isolated Docker network ${NETWORK}"
docker network create \
--label "skillhub.test.run=${RUN_ID}" \
"${NETWORK}" >/dev/null
log "starting isolated PostgreSQL container ${POSTGRES_CONTAINER}"
docker run -d \
--name "${POSTGRES_CONTAINER}" \
--label "skillhub.test.run=${RUN_ID}" \
--network "${NETWORK}" \
--memory=1g \
--cpus=1 \
-e "POSTGRES_USER=${POSTGRES_USER}" \
-e "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}" \
-e "POSTGRES_DB=${POSTGRES_DB}" \
-p 127.0.0.1::5432 \
postgres:16-alpine >/dev/null
log "waiting for PostgreSQL readiness"
postgres_ready="false"
for _ in $(seq 1 60); do
pid_one_comm="$(
docker exec "${POSTGRES_CONTAINER}" \
cat /proc/1/comm 2>/dev/null || true
)"
if [[ "${pid_one_comm}" == "postgres" ]] \
&& docker exec "${POSTGRES_CONTAINER}" \
pg_isready -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" \
>/dev/null 2>&1; then
postgres_ready="true"
break
fi
sleep 1
done
if [[ "${postgres_ready}" != "true" ]]; then
log "PostgreSQL did not become ready after entrypoint initialization"
exit 1
fi
log "PostgreSQL is ready"
run_test() {
test_class="$1"
flyway_target="${2:-}"
java_version=""
if command -v java >/dev/null 2>&1; then
java_version="$(java -version 2>&1)"
fi
if [[ "${java_version}" == *'"21.'* ]]; then
host_port="$(docker port "${POSTGRES_CONTAINER}" 5432/tcp \
| sed -n 's/.*://p')"
if [[ -z "${host_port}" ]]; then
log "Docker did not publish a PostgreSQL host port"
return 1
fi
log "running ${test_class} with host Java 21"
(
cd "${REPO_ROOT}/server"
IDENTITY_BINDING_V2_POSTGRES_URL="jdbc:postgresql://127.0.0.1:${host_port}/${POSTGRES_DB}" \
IDENTITY_BINDING_V2_POSTGRES_USERNAME="${POSTGRES_USER}" \
IDENTITY_BINDING_V2_POSTGRES_PASSWORD="${POSTGRES_PASSWORD}" \
IDENTITY_BINDING_V2_FLYWAY_TARGET="${flyway_target}" \
MAVEN_OPTS="-Xmx2g -XX:MaxMetaspaceSize=512m" \
./mvnw \
-pl skillhub-app \
-am \
"-Dtest=${test_class}" \
-Dsurefire.failIfNoSpecifiedTests=false \
test
)
return
fi
log "running ${test_class} with containerized Java 21"
mkdir -p "${MAVEN_CACHE_DIR}"
docker run --rm \
--name "${RUN_ID}-java" \
--label "skillhub.test.run=${RUN_ID}" \
--network "${NETWORK}" \
--memory=4g \
--cpus=2 \
--user "$(id -u):$(id -g)" \
-e MAVEN_USER_HOME=/tmp/skillhub-maven-home/.m2 \
-e MAVEN_OPTS="-Xmx2g -XX:MaxMetaspaceSize=512m" \
-e "IDENTITY_BINDING_V2_POSTGRES_URL=jdbc:postgresql://${POSTGRES_CONTAINER}:5432/${POSTGRES_DB}" \
-e "IDENTITY_BINDING_V2_POSTGRES_USERNAME=${POSTGRES_USER}" \
-e "IDENTITY_BINDING_V2_POSTGRES_PASSWORD=${POSTGRES_PASSWORD}" \
-e "IDENTITY_BINDING_V2_FLYWAY_TARGET=${flyway_target}" \
-v "${REPO_ROOT}:/workspace" \
-v "${MAVEN_CACHE_DIR}:/tmp/skillhub-maven-home/.m2" \
-w /workspace/server \
eclipse-temurin:21-jdk-alpine \
./mvnw \
-Dmaven.repo.local=/tmp/skillhub-maven-home/.m2/repository \
-pl skillhub-app \
-am \
"-Dtest=${test_class}" \
-Dsurefire.failIfNoSpecifiedTests=false \
test
}
run_test IdentityBindingV2MigrationPostgresTest
run_test IdentityBindingV2ContractPostgresTest 47
run_test UserProfileFieldSourceMigrationPostgresTest
run_test IdentityBindingV2PostgresIntegrationTest
run_test IdentityProfileProvisioningPostgresIntegrationTest
run_test IdentityLinkMigrationPostgresTest
run_test IdentityLinkMigrationLoginPostgresIntegrationTest
run_test IdentityLinkPostgresIntegrationTest