* MM-68219 - Add redacted files placeholder and related functionality * add feature flag control and e2e tests * adjust placeholder design, polish code, fix permalink preview issue * polish code and add missing test * use import path with right path * gate post refetch behind the feature flag, refetch the open thread and avoid observeCount * restore filesInfo for the permalink files prop added upstream * fix stale redaction on background servers, consume the flag on every fetch path and share the viewport emitter * replace the in-memory redaction flag with a persisted per-post epoch so ABAC file decisions survive restarts and stale posts stay hidden * raise the redaction epoch on every resync, capture the epoch counter, only invalidate channels on role changes, and store the newer epoch when a re-verified post is otherwise unchanged * store superseded responses unverified instead of dropping them, keep the since-fetch when re-verifying, verify permalink embeds against the linked channel, and capture the websocket epoch on arrival * nvalidate file decisions when a user attribute field changes or all its values are cleared * batch channel invalidations, close file viewers only when affected, reset the epoch on unstamped redaction changes, and only re-verify the newest page's attachment posts * re-check older channel posts a page at a time instead of one request per post * skip the unstamped epoch lookup for posts with no files, redacted count or permalink * keep the attribute-view retry after later invalidations, retry linked posts unless refused for the current epoch, and stop older payloads from rolling back edits via the redaction check * MM-70905 - disable and grey out the attachment button when an ABAC pe… (#10195) * MM-70905 - disable and grey out the attachment button when an ABAC permission policy denies uploads in the channel * only back off render permission fetches when the server request fails, and log other errors without retrying * remove the disableServer helper and have removeServer do both steps * split defaultAllowed into allowWhenUnenforced and allowWhenNotEvaluated, and treat render permissions as unenforced on servers without the decisions API * MM-69627: Add playbook task requirements support on mobile (#10035) * MM-69627: Add playbook task requirements support on mobile Allow filling required task fields when checking off checklist items during a run, gated by the same Playbooks beta setting used on web. Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69627: Address PR review feedback for task requirements Propagate settings write failures, harden fill-requirements save/title handling, and add missing unit coverage. Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69627: Fix TypeScript errors in new unit tests Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69627: Use defineMessages for fill requirements titles Keep i18n extraction able to find the header titles after moving them to the route. Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69627: Address review feedback for task requirements Update checklist items locally when saving requirement values instead of refetching the run, add missing query/navigation tests, and apply small callback/reduce cleanups from review. Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69627: Fix task requirements review follow-ups Propagate local checklist write failures, clear a stale task-requirements flag when playbooks is unsupported, and cap fill values at the desktop/ server max length. Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69627: Move requirement field into its own component Keep one component per file on the fill-requirements screen. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> * MM-69122: Add file element support to interactive dialogs (#9898) * Implement Interactive Dialog - file upload * update demo plugin version for e2etests * fix and add e2etests * review fixes * Fix version bump checkout when a tag shares the branch name (#10229) * Fix Android crashes caused by animated custom emoji (#10030) * Route GIF decoding through Glide - Keep APNG4Android for APNG, animated WebP, and animated AVIF support. - Prepend Glide's GIF decoders to avoid APNG4Android's native GIF overflow. * Clear Expo image resources with Glide targets - Detach drawables when Glide clears their custom target. - Prevent recycled GIF frame resources from remaining attached to Expo image views. * Preserve foreground image during GIF target recycling --------- Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Scott Bishel <scott.bishel@mattermost.com> Co-authored-by: Nuno Simões <nuno.simoes@mattermost.com> Co-authored-by: MangelSpec <74370284+MangelSpec@users.noreply.github.com> * detox - fix clobbering of feature flags that cause failures in other suites. Also small fix of a incorrectly set test-id --------- Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Scott Bishel <scott.bishel@mattermost.com> Co-authored-by: Nuno Simões <nuno.simoes@mattermost.com> Co-authored-by: MangelSpec <74370284+MangelSpec@users.noreply.github.com> Co-authored-by: Nate Schlossberg <nate.schlossberg@mattermost.com> |
||
|---|---|---|
| .. | ||
| android_emulator | ||
| e2e | ||
| maestro | ||
| provision | ||
| scripts | ||
| shared | ||
| utils | ||
| .babelrc | ||
| .detoxrc.json | ||
| CLAUDE.md | ||
| create_android_emulator.sh | ||
| generate_unified_report.js | ||
| inject-detox-settings.js | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| save_maestro_zephyr.js | ||
| save_report.js | ||
| tsconfig.json | ||
| webhook_server.js | ||
How to Run Detox Tests
This guide will help you set up and run Detox tests for your project.
Install Dependencies
First, navigate to the root directory of your project and install the necessary dependencies by running:
npm install
navigate to the detox folder and run npm install
Configure your server details
detox/e2e/support/test_config.ts defaults to one local server on port 8065.
For iOS, both the test runner and simulator use http://localhost:8065. For
Android, the test runner uses http://localhost:8065 while the emulator uses
http://10.0.2.2:8065.
If you use a remote server, set the logical site variable to a URL reachable from both the host test runner and the device:
export SITE_1_URL="https://your-server.example.com"
export ADMIN_USERNAME="your-username"
export ADMIN_PASSWORD="your-password"
export ADMIN_EMAIL="your-email"
You can instead create a detox/.env file:
# detox/.env
SITE_1_URL=https://your-server.example.com
ADMIN_USERNAME=your-username
ADMIN_PASSWORD=your-password
ADMIN_EMAIL=your-email@example.com
Note: no need to provide all variables, only the ones that differ.
SITE_2_URL and SITE_3_URL are only needed for tests that add distinct
Mattermost servers, such as server_login/server_list.e2e.ts. If they are
unset, their URL helpers alias site 1 and tests that require distinct servers
are skipped. The five-server ANDROID_SITE_* and IOS_SITE_* topology is
assigned by CI and is not required for ordinary local runs.
Android
Build Detox Android App
To build the Detox Android app, navigate to the detox folder and run:
npm run e2e:android-build
The debug apk will be built and available at android/app/build/outputs/apk/debug/app-debug.apk
Run Detox Android Tests
Create emulator
./create_android_emulator.sh SDK_VERSION AVD_NAME
# example ./create_android_emulator.sh 34 pixel_5a_avd
# example ./create_android_emulator.sh 34 pixel_5a_avd --headless
# If we want to see the emulator logs. Run it in debug mode example ./create_android_emulator.sh 34 pixel_5a_avd --debug
To execute the Detox tests on Android, navigate to the detox folder and run:
npm run e2e:android-test
# To run a particular tests
npm run e2e:android-test <path to test file>
Local runs now default to a lower-memory setup so they coexist better with other tools:
- Detox uses
1worker unless you setDETOX_MAX_WORKERS. - Detox caps Node heap at
4096MBunless you already setNODE_OPTIONS. - Android Detox builds cap Gradle heap at
3072MBand use at most2Gradle workers unless you overrideMM_GRADLE_XMX_MBorMM_GRADLE_WORKERS_MAX. - Android emulator RAM defaults to
3072MBwhen created or refreshed; override withMM_ANDROID_EMULATOR_RAM_MB.
iOS
Build iOS Simulator
To build the iOS simulator for Detox, from the project folder run:
npm run e2e:ios-build
This will build the Simulator .zip file at the root folder.
Create a folder named mobile-artifacts at the project root. Move the zip file under mobile-artifacts and unzip it there.
# From project root
mkdir mobile-artifacts
Configure your local
Update detox/.detoxrc.json to specify which device you want to run it. Change:
"device": {
"type": "__DEVICE_NAME__",
"os": "__DEVICE_OS_VERSION__"
},
to something like:
"device": {
"type": "iPhone 17 Pro",
"os": "iOS 26.4"
},
To get your values run xcrun simctl list devices to find both the device and iOS version.
Run iOS Tests
To execute the Detox tests on iOS, navigate to the detox folder and run:
npm run e2e:ios-test
# To run a particular tests
npm run e2e:android-test path to test file.
Disabling Password Autofill
from iOS v26 password autofill can interfere with login tests by automatically filling credentials. To disable this feature on your simulator:
# Interactive mode - select simulator from list
npm run e2e:ios-disable-autofill
# Or specify simulator ID directly
npm run e2e:ios-disable-autofill -- --simulator-id SIMULATOR_UDID
When to use this:
- if using iOS 26 or later
- Before running iOS E2E tests if you notice password fields being auto-filled
- When login tests fail unexpectedly due to autofill interference
- After creating a new iOS simulator for testing
Note: CI environments automatically disable this setting, so this is only needed for local development.
Finding your simulator ID:
xcrun simctl list devices | grep Booted
TIP : For iOS, you can download the simulator from ~Mobile: Test build or ~Release: Mobile Apps channel in the community.
Results
The Local Runs generate artifacts under detox/artifacts/ios-debug-** or detox/artifacts/android-debug-**.
You can see the html report, failure screenshot under that folder.
Webhook sidecar (mm_blocks / interactive dialog specs)
The mm_blocks_* and interactive-dialog specs register integrations that the
Mattermost server calls back into. detox/webhook_server.js serves those
callbacks on :3000, and the server must be able to reach it:
-
Local server (
SITE_1_URL=http://localhost:8065): no tunnel needed, the server reaches127.0.0.1:3000directly.cd detox && npm run start:webhook -
Remote/cloud test server: the server cannot reach your machine, so the sidecar needs a public HTTPS origin.
detox/scripts/start_webhook_sidecar.shstartswebhook_server.jsand resolves that origin, in priority order:Env Behaviour WEBHOOK_PUBLIC_BASE_URLUse an already-routable HTTPS origin as-is (named tunnel, ngrok, reverse proxy). Preferred. WEBHOOK_PUBLIC_BASE_URL+CLOUDFLARED_TUNNEL_TOKENRun a named Cloudflare tunnel for that hostname. The token is passed via TUNNEL_TOKENbecause argv is world-readable.neither Fall back to a trycloudflare.comquick tunnel. Time-boxed and DNS-flaky, so treat it as a last resort.cd detox SITE_1_URL="https://your-test-server" \ WEBHOOK_PUBLIC_BASE_URL="https://your-tunnel-hostname" \ bash scripts/start_webhook_sidecar.shPin a different
cloudflaredwithCLOUDFLARED_VERSION; the script defaults to a known-good release rather thanlatest.
The script always exits 0 — it exports WEBHOOK_SIDECAR_READY and
WEBHOOK_CALLBACKS_REACHABLE instead of failing, and specs that need a webhook
fail fast on their own health check. A quick tunnel passes outbound health checks
but does not reliably deliver server-to-sidecar callbacks, so it reports
WEBHOOK_CALLBACKS_REACHABLE=false.