Files
Edu/scripts/test-cdc.ps1
SpecialX 959d58a95d
Some checks failed
CI / quality-ts (push) Failing after 51s
CI / quality-go (push) Failing after 3s
CI / quality-proto (push) Failing after 2s
CI / deploy (push) Has been skipped
docs: add full-stack runbook and one-click scripts
start-all/stop-all/health-check/test-cdc PowerShell scripts.

Compatible with PowerShell 5.1 (ASCII only, no emoji).
2026-07-09 13:47:46 +08:00

168 lines
6.9 KiB
PowerShell

<#
.SYNOPSIS
Edu CDC pipeline end-to-end test script
.DESCRIPTION
Validates the full CDC pipeline: MySQL binlog -> Debezium -> Kafka -> data-ana -> ClickHouse
Steps:
1. Insert test grade into MySQL
2. Wait for Debezium capture + data-ana consume
3. Query ClickHouse to verify data synced
4. Call data-ana API to verify query works
.PARAMETER StudentId
Custom test student_id (default: cdc-test-<timestamp>)
.EXAMPLE
.\scripts\test-cdc.ps1
.\scripts\test-cdc.ps1 -StudentId "my-test-001"
#>
param(
[string]$StudentId = "cdc-test-$(Get-Date -Format 'yyyyMMddHHmmss')"
)
$ErrorActionPreference = "Continue"
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " Edu CDC Pipeline E2E Test" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
$examId = "exam-$StudentId"
$gradeId = "grade-$StudentId"
$testScore = 92.5
$classId = "cls-cdc-test"
Write-Host "Test parameters:" -ForegroundColor Yellow
Write-Host " StudentId: $StudentId"
Write-Host " ExamId: $examId"
Write-Host " GradeId: $gradeId"
Write-Host " Score: $testScore"
Write-Host " ClassId: $classId"
Write-Host ""
# ===== 1. Pre-check =====
Write-Host "[1/5] Pre-check..." -ForegroundColor Yellow
# Check Debezium connector
$connectorStatus = $null
try {
$connectorStatus = Invoke-RestMethod -Uri "http://localhost:8083/connectors/edu-mysql-source/status" -Method Get -TimeoutSec 3 -ErrorAction Stop
} catch {
Write-Host " [FAIL] Debezium Connect not reachable. Start infrastructure first." -ForegroundColor Red
exit 1
}
if ($connectorStatus.connector.state -ne "RUNNING") {
Write-Host " [FAIL] Debezium connector state: $($connectorStatus.connector.state)" -ForegroundColor Red
exit 1
}
Write-Host " [OK] Debezium connector: RUNNING" -ForegroundColor Green
# Check data-ana service
try {
$null = Invoke-RestMethod -Uri "http://localhost:3006/healthz" -Method Get -TimeoutSec 3 -ErrorAction Stop
Write-Host " [OK] data-ana service: running" -ForegroundColor Green
} catch {
Write-Host " [FAIL] data-ana service not reachable. Start application services first." -ForegroundColor Red
exit 1
}
# Check CDC consumer status
try {
$readyz = Invoke-RestMethod -Uri "http://localhost:3006/readyz" -Method Get -TimeoutSec 3 -ErrorAction Stop
$cdcStatus = $readyz.services.cdc_consumer
if ($cdcStatus -ne "running") {
Write-Host " [WARN] CDC consumer status: $cdcStatus (KAFKA_BROKERS may not be set)" -ForegroundColor Yellow
} else {
Write-Host " [OK] CDC consumer: running" -ForegroundColor Green
}
} catch {
Write-Host " [WARN] Cannot get /readyz status" -ForegroundColor Yellow
}
Write-Host ""
# ===== 2. Insert test data into MySQL =====
Write-Host "[2/5] Inserting test data into MySQL..." -ForegroundColor Yellow
$sqlInsert = @"
INSERT INTO core_edu_exams (id, class_id, subject_id, title, exam_date, total_score, created_at, updated_at)
VALUES ('$examId', '$classId', 'sub-math', 'CDC Test Exam', NOW(), 100, NOW(), NOW())
ON DUPLICATE KEY UPDATE updated_at=NOW();
INSERT INTO core_edu_grades (id, exam_id, student_id, score, rank_in_class, created_at, updated_at)
VALUES ('$gradeId', '$examId', '$StudentId', $testScore, 1, NOW(), NOW())
ON DUPLICATE KEY UPDATE score=$testScore, updated_at=NOW();
"@
docker exec edu-mysql mysql -uedu -pchangeme next_edu_cloud -e $sqlInsert 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Host " [OK] Inserted: exam=$examId / grade=$gradeId / student=$StudentId / score=$testScore" -ForegroundColor Green
} else {
Write-Host " [FAIL] MySQL insert failed" -ForegroundColor Red
exit 1
}
Write-Host ""
# ===== 3. Wait for CDC propagation =====
Write-Host "[3/5] Waiting for CDC propagation (5s)..." -ForegroundColor Yellow
Start-Sleep -Seconds 5
Write-Host " [OK] Wait complete" -ForegroundColor Green
Write-Host ""
# ===== 4. Verify ClickHouse data =====
Write-Host "[4/5] Verifying ClickHouse data..." -ForegroundColor Yellow
$chQuery = "SELECT student_id, class_id, exam_id, score, last_updated FROM edu_analytics.student_dashboard_view WHERE student_id = '$StudentId' ORDER BY last_updated DESC LIMIT 5"
$chResult = docker exec edu-clickhouse clickhouse-client --user default --password clickhouse -q $chQuery 2>$null
if ($chResult) {
Write-Host " [OK] ClickHouse returned data:" -ForegroundColor Green
Write-Host " $chResult" -ForegroundColor White
if ($chResult -match $StudentId -and $chResult -match "$testScore") {
Write-Host ""
Write-Host " [OK] Verified: student_id match + score=$testScore match" -ForegroundColor Green
if ($chResult -match $classId) {
Write-Host " [OK] class_id filled via exam cache: $classId" -ForegroundColor Green
} else {
Write-Host " [WARN] class_id not filled (exam cache may have missed, check event order)" -ForegroundColor Yellow
}
} else {
Write-Host " [FAIL] Data mismatch: expected student=$StudentId, score=$testScore" -ForegroundColor Red
}
} else {
Write-Host " [FAIL] ClickHouse has no data for student_id=$StudentId" -ForegroundColor Red
Write-Host " Possible causes:" -ForegroundColor Yellow
Write-Host " 1. Debezium did not capture MySQL change (check connector status)" -ForegroundColor White
Write-Host " 2. data-ana consumer not running (check /readyz cdc_consumer)" -ForegroundColor White
Write-Host " 3. Kafka topic name mismatch (check debezium-register.json)" -ForegroundColor White
exit 1
}
Write-Host ""
# ===== 5. Verify data-ana API =====
Write-Host "[5/5] Verifying data-ana query API..." -ForegroundColor Yellow
$h = @{Authorization="Bearer dev-token"}
try {
$weakness = Invoke-RestMethod -Uri "http://localhost:3006/analytics/student/$StudentId/weakness" -Method Get -Headers $h -TimeoutSec 5 -ErrorAction Stop
Write-Host " [OK] /analytics/student/$StudentId/weakness" -ForegroundColor Green
Write-Host " Response: $($weakness | ConvertTo-Json -Depth 3)" -ForegroundColor Gray
} catch {
Write-Host " [WARN] /analytics/student/$StudentId/weakness failed: $($_.Exception.Message)" -ForegroundColor Yellow
}
try {
$perf = Invoke-RestMethod -Uri "http://localhost:3006/analytics/class/$classId/performance" -Method Get -Headers $h -TimeoutSec 5 -ErrorAction Stop
Write-Host " [OK] /analytics/class/$classId/performance" -ForegroundColor Green
Write-Host " Response: $($perf | ConvertTo-Json -Depth 3)" -ForegroundColor Gray
} catch {
Write-Host " [WARN] /analytics/class/$classId/performance failed: $($_.Exception.Message)" -ForegroundColor Yellow
}
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " CDC Pipeline Test Complete" -ForegroundColor Cyan
Write-Host " MySQL -> Debezium -> Kafka -> data-ana -> ClickHouse [OK]" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Cyan