nexo/apps/flutter-test/README.md
toki 908a4ecc18 feat: iOS notification preflight task and test documentation
- Add iOS notification preflight plan and code review (PLAN/CODE_REVIEW-cloud-G07)
- Add iOS notification smoke evidence template
- Update iOS notification test guide with preflight steps
- Add Flutter test app iOS fixtures (APNS payloads, GoogleService config, entitlements)
- Update README files for flutter-test, messaging_flutter, and docs
2026-06-01 13:29:02 +09:00

131 lines
5.2 KiB
Markdown

# flutter-test
Test-only Flutter app for the Nexo messaging package.
## Purpose
This app is the workspace test harness for `packages/messaging_flutter`. Keep it
small and focused on proving the messaging/notification package contract:
- plugin registration in a real Flutter application
- method-channel calls from Dart to the native plugin
- event-channel delivery from native code to Dart
- notification-open routing callbacks
- Android manifest merge behavior
- manual Firebase FCM and nexo server ACK smoke testing
This app is not a nexo product app and is not the original Mattermost app. The
original Mattermost app belongs under `apps/mattermost/`; app-specific product
UI and business logic belong in consuming apps outside this repository.
The app is a plugin API consumer and verification host. Native push handling,
ACK delivery, token/key storage, notification rendering, inline reply, and
dismiss handling remain owned by `packages/messaging_flutter`.
## Thin Host Contract
The host UI should expose only the plugin integration state needed by tests:
device token, raw notification event, opened notification event, and routing
callback state. `test/widget_test.dart` protects this contract by asserting the
four status lines remain present and product-style controls are not added.
The host app also proves the required SDK integration hooks stay wired without
becoming product logic:
- startup calls `NexoMessagingPlugin.instance.initialize()` when the harness is
not in test-only mode
- smoke login values can be bridged to `setAuthToken`
- device token state is received from `onDeviceTokenReady`
- notification opens update `onNotificationOpened`, `onNavigateToChannel`, and
`onNavigateToThread` output
Logout/session cleanup remains a consuming-app responsibility; this harness only
keeps the callback and token handoff surface visible for tests.
## Structure
```text
apps/flutter-test/
lib/ # Small test harness UI
test/ # Widget tests for the harness
integration_test/ # Device/emulator plugin integration tests
android/ # Android test host used to load the plugin
ios/ # iOS host scaffold
macos/ # macOS host scaffold
```
## Running The App
Install dependencies:
```sh
flutter pub get
```
Run on a connected device or emulator:
```sh
flutter run
```
For Android FCM smoke testing, make sure the Android app has the required
Firebase configuration, including `android/app/google-services.json`.
Use the plugin-owned
[`Manual Smoke Checklist`](../../packages/messaging_flutter/README.md#manual-smoke-checklist)
for FCM delivery, ACK, inline reply, dismiss, and routing evidence.
For iOS preflight and smoke preparation, keep real Firebase and Apple files out
of git. Copy `ios/Runner/GoogleService-Info.example.plist` to
`ios/Runner/GoogleService-Info.plist` locally, replace placeholder values, and
make sure the real plist is added to the Runner target resources in Xcode.
Use `ios/Runner/Runner.example.entitlements` as the minimal Push Notifications
entitlement reference, then configure the real Runner target through Xcode.
Local routing fixtures live under `ios/Fixtures/*.apns`; replace
`REPLACE_WITH_IOS_BUNDLE_ID` before simulator injection.
See [`../../docs/ios-notification-test-guide.md`](../../docs/ios-notification-test-guide.md)
and [`../../docs/ios-notification-smoke-evidence-template.md`](../../docs/ios-notification-smoke-evidence-template.md).
## Verification
The integration test uses the plugin's test/debug event injection path for
method-channel, event-channel, and opened-routing checks, including channel and
CRT thread routing. Real FCM delivery, ACK, inline reply, and dismiss behavior
remain manual smoke checks.
Run checks from this directory:
```sh
flutter analyze
flutter test
flutter test integration_test
```
Use `flutter test` for the thin-host contract and `flutter test
integration_test` for real Flutter host registration, method-channel,
event-channel, and opened-routing coverage.
Run Android native unit tests from `apps/flutter-test/android`:
```sh
./gradlew testDebugUnitTest
```
Android Gradle tests require a configured Android SDK through `ANDROID_HOME`,
`ANDROID_SDK_ROOT`, or `apps/flutter-test/android/local.properties`.
When the local machine does not have a usable Android SDK, device, or emulator,
the expected local result is an environment failure rather than a product
failure. Use the repository-level remote environment guide for Android
integration and native unit verification:
[`../../packages/messaging_flutter/docs/android-test-environment.md`](../../packages/messaging_flutter/docs/android-test-environment.md).
## Maintenance Rules
- Keep the app thin.
- Prefer deterministic test controls over product-like UI.
- Do not add consuming-app business logic here.
- Do not grow this host into a nexo product app.
- Do not use this path for the original Mattermost app; that belongs under `apps/mattermost/`.
- Add integration tests here when a plugin behavior needs a real Flutter host.
- Keep manual FCM and server checks documented with the owning module:
[`Manual Smoke Checklist`](../../packages/messaging_flutter/README.md#manual-smoke-checklist).