[CmdletBinding()] param( [switch]$DryRun, [string]$MavenCommand = "mvn" ) $ErrorActionPreference = "Stop" $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path $pom = Join-Path $repoRoot "pom.xml" $mapperScanContract = Join-Path $repoRoot "scripts/mapper-scan-contract.mjs" $requiredTests = @( "scripts/gateway-route-contract.test.mjs", "scripts/mapper-scan-contract.test.mjs", "firstleg/src/test/java/com/baiyue/firstleg/oceanbooking/controller/PlatformOceanBookingControllerContractTest.java", "firstleg/src/test/java/com/baiyue/firstleg/oceanbooking/service/OceanBookingServiceTest.java", "firstleg/src/test/java/com/baiyue/firstleg/repository/TruckAppointmentMapperContractTest.java", "firstleg/src/test/java/com/baiyue/firstleg/service/TruckAppointmentServiceTest.java", "firstleg/src/test/java/com/baiyue/firstleg/controller/TruckAppointmentControllerContractTest.java", "firstleg/src/test/java/com/baiyue/firstleg/service/UnifiedInboundQueryServiceTest.java", "order/src/test/java/com/baiyue/order/service/UnifiedOrderQueryServiceTest.java", "iam/src/test/java/com/baiyue/iam/BaiyueIamApplicationContractTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationOpenApiContractTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationServiceTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationTemplateRendererTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationSqlContractTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationBusinessEventConsumerTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationSchedulerRecoveryTest.java", "iam/src/test/java/com/baiyue/iam/notification/NotificationConfigurationContractTest.java", "gateway/src/test/java/com/baiyue/gateway/config/GatewayFileRouteConfigurationTest.java", "file/src/test/java/com/baiyue/file/controller/QualificationFileContractTest.java", "file/src/test/java/com/baiyue/file/controller/InternalBusinessFileControllerTest.java", "file/src/test/java/com/baiyue/file/service/InternalBusinessFileServiceTest.java", "firstleg/src/test/java/com/baiyue/firstleg/controller/ContainerControllerContractTest.java", "firstleg/src/test/java/com/baiyue/firstleg/controller/LoadingListControllerContractTest.java", "firstleg/src/test/java/com/baiyue/firstleg/repository/ContainerOverviewSqlContractTest.java", "firstleg/src/test/java/com/baiyue/firstleg/service/ContainerOverviewServiceTest.java", "firstleg/src/test/java/com/baiyue/firstleg/service/LoadingListServiceTest.java", "warehouse/src/test/java/com/baiyue/warehouse/repository/OverseasStorageFeeSqlContractTest.java", "warehouse/src/test/java/com/baiyue/warehouse/controller/PlatformOverseasStorageFeeControllerContractTest.java" ) $mavenArgs = @("-f", $pom, "test") Write-Host "Backend regression root: $repoRoot" Write-Host "Scope: complete root POM reactor (all active modules and their tests)" Write-Host "Database/API access: none" if (-not (Test-Path -LiteralPath $pom)) { Write-Error "Missing Maven pom: $pom" exit 2 } if (-not (Test-Path -LiteralPath $mapperScanContract)) { Write-Error "Missing Mapper scan contract: $mapperScanContract" exit 2 } $missing = @($requiredTests | Where-Object { -not (Test-Path -LiteralPath (Join-Path $repoRoot $_)) }) if ($missing.Count -gt 0) { Write-Error ("Missing required regression coverage:`n" + ($missing -join "`n")) exit 2 } Write-Host ("Command: {0} {1}" -f $MavenCommand, ($mavenArgs -join " ")) if ($DryRun) { Write-Host "DRY-RUN PASS: prerequisites and coverage files are present; Maven was not started." exit 0 } Push-Location $repoRoot try { & node --test (Join-Path $repoRoot "scripts/gateway-route-contract.test.mjs") if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } & node $mapperScanContract if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } & $MavenCommand @mavenArgs $code = $LASTEXITCODE } finally { Pop-Location } if ($code -ne 0) { Write-Error "Maven regression failed with exit code $code" exit $code } Write-Host "Backend regression PASS" exit 0