Files
chore/backend/scripts/run_integration_tests.ps1
ryan da7ed41938 feat: migrate backend persistence from TinyDB to MongoDB Atlas
- Implement lazy MongoDB client initialization in backend/db/mongo_client.py.
- Create Gunicorn configuration to ensure MongoDB client is initialized per worker.
- Refactor database access layer to support MongoDB with a new MongoLockedTable adapter.
- Add migration script to transfer existing TinyDB data to MongoDB, preserving idempotency.
- Update tracking event handling to ensure deterministic ordering with a monotonic sequence.
- Modify tests to use mongomock for MongoDB integration and ensure existing tests pass.
- Add integration test script to run tests against a local MongoDB Docker container.
- Document environment variables and migration process in specs/feat-database-migration.md.
2026-07-28 01:10:52 -04:00

80 lines
2.2 KiB
PowerShell

<#
.SYNOPSIS
Run the MongoDB adapter integration tests against a local Docker MongoDB container.
.DESCRIPTION
Starts a temporary MongoDB container, runs a targeted pytest suite with
USE_MONGODB=true, then stops and removes the container.
.EXAMPLE
cd backend
.\scripts\run_integration_tests.ps1
#>
[CmdletBinding()]
param(
[string]$ContainerName = 'chore-db-integration-test',
[int]$HostPort = 27017,
[string]$Image = 'mongo:8',
[string]$DbName = 'chore_db_test',
[string]$TestPath = 'tests/test_mongo_adapter.py'
)
$ErrorActionPreference = 'Stop'
$mongoUri = "mongodb://localhost:${HostPort}/${DbName}"
function Test-ContainerRunning {
$containers = docker ps --filter "name=$ContainerName" --format '{{.Names}}' 2>$null
return $containers -contains $ContainerName
}
function Wait-MongoReady {
param([int]$TimeoutSeconds = 30)
$start = Get-Date
while (((Get-Date) - $start).TotalSeconds -lt $TimeoutSeconds) {
try {
$null = docker exec $ContainerName mongosh --eval 'db.adminCommand({ ping: 1 })' --quiet 2>$null
if ($LASTEXITCODE -eq 0) {
return
}
} catch {
# Container or mongosh may not be ready yet.
}
Start-Sleep -Seconds 1
}
throw "MongoDB container did not become ready within ${TimeoutSeconds} seconds."
}
# Clean up any leftover container from a previous aborted run.
if (Test-ContainerRunning) {
Write-Host "Removing existing container '$ContainerName'..."
docker rm -f $ContainerName | Out-Null
}
Write-Host "Starting MongoDB container '$ContainerName' on port $HostPort..."
docker run -d `
--name $ContainerName `
-p "${HostPort}:27017" `
$Image | Out-Null
try {
Wait-MongoReady
Write-Host "MongoDB is ready. Running integration tests..."
$env:USE_MONGODB = 'true'
$env:MONGO_URI = $mongoUri
$env:MONGO_DB_NAME = $DbName
$env:DB_ENV = 'test'
$env:DATA_ENV = 'test'
pytest $TestPath
if ($LASTEXITCODE -ne 0) {
throw "Integration tests failed with exit code $LASTEXITCODE."
}
} finally {
Write-Host "Stopping and removing container '$ContainerName'..."
docker rm -f $ContainerName | Out-Null
}
Write-Host "Integration tests complete."