CloudKit Sync — Manual QA Checklist
Use this for release candidates. Automated tests cover the offline path (enablesCloudKit: false). Live CloudKit requires a signed iCloud account and app entitlements.
Prerequisites
- Two physical devices signed into the same iCloud test account
- App has iCloud + CloudKit capability and a container ID matching
TursoCKSyncConfiguration.containerIdentifier - Build links the packaged
TursoSDK.xcframeworkand opens with CDC enabled -
enablesCloudKit: truein the sample / QA build
Happy path (two devices)
- Install build on Device A and Device B.
- On A, create a note (or row in each synced table).
- Wait ≤ 30 s (or pull-to-sync if exposed).
- Expect: row appears on B with matching fields and PK.
- Edit the same row on B.
- Expect: A receives the update (per conflict policy).
- Delete on A.
- Expect: row disappears on B.
Multi-table
- Insert into two
syncedTableson A. - Expect: both record types appear on B (
table:rowPKrecord names).
Account change
- On A, sign out of iCloud (or switch accounts).
- Expect: app remains usable with local data preserved; sync status may show
accountChangedthen rebootstrap. - Sign back in.
- Expect: local rows re-upload; second device eventually converges.
Zone / network faults
- Disable network mid-sync.
- Expect:
SyncStatus.failedor retry without corruption; no crash. - Re-enable network; drain / auto-sync.
- Expect: pending changes flush; no duplicate primary keys.
Batching (large write)
- Insert ≥ 600 rows locally.
- Expect: outbound send uses batches ≤ 250 records; CDC drain steps of ≤ 500.
- Expect: peer device eventually receives all rows.
Conflict policy spot-checks
Sign-off
See also: Sync benchmarks.

