performMigrationSync waits for the migration to reach completed status
before returning, so statusCounters is populated with success/error
counts by the time the test asserts on it. Flip assertEmpty -> assertNotEmpty.
- Bump utopia-php/migration to add-policies-migration dev branch
- MigrationReport rule for TYPE_POLICIES
- E2E: testAppwriteMigrationPolicies covers int (passwordHistory),
bool (sessionAlert), and bundled MembershipPrivacy (userEmail) so all
three field shapes are exercised end-to-end
- Bump utopia-php/migration to add-services-migration dev branch
- MigrationReport rule for TYPE_SERVICES
- E2E: testAppwriteMigrationServices disables functions + graphql on
source, runs migration, asserts both land disabled on destination
- Bump utopia-php/migration to add-labels-migration dev branch
- MigrationReport rule for TYPE_LABELS
- E2E: testAppwriteMigrationLabels sets unique labels on source via
console patch, runs migration, asserts destination has matching set
- Bump utopia-php/migration to add-protocols-migration dev branch
- MigrationReport rule for TYPE_PROTOCOLS
- E2E: testAppwriteMigrationProtocols flips graphql + websocket on
source, runs migration, asserts both land disabled on destination
- Bump utopia-php/migration to add-auth-methods-migration dev branch
- Add MigrationReport rule for TYPE_AUTH_METHODS
- E2E: testAppwriteMigrationAuthMethods flips email-password + JWT on
source, runs migration, asserts both land as false on destination
- Move GetDefault endpoint to Console module as Get.php
(GET /v1/console/templates/email/:templateId, console.getEmailTemplate)
- Remove from Project module
- Add e2e tests for console.getEmailTemplate and reset=true
- Bump graphql-php to 15.32 in composer.json and update composer.lock
- Extend Storage/Files/Create with mergeUploadMetadata and pass path and
deviceForFiles into the lock callback
- Remove obsolete type hints in Storage/Files/Preview/Get
- Update Storage tests to tolerate S3-backed signatures
Verify scopes match exactly (canonicalizing for order), confirm null
expire round-trips empty, and that destination's secret is freshly
generated rather than copied from the source.