Switch from checking _APP_REGION !== 'nyc' to checking project ID
to disable execution logging for a specific project.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add utopia-php/span 1.1.* direct dependency, bump utopia-php/dns to 1.6.*
- Create shared app/init/span.php for span storage and pretty exporter setup
- Instrument HTTP request lifecycle with spans (method, path, response code)
- Add database.setup and http.server.start spans
- Replace old Console error logs with Span::error() in general controller
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Set initial schedule to 20s and reschedule to 10s to balance between:
- Not being picked up by scheduler before reschedule (3-4s interval)
- Providing enough margin (6s) after scheduledAt for processing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Document and Row response models were casting $sequence to (int),
which destroyed UUID7 values on MongoDB. On MongoDB, $sequence is the
internal _id field which is a UUID7 string, not an auto-increment integer.
The (int) cast converted UUID7 values like "019c56a9-df6d-73fa-8d48-..."
to 19, making $sequence queries fail validation with 400.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Revert utopia-php/database to 5.1.2 (the Sequence validator fix
incorrectly assumed $sequence is always integer, but on MongoDB
internal collections it uses UUID7)
- Revert Base.php change
- Add detailed error messages to testGetDocumentWithQueries and
testGetRowWithQueries to capture actual $sequence values and API
error responses for debugging
- Keep Messaging scheduledAt fix (30s initial, 15s rescheduled)
- Keep Functions auth retry improvement (10 retries with project refresh)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Update utopia-php/database to fix Sequence validator rejecting integer
$sequence values on MongoDB (VAR_UUID7) adapters
- Fix Base.php Filter constructor passing APP_DATABASE_QUERY_MAX_VALUES
as $idAttributeType instead of the correct Database::VAR_INTEGER
- Fix Messaging testUpdateScheduledAt race condition by increasing
initial scheduledAt from 3s to 30s so scheduler doesn't fire before
the PATCH update processes
- Improve Functions callWithAuthRetry to refresh project credentials
after 4 consecutive 401 failures and increase max retries to 10
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The SELECT query didn't include $sequence, so accessing
$response['body']['$sequence'] returned null. The subsequent
Query::equal('$sequence', [null.'']) produced an empty string
which is invalid for the integer $sequence field, causing 400.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Increase callWithAuthRetry from 5 to 8 retries with capped delay (50s total)
- Increase ProjectCustom retries from 3 to 5 with 1s delays
- Fix swapped assertEquals parameters in FunctionsBase for clearer errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add retry logic with delays for transient 401 auth errors during project
setup in ProjectCustom::getProject() (cherry-pick from feat-db-tests)
- Replace 10-minute activation polling in SitesBase with 30-second auto-activation
wait followed by explicit PATCH /sites/:siteId/deployment fallback to prevent
test suite timeouts when the build worker is slow to auto-activate
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PHPStan 1.8 triggers deprecation warnings on the PHP version shipped
with composer:2.8. Upgrading to 1.12 resolves the compatibility issue.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add COMPOSE_FILE=docker-compose.yml to tests, benchmark, and sdk-preview to prevent loading overrides in CI
- Add target: development to tests/benchmark builds, target: production to pr-scan/nightly builds
- Bump actions/checkout v4→v6, docker/build-push-action v4/v5→v6, actions/upload-artifact v4→v6, actions/github-script v7→v8
- Pin composer images to 2.8 in linter and static-analysis workflows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- setupDeployment's assertEventually callbacks now handle 401 responses
gracefully instead of crashing with "Undefined array key"
- Increase Client curl timeout from 15s to 30s for slow CI runners
(testDeleteScheduledExecution and testGetScreenshotWithPermissions
were hitting the 15s limit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract retry logic into a reusable callWithAuthRetry helper with
exponential backoff (5 retries, 2/4/6/8s delays). Apply to both
setupFunction and setupDeployment.
Previous fix only retried setupFunction, but 401 can hit any API call.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 15 FunctionsCustomServerTest failures originate from setupFunction()
getting a transient 401 when the API key lookup fails under CI load.
Retry up to 3 times with a 2s delay on 401 responses.
Remove the per-method #[Retry] on testScopes since the root fix is now
in setupFunction.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MongoDB CI builds take longer to process the deployment queue, causing
testSiteDomainReclaiming to timeout at 400s. Increase to 600s.
testScopes has an intermittent 401 auth failure - add #[Retry(count: 3)]
for resilience.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Increase activation timeout in SitesBase setupDeployment from 200s to 400s
- Add assertEventually for deploymentId check in testCreateDeployment to handle
the race condition where build worker sets deployment status to 'ready' before
setting site.deploymentId
- Increase build ready timeouts from 50s to 300s in testCreateDeployment
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The default for _APP_DB_ADAPTER was changed from 'mariadb' to 'mongodb' in
registers.php. Services without this env var default to the MongoDB adapter,
causing MariaDB/PostgreSQL function executions to get stuck in 'waiting'
status because the worker-executions service cannot connect to the database.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add profiles to database services (mariadb, mongodb, postgresql) so only
the needed database starts per CI job, freeing resources for the executor
- Increase Sites deployment activation timeouts from 50-100s to 200s for
MongoDB compatibility
- Increase SSR logs polling timeout from 30s to 120s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add polling for SSR execution logs instead of immediate access
- Change testListSites framework from 'other' to 'analog' because
PostgreSQL treats 'other' as a fulltext stop word
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostgreSQL supports spatial indexes on nullable columns and required
spatial attributes on existing data, unlike MariaDB. Expose
supportForSpatialIndexNull console variable and condition test
assertions accordingly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The SQL adapter's createDocuments() unconditionally casts boolean values to
integers (line 2518 in SQL.php), but PostgreSQL rejects int values for native
BOOLEAN columns. The single-document path already has an instanceof check to
preserve booleans for Postgres, but createDocuments() was missed.
This patch applies the same fix via a PHP script run during Docker build.
Fixes 26 test failures across PostgreSQL Legacy, TablesDB, and GraphQL suites.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Change spatial test gates from getSupportForRelationships() to
getSupportForSpatials() in both Legacy and TablesDB DatabasesBase
- Add both relationship AND spatial gates for spatial relationship tests
- Add missing @depends for float, email, and datetime attributes/columns
in GraphQL Server tests to ensure schema is complete before document/row
creation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MongoDB doesn't support relationships, so testInvalidRelationshipDocumentId
returns 400 instead of 202. Skip the test when the adapter lacks support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostgreSQL's ts_vector/ts_query doesn't support partial word matching
(searching "man" won't find "manchester"), unlike MariaDB's LIKE-based
search. The test used getSupportForRelationships() as a proxy for this
capability, which was wrong for PostgreSQL (supports relationships but
not partial fulltext search).
Add supportForFulltextWildcard to console variables endpoint and use
it in the Users test instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Postgres adapter in utopia-php/database requires PostGIS, pgvector,
and pg_trgm extensions. The plain postgres:18 image lacked these, causing
"collation utf8_ci_ai does not exist" errors (CREATE EXTENSION failed
before the collation could be created).
Switch to postgres:17 with a custom Dockerfile that installs the required
extensions, matching the approach used by utopia-php/database's own tests.
Also reverts the volume mount to /var/lib/postgresql/data (correct for v17).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostgreSQL 18+ stores data in major-version-specific subdirectories under
/var/lib/postgresql instead of directly in /var/lib/postgresql/data. The
old mount path caused the container to crash immediately on startup with
a migration error, which was the actual root cause of all PostgreSQL CI
failures (the container was dead so Docker DNS couldn't resolve its name).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The appwrite container's `dns: 172.16.238.100` (CoreDNS) bypassed Docker's
embedded DNS, preventing resolution of service names like `postgresql`.
CoreDNS only handles custom test domains and forwards unknown queries to
Cloudflare, which can't resolve Docker service names.
Fix: Add 127.0.0.11 (Docker embedded DNS) as primary resolver and configure
CoreDNS to forward unknown queries to Docker DNS with Cloudflare as fallback.
Bind CoreDNS to its static IP to avoid port conflict with Docker's DNS proxy.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>