From a0521d1fdfce8f9779dd2c8a30f9f4d289377f3d Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Thu, 6 Aug 2026 11:31:35 +0200 Subject: [PATCH] improve the contribution docs with preview tests setup --- CONTRIBUTING.md | 10 ++++++---- docs/PreviewTestsRegion.png | Bin 15478 -> 0 bytes 2 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 docs/PreviewTestsRegion.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc4c981b6..b5f80ee56 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -91,15 +91,17 @@ Git LFS is used to store UI and Preview test snapshots. `swift run tools setup-p git lfs install ``` -### Snapshot (Preview) Tests +### Snapshot Tests If you make changes to the UI you may cause existing UI and Preview test snapshots to fail. The UITests run user flows and record snapshots while doing so using the settings defined under [checkEnvironments](https://github.com/element-hq/element-x-ios/blob/c29175d1f924e58b9646a200dbab0301fce3c258/UITests/Sources/Application.swift#L35-L37) while the PreviewTests use the settings defined in [PreviewTests.swift](https://github.com/element-hq/element-x-ios/blob/c29175d1f924e58b9646a200dbab0301fce3c258/PreviewTests/Sources/PreviewTests.swift#L18-L20). The snapshots are stored under `Sources/__Snapshots__` in their respective target's folder. -To run preview tests, select the `PreviewTests` scheme with an iPhone SE running iOS 26.5 in Xcode and run tests (` - U`). Language and region must be set to `en-US`. Newly created screens will automatically have their screenshots added based off their `TestablePreview` Swift previews. If you are modifying an existing screen, you will first need to delete the old snapshots for that screen before running the tests. Alternatively, if you enable `RECORD_FAILURES` in the preview test plans's environment variables (`PreviewTests/SupportingFiles/Previewtests.xctestplan`), it will overwrite snapshot failures with the updated screenshot. +To run the preview tests: -Language and region settings screenshot: +1. Use an iPhone SE (3rd generation) simulator running iOS 26.5. +2. On that simulator, go to Settings -> General -> Language & Region and select United States as the region, with English (US) as the only preferred language. This is a one time setup, as long as you keep using the same simulator. +3. Select the `PreviewTests` scheme and run the tests. -![Language and region screenshot](docs/PreviewTestsRegion.png) +Newly created screens will automatically have their screenshots added based off their `TestablePreview` Swift previews. If you are modifying an existing screen, you will first need to delete the old snapshots for that screen before running the tests. Alternatively, if you enable `RECORD_FAILURES` in the preview test plans's environment variables (`PreviewTests/SupportingFiles/Previewtests.xctestplan`), it will overwrite snapshot failures with the updated screenshot. ### Githooks diff --git a/docs/PreviewTestsRegion.png b/docs/PreviewTestsRegion.png deleted file mode 100644 index 9ff17d22a635e3c40c7014cd29a675f81bb5a074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15478 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

uo}W6hcn=b9hul_j_RJ$(<_^T)*AKj3y+& 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