From ba5e029c742529adc9a7049476af0b6976f580a2 Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Mon, 3 Aug 2026 22:54:21 +0200 Subject: [PATCH 1/4] c23c74f4 - Gate Pay and Send behind a hidden insider unlock (#885) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Soft launch for the two new phase-2 features: the **Pay** (OpenCryptoPay, #674) and **Send** (W2W transfer, #687) dashboard actions are hidden behind an invisible wall so only insiders can reach them. - The two dashboard buttons render only when a persisted `insiderFeaturesUnlocked` flag is set; Buy and Sell stay visible unconditionally. - Unlock: tap the version number in Settings **seven times** (developer-options pattern). A snackbar confirms the unlock; the flag persists across restarts (SharedPreferences, seeded into `SettingsBloc`). - The OpenCryptoPay payment deeplink intentionally keeps working regardless of the unlock state, so payment links handed to insiders resolve as before. ## Deliberate deviation from the API-authority rule (reviewed, intentional) CONTRIBUTING lists "feature visibility based on local state" as not OK and prefers an API capability flag. This gate deviates from that on purpose, as a product decision made with the API-capability alternative on the table: - The point of the soft launch is that outsiders must not even *see* the features, and the unlock must work offline/instantly for anyone told the gesture — an account-bound API capability would change the product (server-side insider bookkeeping, no gesture unlock). - No API truth is duplicated or contradicted: there is no server-side notion of this soft launch, and the API remains the sole decision authority for every actual transfer/payment the flows perform. The unlocked app renders exactly what the API-authorized app rendered before this PR; the locked app renders a subset. - Being a public repo, the mechanism is readable in source — the wall is a discoverability hurdle, not a security boundary. ## Implementation notes - The Settings version row keeps its exact visuals; it moves into a new `SettingsVersionUnlock` widget that follows the page-local `getIt` bloc-access pattern (its test harness deliberately mirrors the settings golden harness structure). - `DashboardActions` gates Pay/Send with collection-`if`s on `context.watch()`. - `ActionButton` now scales its icon/label column down (`FittedBox`) instead of overflowing its fixed 110x50 box — the new actions matrix exposed real overflows under Expanded width squeeze (German labels, 2px at 1.0x on narrow devices) and at large text scales (up to 258px at 3.0x). The tap area stays the full box (the `InkWell` wraps it, not the scaled content). Layouts that fit are visually unchanged; the four positive-balance dashboard goldens picked up sub-pixel antialiasing deltas (77-107 bytes each) from the new render path and were regenerated by the runner. - `expectFullyTappable` maps both rect corners through the render transform, so scaled targets measure their visual rect (transform-neutral for every existing call site). - The repository setter follows the established fire-and-forget persistence idiom; the repo-wide hardening idea is tracked in #886. Pre-existing positive-balance dashboard overflows (CashHoldingBox and siblings) are tracked in #887 and deliberately not part of this PR. ## Handbook Section 79 of the handbook (/de/#insider-unlock) explains the unlock step by step in German with three screenshots (settings version row, dashboard before, dashboard after) so the link can be shared directly with the people who should know. The new dashboard_insider_unlocked golden is mapped as handbook screenshot slot 269; the three updated dashboard baselines were already mapped and refresh automatically on the next handbook deploy. ## Tests - New widget tests for the 7-tap unlock (6 taps inert, 7th dispatches exactly one event + snackbar, 9 rapid taps still dispatch exactly once, taps ignored once unlocked, version text still rendered) - `DashboardActions` locked/unlocked cases incl. the existing navigation assertions, plus a locked→unlocked transition test that pins the `context.watch` rebuild behaviour - New golden case `dashboard_insider_unlocked` (renders the same four-button dashboard the pre-PR baseline showed); existing dashboard goldens change to the 2-button locked default - New responsive-matrix group renders `DashboardActions` standalone (insider unlocked, all four buttons) across the full device/text-scale grid with overflow + tappability gates — scoped to the actions row this PR owns; the zero-balance page matrix is unchanged - Repository getter/setter covered against a real SharedPreferences backend (100% lines floor on `lib/packages/*`) - Full suite on the verification host: 4755 tests green, analyzer clean --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .github/workflows/handbook-build-check.yaml | 10 +- Dockerfile.handbook | 2 +- assets/languages/strings_de.arb | 3 +- assets/languages/strings_en.arb | 3 +- docs/handbook/README.md | 2 +- docs/handbook/de/index.html | 107 ++++++++++ docs/screens.md | 4 +- .../repository/settings_repository.dart | 5 + .../widgets/sections/dashboard_actions.dart | 43 ++-- lib/screens/settings/bloc/settings_bloc.dart | 11 + lib/screens/settings/bloc/settings_event.dart | 4 + lib/screens/settings/bloc/settings_state.dart | 4 + lib/screens/settings/settings_page.dart | 12 +- .../widgets/settings_version_unlock.dart | 54 +++++ lib/widgets/action_button.dart | 37 ++-- scripts/assemble-handbook-screenshots.sh | 3 +- .../dashboard/dashboard_golden_test.dart | 19 ++ .../macos/dashboard_hidden_amounts.png | Bin 54576 -> 52117 bytes .../macos/dashboard_insider_unlocked.png | Bin 0 -> 28803 bytes .../macos/dashboard_recent_transactions.png | Bin 58654 -> 56080 bytes .../goldens/macos/dashboard_with_balance.png | Bin 28703 -> 26081 bytes .../settings_currencies_golden_test.dart | 1 + .../settings_languages_golden_test.dart | 1 + test/helper/layout_assertions.dart | 14 +- .../repository/settings_repository_test.dart | 26 +++ .../dashboard_responsive_matrix_test.dart | 133 +++++++++++- .../sections/dashboard_actions_test.dart | 190 ++++++++++++------ test/screens/settings/settings_bloc_test.dart | 13 ++ .../screens/settings/settings_event_test.dart | 15 ++ .../widgets/settings_version_unlock_test.dart | 115 +++++++++++ .../settings_currencies_page_test.dart | 1 + .../settings_languages_page_test.dart | 1 + 32 files changed, 712 insertions(+), 121 deletions(-) create mode 100644 lib/screens/settings/widgets/settings_version_unlock.dart create mode 100644 test/goldens/screens/dashboard/goldens/macos/dashboard_insider_unlocked.png create mode 100644 test/screens/settings/widgets/settings_version_unlock_test.dart diff --git a/.github/workflows/handbook-build-check.yaml b/.github/workflows/handbook-build-check.yaml index 8cf961580..415cdd579 100644 --- a/.github/workflows/handbook-build-check.yaml +++ b/.github/workflows/handbook-build-check.yaml @@ -68,8 +68,8 @@ jobs: set -euo pipefail bash scripts/assemble-handbook-screenshots.sh /tmp/handbook-shots count=$(ls -1 /tmp/handbook-shots/*.png | wc -l | tr -d ' ') - if [ "$count" != "278" ]; then - echo "expected 278 screenshots, got $count" >&2 + if [ "$count" != "279" ]; then + echo "expected 279 screenshots, got $count" >&2 exit 1 fi @@ -149,11 +149,11 @@ jobs: exit 1 fi - # Screenshots dir must contain all 278 PNGs assembled from Goldens. + # Screenshots dir must contain all 279 PNGs assembled from Goldens. # Hit one of them through the auth gate to verify wiring end-to-end. - # Mix of the original 01-61 range and the 62-268 batch (every Golden + # Mix of the original 01-61 range and the 62-269 batch (every Golden # baseline) so a regression in either half surfaces here. - for name in 01-welcome 11-dashboard 26-terms 35-dashboard-with-balance 46-buy-kyc-required 52-sell-unknown-error 53-buy-payment-details 61-kyc-registration-tax-tin-error 62-welcome-page-android 219-settings-security-page-default 268-phone-number-field-default; do + for name in 01-welcome 11-dashboard 26-terms 35-dashboard-with-balance 46-buy-kyc-required 52-sell-unknown-error 53-buy-payment-details 61-kyc-registration-tax-tin-error 62-welcome-page-android 219-settings-security-page-default 268-phone-number-field-default 269-dashboard-insider-unlocked; do code=$(curl -s -o /dev/null -w '%{http_code}' -u "${HANDBOOK_USER:-x}:${HANDBOOK_PASS:-x}" "http://127.0.0.1:8080/screenshots/${name}.png") # 200 (auth happens to match) or 401 (auth fails but file exists) # both prove the file is on disk. 404 means it was not assembled. diff --git a/Dockerfile.handbook b/Dockerfile.handbook index fd09eaa95..a312bc852 100644 --- a/Dockerfile.handbook +++ b/Dockerfile.handbook @@ -7,7 +7,7 @@ # Build context is the repo root; only docs/handbook/, scripts/, and # test/goldens/ are copied in. # -# The 61 screenshots (`screenshots/NN-name.png`) are assembled from the +# The handbook screenshots (`screenshots/NN-name.png`) are assembled from the # visual-regression Golden baselines under `test/goldens/screens/` via # scripts/assemble-handbook-screenshots.sh — one Golden per handbook # entry, see the mapping in that script. `docs/handbook/screenshots/` is diff --git a/assets/languages/strings_de.arb b/assets/languages/strings_de.arb index d27b1caea..9b0510b53 100644 --- a/assets/languages/strings_de.arb +++ b/assets/languages/strings_de.arb @@ -372,6 +372,7 @@ "settingsCurrencyLoadFailed": "Währungsliste konnte nicht geladen werden", "settingsCurrencyLoadFailedDescription": "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", "settingsDeleteWallet": "Wallet zurücksetzen", + "settingsInsiderFeaturesUnlocked": "Insider-Funktionen freigeschaltet", "settingsLanguageLoadFailed": "Sprachliste konnte nicht geladen werden", "settingsLanguageLoadFailedDescription": "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", "settingsLanguages": "Sprachen", @@ -461,4 +462,4 @@ "youPay": "Sie bezahlen", "youReceive": "Sie erhalten", "youSell": "Sie verkaufen" -} \ No newline at end of file +} diff --git a/assets/languages/strings_en.arb b/assets/languages/strings_en.arb index 913f4061a..3f26caeb1 100644 --- a/assets/languages/strings_en.arb +++ b/assets/languages/strings_en.arb @@ -372,6 +372,7 @@ "settingsCurrencyLoadFailed": "Failed to load currencies", "settingsCurrencyLoadFailedDescription": "Please check your internet connection and try again.", "settingsDeleteWallet": "Reset wallet", + "settingsInsiderFeaturesUnlocked": "Insider features unlocked", "settingsLanguageLoadFailed": "Failed to load languages", "settingsLanguageLoadFailedDescription": "Please check your internet connection and try again.", "settingsLanguages": "Languages", @@ -461,4 +462,4 @@ "youPay": "You pay", "youReceive": "You receive", "youSell": "You sell" -} \ No newline at end of file +} diff --git a/docs/handbook/README.md b/docs/handbook/README.md index 8eb55d72c..a5b903078 100644 --- a/docs/handbook/README.md +++ b/docs/handbook/README.md @@ -21,7 +21,7 @@ deployten Image (`handbook.realunit.app` / `dev-handbook.realunit.app`). ## Screenshots regenerieren -Es gibt keinen separaten Regeneration-Schritt: Die 278 Handbook-Screenshots +Es gibt keinen separaten Regeneration-Schritt: Die 279 Handbook-Screenshots sind direkt die Golden-Baselines unter `test/goldens/` (gemappt in `scripts/assemble-handbook-screenshots.sh`). Eine UI-Änderung an einer der gemappten Pages produziert beim `flutter test test/goldens` einen Diff — diff --git a/docs/handbook/de/index.html b/docs/handbook/de/index.html index b9aaa3a28..a9c2e6351 100644 --- a/docs/handbook/de/index.html +++ b/docs/handbook/de/index.html @@ -472,6 +472,10 @@ justify-content: center; padding: 14px; } + .test .img.img-multi { + flex-wrap: wrap; + gap: 12px; + } .test .img img { max-width: 220px; height: auto; @@ -1002,6 +1006,9 @@
  • 78Telefonnummer-Eingabe
  • +
  • + 79Insider-Freischaltung — Bezahlen & Senden +
  • WWeb · realunit.app
  • @@ -7942,6 +7949,106 @@

    78Telefonnummer-Eingabe


    +
    + +
    +
    +

    79Insider-Freischaltung — Bezahlen & Senden

    +
    test/goldens/screens/dashboard/
    +
    +
    + 2 Screens + +
    +
    +
    +

    + Die Funktionen Bezahlen (OpenCryptoPay) und Senden (REALU-Transfer + an eine andere Wallet) sind bewusst versteckt (Soft-Launch) und erscheinen erst + nach einer einmaligen Freischaltung auf dem Gerät. +

    + +
    +
    +
    + + + settings_page_default.png · dashboard_with_balance.png · dashboard_insider_unlocked.png +
    +
    +
    + Einstellungen mit Versionsnummer unten +

    Einstellungen — die Versionsnummer ganz unten ist der Tap-Auslöser.

    +
    +
    + Dashboard vor der Freischaltung — nur Kaufen und Verkaufen +

    Vorher: nur „Kaufen" und „Verkaufen".

    +
    +
    + Dashboard nach der Freischaltung — alle vier Aktionen +

    Nachher: alle vier Aktionen.

    +
    +
    +
    +

    Anleitung:

    +
      +
    1. Einstellungen öffnen (Hamburger-Icon rechts oben im Dashboard).
    2. +
    3. Ganz nach unten scrollen bis zur Versionsnummer.
    4. +
    5. Siebenmal kurz hintereinander auf die Versionsnummer tippen.
    6. +
    7. Es erscheint die Bestätigung „Insider-Funktionen freigeschaltet".
    8. +
    9. + Zurück im Dashboard stehen neben Kaufen und Verkaufen neu + Bezahlen und Senden. +
    10. +
    +

    + Die Freischaltung bleibt dauerhaft auf dem Gerät erhalten (auch nach + App-Neustart) — sie wird lokal per SharedPreferences + gespeichert. Eine Neuinstallation der App setzt sie zurück. + OpenCryptoPay-Zahlungslinks funktionieren unabhängig von der + Freischaltung — der Deeplink bleibt bewusst immer offen. Tippen auf die + Versionsnummer nach erfolgter Freischaltung hat keine Wirkung mehr. +

    +
    +
    +
    +
    + + + screens/dashboard/goldens/macos/dashboard_insider_unlocked.png +
    +
    + Dashboard mit freigeschalteten Insider-Aktionen +
    +
    + Dashboard mit freigeschalteter Insider-Ansicht: neben Kaufen und + Verkaufen erscheinen zusätzlich Bezahlen und Senden. + Golden-Quelle: dashboard_insider_unlocked.png aus + dashboard_golden_test.dart. +
    +
    +
    +
    + +
    +
    diff --git a/docs/screens.md b/docs/screens.md index 9784edae2..aceea585c 100644 --- a/docs/screens.md +++ b/docs/screens.md @@ -16,7 +16,7 @@ Column meaning: screen, or `—` if the screen has no Golden baseline. Each slot is a Visual-Regression Golden under `test/goldens/`, mapped to its handbook position by `scripts/assemble-handbook-screenshots.sh`. The handbook now - covers **all 278 Golden baselines** — every screen **plus every tested + covers **all 279 Golden baselines** — every screen **plus every tested state variant** (Default / Loading / Error / Snackbar / Dropdown / Validation / Confirm / Success / Failure …), including the areas that were previously absent: Support (email capture, tickets, chat), Settings @@ -136,7 +136,7 @@ one shared form-widget baseline (`PhoneNumberField`), which is not a screen. `243`–`245`. `SetupPinPage` also backs the `settingsChangePin` route (`/settings/security/changePin`) via a second constructor; that reuse has no separate Golden and is not given its own row. -- **Handbook numbering.** Each of the 278 handbook slots is a Visual-Regression +- **Handbook numbering.** Each of the 279 handbook slots is a Visual-Regression Golden under `test/goldens/`, mapped to its handbook position by `scripts/assemble-handbook-screenshots.sh`. A parallel Tier-3 Maestro flow (`.maestro/handbook/NN-*.yaml`) covers navigation/tap-routing smoke for the diff --git a/lib/packages/repository/settings_repository.dart b/lib/packages/repository/settings_repository.dart index 79d513408..7031b8ada 100644 --- a/lib/packages/repository/settings_repository.dart +++ b/lib/packages/repository/settings_repository.dart @@ -47,4 +47,9 @@ class SettingsRepository { set softwareTermsAccepted(bool accepted) => _sharedPreferences.setBool('softwareTermsAccepted', accepted); + + bool get insiderFeaturesUnlocked => + _sharedPreferences.getBool('insiderFeaturesUnlocked') ?? false; + set insiderFeaturesUnlocked(bool unlocked) => + _sharedPreferences.setBool('insiderFeaturesUnlocked', unlocked); } diff --git a/lib/screens/dashboard/widgets/sections/dashboard_actions.dart b/lib/screens/dashboard/widgets/sections/dashboard_actions.dart index 0c64a6a60..0e5076a06 100644 --- a/lib/screens/dashboard/widgets/sections/dashboard_actions.dart +++ b/lib/screens/dashboard/widgets/sections/dashboard_actions.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'package:realunit_wallet/generated/i18n.dart'; +import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; import 'package:realunit_wallet/setup/routing/routes/app_routes.dart'; import 'package:realunit_wallet/styles/colors.dart'; import 'package:realunit_wallet/widgets/action_button.dart'; @@ -10,6 +12,9 @@ class DashboardActions extends StatelessWidget { @override Widget build(BuildContext context) { + final insiderFeaturesUnlocked = + context.watch().state.insiderFeaturesUnlocked; + return Row( spacing: 10, children: [ @@ -35,28 +40,30 @@ class DashboardActions extends StatelessWidget { onPressed: () => context.pushNamed(AppRoutes.sell), ), ), - Expanded( - child: ActionButton( - icon: Icon( - Icons.qr_code_scanner_rounded, - color: RealUnitColors.basic.white, - size: 20, + if (insiderFeaturesUnlocked) + Expanded( + child: ActionButton( + icon: Icon( + Icons.qr_code_scanner_rounded, + color: RealUnitColors.basic.white, + size: 20, + ), + label: S.of(context).pay, + onPressed: () => context.pushNamed(AppRoutes.pay), ), - label: S.of(context).pay, - onPressed: () => context.pushNamed(AppRoutes.pay), ), - ), - Expanded( - child: ActionButton( - icon: Icon( - Icons.send_rounded, - color: RealUnitColors.basic.white, - size: 20, + if (insiderFeaturesUnlocked) + Expanded( + child: ActionButton( + icon: Icon( + Icons.send_rounded, + color: RealUnitColors.basic.white, + size: 20, + ), + label: S.of(context).send, + onPressed: () => context.pushNamed(AppRoutes.send), ), - label: S.of(context).send, - onPressed: () => context.pushNamed(AppRoutes.send), ), - ), ], ); } diff --git a/lib/screens/settings/bloc/settings_bloc.dart b/lib/screens/settings/bloc/settings_bloc.dart index 3c57a539c..50bc0fbdb 100644 --- a/lib/screens/settings/bloc/settings_bloc.dart +++ b/lib/screens/settings/bloc/settings_bloc.dart @@ -17,11 +17,14 @@ class SettingsBloc extends Bloc { language: Language.fromCode(_settingsRepository.language), currency: Currency.fromCode(_settingsRepository.currency), networkMode: _settingsRepository.networkMode, + insiderFeaturesUnlocked: + _settingsRepository.insiderFeaturesUnlocked, )) { on(_onSetCurrencyEvent); on(_onSetLanguageEvent); on(_onSetNetworkModeEvent); on(_onToggleHideAmountEvent); + on(_onUnlockInsiderFeaturesEvent); } final SettingsRepository _settingsRepository; @@ -53,4 +56,12 @@ class SettingsBloc extends Bloc { void _onToggleHideAmountEvent(ToggleHideAmountEvent event, Emitter emit) { emit(state.copyWith(hideAmounts: !state.hideAmounts)); } + + void _onUnlockInsiderFeaturesEvent( + UnlockInsiderFeaturesEvent event, + Emitter emit, + ) { + _settingsRepository.insiderFeaturesUnlocked = true; + emit(state.copyWith(insiderFeaturesUnlocked: true)); + } } diff --git a/lib/screens/settings/bloc/settings_event.dart b/lib/screens/settings/bloc/settings_event.dart index e65e52069..dd596c8fe 100644 --- a/lib/screens/settings/bloc/settings_event.dart +++ b/lib/screens/settings/bloc/settings_event.dart @@ -37,3 +37,7 @@ final class SetNetworkModeEvent extends SettingsEvent { final class ToggleHideAmountEvent extends SettingsEvent { const ToggleHideAmountEvent(); } + +final class UnlockInsiderFeaturesEvent extends SettingsEvent { + const UnlockInsiderFeaturesEvent(); +} diff --git a/lib/screens/settings/bloc/settings_state.dart b/lib/screens/settings/bloc/settings_state.dart index c10ac93f0..2288e2bb8 100644 --- a/lib/screens/settings/bloc/settings_state.dart +++ b/lib/screens/settings/bloc/settings_state.dart @@ -6,23 +6,27 @@ final class SettingsState { this.currency = Currency.chf, this.networkMode = NetworkMode.mainnet, this.hideAmounts = false, + this.insiderFeaturesUnlocked = false, }); final Language language; final Currency currency; final NetworkMode networkMode; final bool hideAmounts; + final bool insiderFeaturesUnlocked; SettingsState copyWith({ Language? language, Currency? currency, NetworkMode? networkMode, bool? hideAmounts, + bool? insiderFeaturesUnlocked, }) => SettingsState( language: language ?? this.language, currency: currency ?? this.currency, networkMode: networkMode ?? this.networkMode, hideAmounts: hideAmounts ?? this.hideAmounts, + insiderFeaturesUnlocked: insiderFeaturesUnlocked ?? this.insiderFeaturesUnlocked, ); } diff --git a/lib/screens/settings/settings_page.dart b/lib/screens/settings/settings_page.dart index 7b6d5f351..d036b7587 100644 --- a/lib/screens/settings/settings_page.dart +++ b/lib/screens/settings/settings_page.dart @@ -11,6 +11,7 @@ import 'package:realunit_wallet/screens/pin/verify_pin_page.dart'; import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; import 'package:realunit_wallet/screens/settings/widgets/settings_confirm_logout_wallet_sheet.dart'; import 'package:realunit_wallet/screens/settings/widgets/settings_section.dart'; +import 'package:realunit_wallet/screens/settings/widgets/settings_version_unlock.dart'; import 'package:realunit_wallet/setup/di.dart'; import 'package:realunit_wallet/setup/routing/routes/pin_routes.dart'; import 'package:realunit_wallet/setup/routing/routes/settings_routes.dart'; @@ -153,16 +154,7 @@ class SettingsPage extends StatelessWidget { ), ], ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 20), - child: Text( - S.of(context).settingsAppVersion(releaseTag), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: RealUnitColors.neutral500, - ), - ), - ), + const SettingsVersionUnlock(releaseTag: releaseTag), ], ), ), diff --git a/lib/screens/settings/widgets/settings_version_unlock.dart b/lib/screens/settings/widgets/settings_version_unlock.dart new file mode 100644 index 000000000..d0717b6ec --- /dev/null +++ b/lib/screens/settings/widgets/settings_version_unlock.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:realunit_wallet/generated/i18n.dart'; +import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; +import 'package:realunit_wallet/setup/di.dart'; +import 'package:realunit_wallet/styles/colors.dart'; + +class SettingsVersionUnlock extends StatefulWidget { + const SettingsVersionUnlock({required this.releaseTag, super.key}); + + final String releaseTag; + + @override + State createState() => + _SettingsVersionUnlockState(); +} + +class _SettingsVersionUnlockState extends State { + int _tapCount = 0; + + void _onTap() { + final settingsBloc = getIt(); + if (settingsBloc.state.insiderFeaturesUnlocked) { + return; + } + + _tapCount++; + if (_tapCount == 7) { + settingsBloc.add(const UnlockInsiderFeaturesEvent()); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(S.of(context).settingsInsiderFeaturesUnlocked), + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: _onTap, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 20), + child: Text( + S.of(context).settingsAppVersion(widget.releaseTag), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: RealUnitColors.neutral500, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/action_button.dart b/lib/widgets/action_button.dart index 5cd6a9a39..a882f408f 100644 --- a/lib/widgets/action_button.dart +++ b/lib/widgets/action_button.dart @@ -31,19 +31,32 @@ class ActionButton extends StatelessWidget { ? CupertinoActivityIndicator( color: RealUnitColors.basic.white, ) - : Column( - mainAxisAlignment: .center, - children: [ - icon, - Text( - label, - textAlign: .center, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: RealUnitColors.basic.white, - fontWeight: .w600, - ), + : Center( + // Expanded call-sites (dashboard_actions) squeeze this + // SizedBox's width down to ~80-84px, and large text scales + // blow past the fixed 50px height — scaleDown + a + // single-line label keeps the button overflow-free and + // fully tappable instead of wrapping/clipping (responsive + // matrix gate, issue class from PR #885). + child: FittedBox( + fit: .scaleDown, + child: Column( + mainAxisSize: .min, + children: [ + icon, + Text( + label, + maxLines: 1, + softWrap: false, + textAlign: .center, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: RealUnitColors.basic.white, + fontWeight: .w600, + ), + ), + ], ), - ], + ), ), ), ), diff --git a/scripts/assemble-handbook-screenshots.sh b/scripts/assemble-handbook-screenshots.sh index 9a55f00ea..33e716baa 100755 --- a/scripts/assemble-handbook-screenshots.sh +++ b/scripts/assemble-handbook-screenshots.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Assemble the 278 handbook screenshots from the visual-regression Golden +# Assemble the 279 handbook screenshots from the visual-regression Golden # baselines. The flat `NN-name.png` output layout matches what # docs/handbook/de/index.html links to (`` # — the relative path resolves to `docs/handbook/screenshots/NN-name.png`). @@ -316,6 +316,7 @@ MAPPING=( "266-debug-auth-page-clipboard-snackbar=screens/debug_auth/goldens/macos/debug_auth_page_clipboard_snackbar.png" "267-debug-auth-page-authenticating=screens/debug_auth/goldens/macos/debug_auth_page_authenticating.png" "268-phone-number-field-default=widgets/form/goldens/macos/phone_number_field_default.png" + "269-dashboard-insider-unlocked=screens/dashboard/goldens/macos/dashboard_insider_unlocked.png" ) missing=() diff --git a/test/goldens/screens/dashboard/dashboard_golden_test.dart b/test/goldens/screens/dashboard/dashboard_golden_test.dart index 69bb26cbe..4014ecdf5 100644 --- a/test/goldens/screens/dashboard/dashboard_golden_test.dart +++ b/test/goldens/screens/dashboard/dashboard_golden_test.dart @@ -125,5 +125,24 @@ void main() { return wrapForGolden(buildSubject()); }, ); + goldenTest( + 'insider features unlocked', + fileName: 'dashboard_insider_unlocked', + constraints: const BoxConstraints.tightFor(width: 390, height: 844), + builder: () { + when(() => settingsBloc.state) + .thenReturn(const SettingsState(insiderFeaturesUnlocked: true)); + when(() => balanceCubit.state).thenReturn( + Balance( + chainId: realUnitAsset.chainId, + contractAddress: realUnitAsset.address, + walletAddress: '0x0', + balance: BigInt.from(5000000000000000000), + asset: realUnitAsset, + ), + ); + return wrapForGolden(buildSubject()); + }, + ); }); } diff --git a/test/goldens/screens/dashboard/goldens/macos/dashboard_hidden_amounts.png b/test/goldens/screens/dashboard/goldens/macos/dashboard_hidden_amounts.png index 6d13463d77ca63401bf9415449e4e409da7d1371..214c26bc5f9e356901662ee80372dfda752e0942 100644 GIT binary patch delta 34818 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 Pm&r)VzsMEW_4@w+(W~)W delta 37297 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 diff --git a/test/goldens/screens/dashboard/goldens/macos/dashboard_insider_unlocked.png b/test/goldens/screens/dashboard/goldens/macos/dashboard_insider_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..2d41dd0051e0529eb45cb2f6c83e7efc550c0823 GIT binary patch literal 28803 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 ZLLVH3dYYg;2NDqka$ggsQFhNd;C`W z?*Dr9>(Ln*HUlrvgP>~3b002Ohk`z@20H_cEfRROn2d`*YBawg~ zuuj5KDv018Z$y(Y@Hdo`vV<^DGEB4w0B->)(T^(bsfSB$?$}cu@DMlc{hS|2WMrt& zAKywcLu34L!+71i8|rV+-d(MW4J(Gx?pvxMWC2YsS8%cH_2mKxprj0#lv`q5A(e_J z8jnevyuRl1=uPr;f*%$p*=F#T zoE++3T?}X_Q1hl0AU?5;YWvEY51G_5{LCzfVzI5IIz>kQTjyK9FQs@96QR?UgprFo zpDcQDeMACorPn>hpOzZdLQzrCTNN#q-HM2tV@YgZfj5D&f%&r*2<$Fhp;7l8J$((V z1>)d6y(B2`F+tg8#;08Y3zGe8d>ZflGl!O5YmC54C5acIMM+3c2cBAHLo-(uN6qkh zWu@E1UAkjnOmSDhcgEAdN^HKywWa)w)Vbhp@xImXZF0k0QYe)v0iQ{;em{)a2*xT* zks0(ZkXxS4kS~s>ko_L&;hXQ#JBGAt85FZHu^nFLOk}s4&^;+Hg`yJkA!hipVwIFI z0sa$a!$z}VN@DUW`JW_$f`cizH6L6nZ0^y3wq>9D;I&-&3@D(=Zl*@|l8(7qFX{&e z@oPL%ecA(x0$hf2idbV!u^*Q_ip&xNOQElKjlvTr50w>8_SOOfn!TU^@hESkkq95$ zM+DTal?6A0@xQNd3lkQhVPIb4;~Ow#aCsEW?ln3e!)_i!yaY&)fUs}h#6|z2npa=l zc=gDyg>B8AVgYZ7#CrFW9 zPw5T?|NA2Xn&FjMMwVRYu=(mn)JKsFY}Y5N=@N-jfk!ea%x%9*RDtxzH{|5Dza&Nk zcE>8wuMU@J7(V<_9j*_{>WNGVCFb+S2O!ggr4$SdIyW`GkWoYDy~S6quG|S|rB6eoRK=L8ta^Zk;(p+V3xqt__TBB4|R<3+>Z7Iy&AzbxD~|RZ!(LUo#zximic4 zy`EG)vT^Y>%YM}I=Z_!$eoWgJay1@R>?8;Ca0yKM-P(5BspyE7FAyQ?1)FZ*)2>{nll^KqkCSnP4R+@UOcnH6}<8`H@D@;EnmSaEt5 zw$|Zmx!cwz;<85!ML(oHO%;+_m~1o@L3zXWI^0+L%h!#bOuc4L$oXY4#Fet(_(J?u zCU zT6_)@7GU*slmzi;3NNMBx~py{L*#t*vqtMS`Z=ozIRE)eLi_bii*Q&N#}VEljT(G4 zHSQh7{h8~(gm%plGI-3HKKHI2RZ*c=ZJ_Fs^H9T!AfVGZCM}U1d;`rJK8*>LgM(wX z-iwo3E)`%dg$Jbr+jxE06-E=fHaJ%a_%o%E5Umg2KU9Y9=XRQ9_yyG6+z2b=?WiZ) z%&&=iG2Gd_y1P93w0;(58J-u*@cnk)17J>qqHje~=#t3}{V$Sy1`{jF<%?)+5I=^Y@n zBTozkTpzD6U$gSM90Hr^dDE6hnG@NW64$nXe*nzg+D>q|0So?+gc2E9anNl{OpL?* z74hG$9tvLGou)`8RfO0w3g#mYssgK6+(YP!&5CczR)H^~xiK2HPL#!@mi2r!=gI%@ z_%O7=tlNSDxEt>;ba-nO^Iv%K0|q-KOYS?57GYoOkypec6kA(pY{kUm-G5J;GdyyK zg(k!aQuY^`4&Va*STqX4#cCpj)je6o+A#GitF3q2ys5l?B%x@e7++{Ve8Bp&;)`xI zW9P4Ch3@C)XJYy}&a*jtE=SZwiGs#Tv~{7rpis%Ongc(ThoE#D213ui_HIrh_LVt+ziy+`-2$oWZ9fjs_V*QYqMM_k;aXT&UBGm) z7EU6`tvsyVY}wdiPrBJbO)C^oEF#>m;q^1F8fSfd-GDXe8~>XJjhT|fr!fYgtyX`C z6J5Pfb$20`)A!Dl>__PV5)etmAM%S@j^&r1;CWf~!E{1{EtSnDpsXLYjg>0c<*CpS@w*b8w>%IiMBqo}e3bj9D=zgVg*{k4A*4$tfvidb9W?sj zWw<5oYd#pj*{dj=<@l=}fBEMlPw*eiNfsCRybYdx6F<0-)Yz;*p}V^@THA$2%_*{Wl+Qj#UE)KILf*{Vx>h%=L`}{fl+N%oC3Mmu>3bB#SmqzqS8X}kx zVxNEFd#I&HVcFV#O0dt5m(HfM|3b~e0+hD!y;*s-gX(@dcvEF_{%-oQ9%&-SFDOCJ z1M&_LRQb_tCz{!X1;b;r%G0UZl}xwikE51H@7IDIc9)Odi;77g52(E(DYCjlcn)Z6 zd4`-bhl6=E)KlVFzl{6N$|q#+fe}HwrwWf7kqv~alTg8#qE0`7L@40K@=1q} z-_j(&<~7kG3TSf#w>Q6hAMZNqY;~RF`>%JGmlnHVfh-CB;Fw%_I(%&;n zBd;>9QTg?^IIQ>9IphoZsz{+_!^eC zZsJqDGyRfepWu>X{#Ey?xpr+^Y=QEwrom8Rr?g@L{M#uF_vSRb9acG_SxK8B3BNi2Q%D_lTx~_^>?jXny>&m*U{b9NU)%BT!c4)D0fpcKaK;un(ha zK0O9ToL)AZNVtwCd+FKrOUqq-v85D=U)~;|2Hm978umIose)?&-!LQ?%{0%`R{E?WbactVFs~^)Bgi6R^u+be+Q5+bynf-%Os^UU; zBttMt-}kmlr>4C8qk+L&@CkSY1qGSXVe6CSX7`8Fp0Qdxed~o9RNyrhR^W)hJ<9R% z@eQOC9eMD4JH-x6*Vn_DTl}l5U6Q72?N$VWLPCsoM>92AeSL!WZCR5b`-P?C6cjLl z2hdJyd-X!BD(`z2Zlj!fD4bW7YeEOryoSew5$wY*VVrW&!t8jx3bph{Jb6 zPPANw3~@_KI$>d9@EK(zKQApU0$e5?#LW;SfI+*a=x>8`bWrWGCo&lsnfv4Aj3H|h zi`6uP_tWjpOCp0nPDu&-;q&0Tsuqvvn3(sb{n)VZ@Ev1g7@)YjbL3KjEPNkMC4z#2 zRv&K96WJ^<`S|%U@bSYeCUVy1tF5}GKX7xufq_R6l9UX)bvl}_9%xECPZ9JJ0B2O@ zdASdL5E&NM1_}*)2$7VO6ad$VyFHv14!YZqnTl-_6Ig-ps2%Nr2r`SlqAIZ5Xd-6~ z(IIHWmL&1<@zmU0T#~?_X0Pky&{CcH@x{wgP*eLr9|!%m+G0YS6(41LPvG(5(<}eU zRzE+B$vmZP4}qr}<8!w7UFrT69B3g&d;1^I(9nZhrUUUf8v4&qk5sg^h18{uG^Hdy z_g8VQhqFqDS6byp!LUM}pj5Jhf?&@*D=R93_DGJUJ+GJCh8F1FzgHSRxKv(g@fkWe znaq!w1ZQEf+~g5FtsYHD%gd{6x!hC_D|B{sg}c2{=aA*mko3VU`5Yt!@f=&0f=e>UF-_dXL=Q01kpW=a^Vw5|3h^Fhr8HQ-&@F^A1OVg}_XlVh8Rfvyz&UQeovpHn zq1-yoJ97oJYpmZhe_&@pM3$H$IvvLIsTX z{-hXMBa8ch4@e^8GW=lu@B!I6hTUp9F?6ZXZG=cjRK>Nzl`4(P0UA`Sw#ocY4y$cY z&PVe&3$=EkX=%j3>TnuwSa>)Lu-NQ{Clk-m{tbtIb$=fTsIy=D;-RTkjLVaTwoqf! z`CBa9es7!#5c2kJvc4qcb!7m}_?O~47W2`!fRM9umDr5K&M@)AA!Jt_I`~LlV@H8M- z0k5vA+HR%Ae5HjSXj@q!E!L`r2F{<2eM?)PcwRjBavnALaC3^&p#MuMh8pk( zWz^bs6%`eQCk$1;P*Bw!NgNKEP?2^m+KS(^Pv!)l_ts>&anCm$J;UoH4NXl$(9r9= zu9-d$r@jKf=?C0W3Sh+PW-s0zf}(#CAr|y)x?N~YNJ#ML@wwPl0uQ*7{8H1>46Uq? zfjZwu9$+=eEdAp|jvN#~uU^71)v&aG#=BZ+m+`hgiYkghnB}HZ3f*2?B(TUjapmcr~8#>q>Xde z?d-iP(2-yP24Fa}cXY&jLMI|79)R>AYgL$hy?x%Rp3&>*0dO8{axw!ZX2F}w71wklaIGtZRvjJ<$H110B`&gC)1sfZ-+wo$%1gVb+ ziGbNK5zv;Wlr>tY&ODgRj*LYu>mME-USH}pTV^P99O-j+v4_uLjW2M2SgBmfd$O>< zli`Qv=H>>Dj{s)58V%00pe-Wluxes}kr8xu0D$s_754e*x;4B>hyBF&3+O`dcKt~C z+*y8jrBk1HOOt?+5)3JZQw6GkKkcU+MBb$un+0fqT0S-G#Z19v(^s^B;Y1jW;`UDu z9(4^3>&3Op9bPBRptNVD>@;dGJa_7ye(fz}!*4o%0@vE?$uKv*FH0q;5%P?ZP^D4n9eidT%R1pF^K+Z*7gNShG@mf37kY8ynk1Zy59l z$T}`Dt@0l~e(W&K1CuA*eKH)UontT-g0IM#?TJeem@V;I(@Ri zpqW%E;OV~Pv@^_D7D26$&QO&C=3Fu#%!XsXiyLPy#D+;z4^&3?%j8aw(bB#G{nxhb zpNERd%Ac{ZDw&1$tgNhHdKw1Gve$F#Tc3%rvol+j79(gMrrHV)U@!?-JZH$hEsCZj zMVL`xOOx#h!;8 z7#ONV|Ef{(Z+Uu!fG9IBFX7H`=vwcXF_*&`HW4uqc!uf^^?0ADIq?=~+h){u*xY@O zvb%z=%j1T*E$Dg3#bLAjMV^?~XteD~=$PWQK-!1e(aYeg-AEeG%h+=Yu+89E0T&3? z)HD+O5oKi%=ndDCxo|ncX=oragD*I^l_{jP)i1!H&iR%V_o)G2Ie5QRlkEEEG-ynaYp-GQ1F$|`Q;!TS!N5>DHQ~PX zJ_b)#SGW3N1~b7P4|^bk1WNA6CLgk3o#uq{$a(uk6pPt0UI$AWQ*rN}OG6d(4goys zA^HdspFvbumt|c^+Z9^H-C4yV-*lKTl;psr zR9Q|ztC#4B4K5{u)9JSQ#NxYn-chy^&(L*0kpsSAKW-q{F@`z%M| zPy~J>^w~H3I@c%6xQDdq{b4wF#=8DUBrS`d`wiT8{7Zv6P&S2lo#Fp{58pT+zF&!E zXe)ss9yd)qSugBcuqJ+J#Nj}LYniCEmE3|1+JkpJ@ou)=EpuK^565nmGzD+ z*a#f1Z5gVxytsIH`tM3iW$Jx)(DuQWQiRrYj}&N5yxuz>Ffd--%-a0-?Z5)V@eh^d zJG*dm@grb&u;8Q7dQ6$)1es0)3Dp7*J_@K|VQCRK;ulAV)mq>ccSdRqCDirJx6hv_ z-2Z|K2n`Pdj{1)qf21n>SWO!d6{TFo_~%7R1JEXZ3VEzQxEKNh43&ed11^n4v2WA8 zJ|~&RYksb`P4G~~1V?a>{Ezl3|MN=qcXo@BSny@woER!~Y6tqmF_bzG!AXHLJ8;z` zlZu8V2Ya7Hz+ID)pWV?+s!9U3_5q4-I+)rgY=~Q9t)T zPe%W;as19tw^ALy?L}^bj>OEl*=EwW<^L2T5*Qy}V_e#&;Q92{k7P%Q^n%{ zqFG5>4Z3PW>5qL9!;x3p7;0*k|8=9?2LAVF2=>cgI_%jrQke3=6066}CRHeB0d^v8 z;iZ8RFGkb*wd|nI^PK6SdFk{zz^Qkdkf8+)G!-RO$MkX$)qi3EF2zwiovkA!l5g4? z1L%JnVg2*2==3DiT2C|pP^V%1ZH&eEUmrHIvx>O*&hVC#vg(QhS04ckk$LbIt4ip# zzfV3!Q~v!+)v++qwSKTlxEK~@`6GyuSj~KC8GQ^S8JKk3&B@BiIC_-JqqXs8b71uxxRRZ|a za~j!0CaKtvt;6)vw1Il4GNTDH$>^ZmJGU>ngs zhpeXVpHL9{JuW}XT5|9(aiLmOW9I7F!Yo)W8h-MzQv1F;3;R&x%DjG@i;a&r+KUCe zcHwO2J5*B{zE^@;-H*UOhosbQIBuVw76oYyl-3=cl?`zIMn-9Lppnl>RwX7pNX_bQ z6Hnir%BCW*T0oJ`hMu7?cA&r03)nm8ccuN_M`^h5R5|Oxg_6T_gIJBTvk`nY^jB7t z(gc_Las5O2_DVvU52O*gO`+4VMW?CdmSDUhVtWOZ`jtK^Vo;XL<&(S~Mc~@QmZT*0 zD+Om8O@q|HW>hu;cI63H1GZ!Un6cds3Qz`W&Pu>vjVi|>+lmZm?R@E4!4wxu_{Ht4rg*+6z!rG&Qimfy`Aa;mm3pE+>Le=($2r2=Aufs^ed-CvX6EBZyJJbB>iwt zCW!MvQ-f>8W*FfYc0a>#L$Ny!`HKP*xriGznd@we2tr#l90brxt(%all>SwE9aJR#zrT)_#U)O7|5L(F$g?yTd|6zr01DD z_;iRs7vaEuE!l6tM$W^8fx4KMsX`~6+Dffef6Jm~%@bs7Rw`VqY-I90440E1zOZG8 zR((kReVkx<5fvySXV^)3?#ojFEgNDTM)N)RqJU8l4*}F${)aS{0ygr92j%!L_3Hjm>T?mOnC6EI0APPKt?Sh4V8h+2 zs1_hV0=n_nUV?8DN+dvMTV*|;S5Qcm!Vz_oW#NyflUfDtghur(OSJL?vaI?{4f0mr zi9zr-$(6?S2!GoBSq($U1*z^4s1M?3i~QE_~!UXudBM4 zpg8#!8W`4Z3NE9s%~Ynt(2yCf#?J9Dw&NSirs_sH{`MJ4k0n`_%V|wKU~hlkH4`D- zVk-ay1T~UlmOriYU!d5B_>e70$~Z=${8p}D@tKj6U2(yJkAV%8>d;R(PRZrPiTf6} zvoYE+LGl==W6vQ@llrG**wPei3)SW#Q%VWTdSh0(a+Hm4rV5>voP4ovhN5jinO)dQ z%_|9C)Fm>s$!@>w1u;Q;s|%yVNMcL7OiJ6!p+Dk^nOR;OcZ03D{qR_OY=rtxQzdA9lbLU3_UT@BT-HH7U*UT?EM{MRB*<#Z17}J(io^ZHLs|M#=u=ui= zA#6@!l0L<^X69vti-&An#Kj^YIBtdLt1##-scWqK-*Rf#Em*NIPU3-hH_jTJ!sroo zTy`G(vzA_3MF?S8*!>@f3Gq$nX!ylj>@p3aC&?n#cs^Gw-Sqhrd;RIAlf6O2ysl;{@QNOEL&M4K*f z{7d~=ZFNeFPFIYA8Q=p!W6-hDvCC+}?jaQS%N&`wgG^)XG3 z(a_Zf3%=v=>Sb{jp7kWvgACbkBMUamSq%$=9rGw$IYJx{+Yn21S1JsQpZ;mZV5;$t zYT*AbcXkI0l_`9^4AT64Iu)6*6I^c!LorC$OMUPywn|n2GcYV{@c&hO{KrQAN4oPL zn#2G2PDOPWxNnvB;;iyw2d@h!C^+Pz>Z+{&X7Bwh;Z${*k`#9(pyE4Zhm_TR$!&&D z*Fv55v>2OM$uB5WBeNcH`6OpO^0JEj0{Wjcx^^AQDSflP{IBk9sn5|vV6W8ZE+8(V z8A4_k5T`F`Ii94D3jR+H1x{Wixa~hmIM)&;%5N@Z8J^wqR1S+(@Mq>>nECdhyy#U` z)g{`lWKC6<=AGi;1DD^eU6;8taCzXpdJ|Gm06%5GRAbpR*&@(gWgjY@oj2Z4#{Wr7 zHQ`FfwB4Sa49m_oqHQW@ut0-0O$wM<_!JEJyMV4J2n$Sd0}Y!Fv@o3;*!!_8F)TB3=eW zXf4NhSdXZ@p)2IyQMdTVE1B&YB6~NB`Zb8B9Kcs5uFRl=9~BH4M@e)si$}MHahNF7 zuM%%&*onT&{`69<4vC6kzhiU#NJEOCkso_QBS0KV5#zA>*-=%!xO?~bAdD1&Gi1DD z2Qr&J5P4L;zG*oUoF8kD=*ER4nDH&ni@jQyQ;_C?j{z}qI(Wq^@rPks>f=uh*Z74> zHtL$ozpagIRlBTn=`vAAa}}HBBf&rU@oRKt{vK%C_11sW`j`*+;$sH24@tZIwpfXv ze8DFjUKXIX?C(TD$?a>JXj+eCcV01&%GB)q?)Bu@&}$$eJ^U8ygj3!9@Dw5QC;{g?IA5UW1;O5k%=#camhxx)NRF-x_f=3I< z(=h(2F#W`6pC@aEYj^@)+93wn0G|c4ETMC0pBWZIYI?aIPF`_PINCOikosp z`CW$(H?Ho1^LgP-mRsXJxAq^V>ZJmRSDkL;J=*MxH0#e|YxxsG7*342UME3kscfO! z6k`Y@dr;rcgr2ObRG|U(JUlpn{gy90@T)ih*UtGAH^)v{inDprSyLPfZCSnxKevM4 zFXX8H0-ON4u@_V8Sj5CSegP*@ zZ@8s<{`1Zy<#&rUwQY~QmnDEBlq8;2?TnYXzhIWRaN{iZx~8@8HYSi!tU!lP$jk_= zY90UVNK_*cV=|t(6n$f*(MS|79lZQ5?(S!|^@!;wWiKXFa1QiVUQCSP8OF12AK*MG z&>Ll}?yJ8&Vn_n=cn*p3aC;G$k;}A?k?BYE*0bsK>Y58q7MgtcIH>+@vvf7*|MA>!$NRte7kW$1IAT6D zN8`O1x&+*~Ji`Xj5EN1h#m}Y|S>V*vb-b9+7MyN-$HW;)QE0tU95jP_a@Gb!-1_-e zzUy*gWOQS>n5xEe^k3Z38iXnAG};arKeaC;R`00gw^)EvU!L_wZB38A zuDO{nV6cfjs`m!h5JhA&2|}ZzzUtc|M@nQ(e3_W_`%phBm}i~!s^|F6uc>RAQweu( zoXIlRcQS;gUQB{DJN;x5gmGH}@N}&UeVXo`Q-X?g{yDa;<|julm}K4(Dsr;G6}|k= zhF&E}3?wMFR|En9;yvE2i; z$YM@B$lDJyFg`@p-NQw$Cj`wDX?K1$9gipq#LAk_wDAp2$-^*9(CdWB1m-96e;Cy& z76svgsdX{mIG%ZfpRHS!rc?_!`sdSSWa4F*(h;4z+k3G=1JAPdDZ!~yqm!L;MqMlC zMsGm6bnEs*;0&lNCWwXwhwEI;UVBN{)7h%E$r{&YCv#4+Q}1f z0P08$%QeliXCqe5QC+~)+NlON5B?D$k8ozMhwL?EYfZA3>l0yLDq1I_nbZC&t% z;+&xgS?u4bUsTKJp3uD{7^op^SKY$_YudDv>l@38g(|lz@E0*OZX+=9RSR<+1aGwil(@=6|$6tvQ*mU zsA*c=#3+UBqJLy^8m{%>r+%02x(+1B%BrQfT9WM89=IO+JB54VJg~Q;O7FByI?)e< z@%0Ut2MtbyuFa{MdIsGbwW=J{FE^n%eSS^Ch4V)PYHceo0UVGxxr{8&VR^%)xncbs zO{lCgEXd_rss)Xk`CA6#g(=tz9cQ$R!)8;G9JP04m-X?A0Dc`C zN_j&njbD82Qm)CH)7vLWKxkH%`14UcT(gu>W2q46$LEfhlO~6;4w#lpE8QYWxJW|{ z+iepk+mQ!`yOPlj^{rQc6IUx(?TB$A0 zYEsS{b>}Yp8i}E{MP!(sZ)4)3F7|}Utj24gz}$=Jt9AS8=iK)5Vt$Cv@z;`u?H;VL zS>m5T8KH27Tf5u4kWPztIBoY!gzfL3i1AXz8tez`qiCSu}84bj6w%`3UV2B<@9GSl@^h-WUxZI z=W?fivm80?-l#4AoFkp@zicjStgg-AQIN#)n2gN5(w1{+9;D98{+D-2`WTDfOC5nX z0y8|rGDOkOOxAh^D0Q=aH$hX7q+>JX-r~~L_{CD&YxqFE0Ia5+-t(MKNrDG>e?Gq% z>mGmtDM(o<8CWj^w#eyx(|_v^f(X;^&oOOj%nbih9Pci1nbC~6+HuEQj&%KG$0sUM zNn9#asxJ*MLG3PX{tkwp7fw&^G*V&b#+rFn_u0>Oh-;O&cQT3cG3jP~BTs5;3jB&E z$Bjaic$myU$TH=tCI=k z2J&`-8ijPrlUCYZk&?Y^f@{ueA}7MTt($z&tf=@iIRa`Cwvh?E>_IYbS~3N0@8Q7O z(w77m)U*QOqn5I5E%k+Fss$$pY+8$?3cHdF`K7Lh&N0W*oNmyB4NH}9Z)Xj`OdN!P zMt_ib)-Z|_hVsKBT$CRcj?Y{r^VMaq4#(58wwi01ZJ10yDps+toLH52#Ql!5SXr^8 zo=S97&jM!I0E@+j%VBep&YMDVXaL1r8D0PKJi&AhOxWi(tw+#fuH7j!JbWHsD~{w; zs7bi!IJxn9Uj>y~514u7^i#Td`D$dt1qQ|;6-uy+;bnk~A*cdhl53}qahjAiaYp^~ z&){v!Z(dUR>A2XQcTzX|l5D;LINC{t**r$xgbGbd)rQ$i`GZ%ojs=HTsk!5UWFy@J zuiX7+7V^?V7P(~hika4QS`TdkAb{$mGBmXQ^D48`2}ST7y|e@D+*#^O(O5N|A~ zw5ANtrso$GX#byIc5S+~A`G8fo{o93j}+*O*czBd6mO zlh(>H*$WN{4K+NqYfT;?h=3m+9yVXeq-b#7L$b26k}0jw+CBff!R5J$=z7BM?|QVL z?&1;_)-T4`BW$&mBXMKR0ynx>1 zNZPZ>jQPRomH>^EHy{J=38{D*3dBHZM4y;?JC;RYXHei{T`Y5@D;$ z+c_{nte1X#b3MuFaJ;B#Nc@6thq=G}`1kSvpWBEFd=bX{bK_fv-W5R(!Koti`C=NHHP(<90h?dm^&pLJffBquy z+K${^LIHGf{SPO#`hF32sQbpFtL=#B$ejwvzHKK1@oO0a>Z^x3=-@f#yeg4^Gh&p> z9xON{qgK`5y-zd_cau_}kT6z!GbZ@sQ&WRTqFg{u!8Z^{O#Xo$>x00Cazm56av1#d_!g#zR-aC#!&uj#fuioFfN^7 zI@;SYdKA*y_bLr<_7cRnyboa?9v(rC&iZ1#6Wl)WWL5qsT>Q1>8H46SO1(htNXXjZ zEwVmw5&-m~#5e3p223`b)0v~wG*QTyNOwZ!C{0J~HG0j$+3F>8> zA<1X(eBJ302nY9LeWq(*G~a0l^Pt>p#8wvnnh(U)1uXvPy>DhICbcnsS{fV6Z@Wp{ zH3x(wL1>^MQZV!puX9`aQloScI);*qngwTFz6#xUqDwYl^&&rpB}o>wVe)nj^_Pe_dMbB1PJTAxI^YY$Zc&s~^n401=>Sc|EnPreffJ<(A z&Om?dCirT`Zn=BZuroZhCo{pDWK0FLjjWJL zn+_K=x*VVZv-M60AXhJ#l$Y1*AJAct#|Ji8Jg+>VwQG+2LFNbWmh}u5XzT8V2kh^! z7!8~I`uaxql%W7D8o7{&2vpEFlo>uYIQqr^`USFsj{NLITwOVU)w^n|I*$$U`UELa z72V$XxGK97JrrWT*KgkJfxartxMK;SxL~wU01O!Mx-SYM(fC7>Q$DslHi(ZT-t~EF= z9_}>|4JIaJ@YeGJu?vLpp7zVcj23CKJZV(_7S6CbbQ&=pHmd|pm@KFYQ9PyQsO+>9 z6-NuiQn--Guz-mf;4hzGdF(V}NjysT2S?A>6e$FS_;Wf3vUf&y67^?{WrHxa3_m*!oGAys;hhqi;jg)_%$(Q!T^G~XD{P@^N zZPLXd;#ttf{$YrUoBVNFKhI;$BDCP7pfBJlDp27i;~qpCrBUJOtC7?Q*hyvNL{*@J zp}|H*kZ8@azja{w__Qu<`!7YHMvWj(g)jS~s0uC;oPkYth;+8-=b9GfND`BkPxNs} zvzprPu|ev%P_c5y@H~=q_Jb}{#c?qX5}b80d)(Pau=CEF&1#lGcOA@A0UuagO%QWv z{{Ej>0O@qax8xQ0*}_oTRvshJy|^f91UM>UO};T;SXIbY>5$Hfwz;i1tOv&{npE`+ zhs97T{+z8gFr7^)!=hoO(nJ{-CMk|2Hr%3yhKmj#3_Y5+#rqee?-LPJ^XYeh=NEjX zAPC!Ib9P6|`>W;h%MXix`_W_u0twD~%SYnYh+tko1r^};>IaN}d>;qDZw8rSws2N?$9MGSPbS2IX&>i*4$)meS0WvXyjGT70 z-(?Siz&gq>vbt9xKeGUTF+pabXOPWu`s&qJcgjDgz}xMs2=aqj$~rjb2DVgg2iVJl z8N6=(`$ew98sJ~`cVZ0i*BHxh^{!z1FaLZ?q)ZU?D{0ML^7 zj8mc?^^WD};FDha&p@wWQZFxF!{pwDT8EonB`1xCa!)xbA58M!2>2*Czp86P?Xtvo z$C?R0dqYUs%zvB@J&bP+z~#8OxrJtwmO{=UQduqs&(Hu!t9M~DS0r7iIcWpg5%hZ# zuQ9d^STrO--=_TO6Vyv|FiqEwrYzF9MF4);WeDJNuS%s()d)UKM(jRaY~z6sM%n6R?>ZFf}%OlfVIK z;RwKYZ%bI({GMWo7m{P0nxHhm!kmq{6~T3|Lfz6l16p`7EHXP6Wd){cM6- z^@r;NJDN`CvA>gEduMKdXwtIJOFTeZ6}p)LNK6kpwVEmJsk&ZaR41;is6<8?U^2nS zP$F@qQWf%VCGGxB59(XveSqyuTuYSO@VXb?LJIUP*3yS00|CkClM2^LR+ zPlNRgF7x*%M&SQnu$|G|_#_?(f9Y_t>_f!kT_-zWy|AqWwCxMdkb^WC0Avi8pGBoQ z;l5A~5#Zx3l0;QF%jo-r!3-`ad%(A6jY8u6$v`RcV%)RqgK1tT_WOKh$Ia)r zvX4vH&5-c{t?Mz*w1p#YT{e4v<%x0Ogw`jEZIs~mqCEa|kYPn+oK`^y(OLKYsr$t! z%m*qdWZXy96b>7vMt#$P&HKKq>S!HEhWUr79cR%kwB6P8{UV zY29sI&qwPrNbOHnl#5@>PL4Wh=iR>fX|!qwz9+X zIcEL`A6Q8@GQW{kr>-%dw{c*pi^N5nh zD*~4z$8?phRHo2|(>sU#QL?SXt5XSw$abl-yTEz<%?V`vqlwB4ztRWg)?|)vicud@ zcB2Gkrsw3cCiA>84|)CO)r?03KTW9H%&2=IUyeMRSZvjDH{@R@5zH}uJe4EI#*u#u z5T#UIIP0=MB+$Kk$9CO%(O=l#KVQoGWR|QV@JH@0p0UAoGfdjh-R}~?)8{sYfa{mv zI~3jztQV8(W`&E}KiUJMxKUh++k@K)?fV%|tuC*07;j8!Yj$Ga(Jf}Bn{}Db`%_-p z5*K#=T;p+mI@k?kskS32hU?_rs~q$m(yf)T&=gC)R?2yiZ{Oqaw3tl_EfbIM&$Ugc zwy~q7M)lT)&#@qh=|!WG?-sPD8ZPJN>y2}lz3+)5T8`&8mb<9}eG5WKAF}FC2LJxu z&^tM`WHCg9O*?Cb@@cMBMCLf04$-}JjGkw+`g6d{^$FZ3b?=QZ%Nq98{U1raS4;uT(tfDsk-l{5 z=$+ayLH&2bv9-T{jUaKWD~Af)7bm+3YpYxx91aY0Qc@~qLn`;g@{KinPwFN76=;^J zS8C)hI4n}Ts+}sjET_|G_HqA_Jy{XGNQyhR{OZz|S5{)2ZM)`AX4VN4mSX%4VQq=y zA#u6Jeq*fe$e?&jCT&gN?pygAZ=Ff4-s4T}GuS27kojiC1QlPvsa$&_EPtE&^EGnB zrgLcf=7;b=T77#aEZ>9yXGo5aU9jn?Q<6)+kGHi2l59hMjaiy4pKL%Pf6wJhHIHC_ zFF(=A%yd0VKcpra9;zilFpHpZ_(4D z`~0@f&R!9zP4kQrSjwSwf3T7x#@hDBWnLGXq|Q+{=s%C>a_5w46!O6SXtFfjkF>AZ z*pFM|rO83!m?-OYqihiiezR`FX2;JDHaQPglO&wL*21Y3TYUo#-W)qJHbFh849lUU zb~$rdT?Lents40ZhNFxv@tQhjp>3*sun^371~G8`M^js~Ri`U--s(nmK?%rrLe_ox zauR%hFJ8R(#^&7T6bCJd-kKgb!l}AAKMuyfogq()+6r9oQgqE+=JFAh3`QbVVgJ5; zq0{cPLf3em_QRap*x!AVx*dhC)=1}@MNL-*i!*!1DCKwCNt7AIC1j|a!ebr1*1LWA z+U_R29)-^DZ!c)Y5bwV!j^Opg&ItA|9tbEUf6oqfKVL1ibMHmnP^X(qSDAxlueXP+ zlNqQeH(Df>lvp(4Wi6p~8W)>conScQ`zl=rh}Xe<+V%Z~rhuP+*Y!Jmqh$lcKG?tT zX~QlmruX8-i&iC$FC?76=zK`k?_JiF*MDHtz@xBb=i%svW8!-5WL_CKkL1(uZJw&b z+qJ*X$L%LHzvjML!ICT8e{_<~z80d9*lG#hPztw+Cw=wZySZf|Cwj8$awu@w#U7@_$kpCrzU> zh#mJXRlkR|Tm6RV*~|8GIi{hyGKm+Q98y2}prbZkJnZ*CSxW7SXZz50m2BR{>X9D0 zWJ-WGGy;t~LoU(?;V?>R4Ph-thK48%hVV5~Bztz&BT`h|3am}$Zf=EusG!39gPs`{ zTMdqyjH;Px>z2w9m9S-Kn3LzuU7hMJr)B8HE`Xor?&6dLE%wm&Nh}hcNc$c#b=1PAIxsVot5xe+a#1^H>Hs@_%ZuxA;!|3 z{85{n5-{&cN?|6wezp4$qgdQ&w|$NYrTmg)y_nD3rew7-QxC6(rOl|HGF{J5gRqgX z`rwPc74Q1*htW-lN)<-1i ze$8Lw+fZlhOiXgtg6AVKi;Tick%v&+l_8y?yk8nC!^PrOl}vPV$fPXcy}#^7jnr02 zdQy72GcKiA+{MIR>A?OO)}0HX6IlayPE`h$9B}qa%WuH-e_^=8fAS~ zmr*zey(?F!)gj!bY#cplAZSKC^5C!9=6QoY=urLSCWbsZ#l8UT^4#8WgVef@hvV0%hF1^q4bB{r-=yl zO`N;_TJiW-Vc~&3_N;?~>Wa1_XHIhK(!4uT*1KoMQrKx=kWWwxEXJ;J2MuB{OVb5E zeq3u#)zn<5CkLv~j=~v%fOB2@#bL=j@bqLItZe*Tc-Pf;q5H$HdZt$@q z1LtlYmy|S!aU-$2+U(!dK6>5!iq0jxM_r!i687-AUGSOOSN#VUvivcOww#L2Kt@g#p z%=U@h-nIC`KkZD8ufCbC%t$`tM!Uj|2qs`APPn$7GQIFh7xcu_?Mo+%6pp$d&B==V zb7406rl5NHtxO#~e+aEEnb1XG^x*;O*tLPgpqj)vJTvIJk-F(8X6KvW63N zN4_G-cc(A2wr^a2VVzRs%E`^`u?-E;1oGwUk2C_+I)wKOF|XB?-#g!Ss)#BZj|+Od zeHUfHpm$=#3btG<9f54 zyCuxR#S$X6F6FqhvU)IYt_AHN&IM#R;NEv+<{|DSIK8)@4ahiQYELM|xm*kjq@Fut zWr`ArYClPw40nmFsa0S%yN?NOM9#du!gi-vBm=!^-yeuiFOZDPA_WLn+_m9MF$ zxAs|xM$7+M>tkA##Y||s&=Ma>QsCAK#BY2cIocqBP)b%{$Q^z{j~4q9IBNQlv9-DS z^!3QM4cKm?m&=9K{tL8kYW`$3s zXv4-%rN6H1(CmKO=Rm$*WPaV0IlSBa=>_G)i}`q>+GnnK#`CjhV>Q*Vi|*v9WPHEu}ZdsfQe89br^^|!3*cmaOmQ4?|=({#1YaaCZ{8Kz?6S|u>R{r$cQ{uX% zg*!nuczCypCg(}wQhTA*l*^-}q{BiYA}ny2_Jd)y`NoDVJAK?q?5pvuEJ}7%FTvM^ zF_WJDr{%S40XAH-enQmvWp3b~85tQBMb(^!_?IsU9UW%$`DN{>$b)BVnv;|%%Je=E zlS2}fa402uQV@Vs`hR|Ym`r2&Dl01&f=z!q*?(Z0Ok#BOPk&S)1mKHxW z!N(IIBp-V#y|dv6>OqU4t0IRX;w8%8c^=pT@Bnl-_s6A+LDxPqzI0&+juh zR4!}j*XBK8{ehX&OYXs}82USZy87Z15pILx^vE+cI(v)D?Bua|&O`ny#l?8{zQCxE zVgB35xOwYx$)b|Yt%U>T#_D62o*$k74#>D@@T}JSk2LoRu(11(Fl?_X{~162<;B=& zYdjbT!;5B+#olP}IwNxy^x&RX}I$bxS z)U!UesN^>&@7b9wKji4GJUKwJ1`J6m@CS0CHgJUc3o{a_nBhEbeT{@E1=>r_KPvL2 z3?K#)wQr~#ang(`6Z1{W$hiA`0SxRD)!b8*nC>V<=r5Ey1?j$YO0~Bi5f^x7Q&oXQLzHC)&cHvqlRxUz!B)&Z)xNCWsg8dN5=vnF2dZP zmQhXPUb7bbQ(%w1XtMC$%-jtzB@D8v%iq1Xr4}}`hiP0Nie^Viz=-XX^sJQ0!w^#dQ`ID8?*+oxF6Glhj6eD+Al&a}uL!C``ns6J-fYW-WY^{MAC6 z>r({0tX<)gy^_uVIpWkCW7EOj&w_BJ$;5Wu)O>Ck5KzG%4!(en(MUC>*?1c|#-vS7 zPU`FUDL_y3@sgF6Zfxr5tnj=sHacp-ebr!$nI0tD87BO261w5w5QoS6o0SEskX~|n z#)p8M#BP#rb*zs$-a`s1hyI+V-?I&W0~8+1^hq?BTU3bzy2q1cjqC?`!Y^22PZ)MUpIHDn2(w-?)xy>`1*E@Ja&S{)qdDXY2|fNS zo&C@*bJ+t>l7@*riHcG*SG;g~O1$+iX|uJayPvK{~2AXeob zkg;Nb$}T8*)-ZTi+GzZ_h@ugcgOV2CJ%t@u$MrZYmknA zDXir225!DE0j0Qa?FscKcKNXIv}xms7lb@-BB$IbPl(*oAuqDTWXQ!+qSvW=;h>dA$B=1k>((BkuknwuP;=7rFReK<~)9{BJA2Z zv*ZE@2Fx<>dSQ`2cSZkUnoc;gT~|ynB%NRK133YSS#S)Q{k#R4pg(`vTiHVC<+2cn z+W3?dQBKwH_Kc@%*YbN?6DD=h`L7r!<>lplzKb6_cFboDhQ9)kZS>5-cOEGLIwX4< zea=(g%F4=dV~^id&!d_Xda#ZHO8mvQ5mOl3&F@D*826O9CdS0XP>X|4yx&{-FMYDh zzg2xHCnMuR5os|2X3Tu*kK=P7!x3P-Gi$h!N!JY!WCI0wFBwM`k-z;+xgFJy6?N5Q zYTv${WngUV-=d69O`XXyPMwB&RNFGiCTObkpKtj5cUyrSc|gw#^k9oJ9bz*B7&MHh z5fNx$dl~5KZ|7Cr9Uyk|GvG`$w`Dn4!=K%08NM14qLFHF`LYMh1t_j*>^J)QPk0rB z@X8l2s9;#s&7WHzmhio)$tU7~OkStAbXhW7AU`$l6jfu`EXP~#=Xy(}2D`P{D_LN3 z2Mc-nd zSYjX5+`^;B`|K^b8Ch8>degPLG<{l>6#@7nSq~|-f=E(_i)lxFZiy3ozDMY)K^0zQuj<}QT16I4FtP5oTJ?BDprL=ns+ zoSA^D;_>5kApkb}my#-S?ZR8y2G;3$LBA}u{RZvRH#=0T!#z_^TA6EXNglR$+&zDm z8W$U9K1us$s=sbYzt>Jeaw6&F9mgxJ7X(!mZDm?=)YiM`n8zyb$xCcZJI7jF4wjOU zQ6Kj`(u$>qdK*<%RyucN=#_fYMb!dKK79Cq!lGoQq|5+t9^cC5@}M%z^&>-=$|oXz z-gKS!!N{;nn+fAd6kxjS6BEPru|Q}y)YqGW?2ggN_}yVvDlY@~AbwhC|8wY^4X9>?O^EC~6*0f6dSTP; zBawd~j2^%7mO8!IHKD><5qaqC+arwlw1@gF$SpZs{GfyY!Xy2EUwjtZ+QpVyhv>|S zTIy5TrE~N$Fh?#ZAFuhDG&;Y9i77?gtEJL{TuC;CR?K4p2$Ml3i&SO{yJPY0f(XcF z)#pj*O;+xj9`l?Po3xDx_R-w}c~p8)Ih$sEFe&z_e#lDUIt0_CO?f}Q%Wj{=ppJtQ zy&Yv9hWojuQ9qXG!TLpgvN)gb=O8{)JnSqQ|YJN(}W_>X+Se-HZaziIz%)Bm>V mzc~*4w@dx!yVS@U;t@$HJ;|*Wexe0|(7R}Kp-}tp2mb?FWA`2a literal 28703 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 diff --git a/test/goldens/screens/settings_currencies/settings_currencies_golden_test.dart b/test/goldens/screens/settings_currencies/settings_currencies_golden_test.dart index 6d22abeae..8d4475c21 100644 --- a/test/goldens/screens/settings_currencies/settings_currencies_golden_test.dart +++ b/test/goldens/screens/settings_currencies/settings_currencies_golden_test.dart @@ -26,6 +26,7 @@ void main() { when(() => settingsRepo.language).thenReturn('en'); when(() => settingsRepo.currency).thenReturn('CHF'); when(() => settingsRepo.networkMode).thenReturn(NetworkMode.mainnet); + when(() => settingsRepo.insiderFeaturesUnlocked).thenReturn(false); when(() => fiatRepo.getAll()) .thenAnswer((_) async => const [Currency.chf, Currency.eur]); settingsBloc = SettingsBloc(settingsRepo, () async {}); diff --git a/test/goldens/screens/settings_languages/settings_languages_golden_test.dart b/test/goldens/screens/settings_languages/settings_languages_golden_test.dart index ef2658bb5..25b8dc2d2 100644 --- a/test/goldens/screens/settings_languages/settings_languages_golden_test.dart +++ b/test/goldens/screens/settings_languages/settings_languages_golden_test.dart @@ -27,6 +27,7 @@ void main() { when(() => settingsRepo.language).thenReturn('en'); when(() => settingsRepo.currency).thenReturn('CHF'); when(() => settingsRepo.networkMode).thenReturn(NetworkMode.mainnet); + when(() => settingsRepo.insiderFeaturesUnlocked).thenReturn(false); when(() => langRepo.getEnabled()) .thenAnswer((_) async => const [Language.en, Language.de]); settingsBloc = SettingsBloc(settingsRepo, () async {}); diff --git a/test/helper/layout_assertions.dart b/test/helper/layout_assertions.dart index 4bd93030e..1e421cda8 100644 --- a/test/helper/layout_assertions.dart +++ b/test/helper/layout_assertions.dart @@ -62,7 +62,14 @@ Future expectFullyTappable( ); final box = tester.renderObject(finder); - final rect = box.localToGlobal(Offset.zero) & box.size; + // Map BOTH corners through the render transform: `localToGlobal(zero) & + // size` appends the untransformed layout size, which overstates the visual + // rect for scaled targets (e.g. inside a FittedBox) and fails containment + // on content that visibly fits. For untransformed targets both forms agree. + final rect = Rect.fromPoints( + box.localToGlobal(Offset.zero), + box.localToGlobal(box.size.bottomRight(Offset.zero)), + ); expect( rect.width, @@ -77,7 +84,10 @@ Future expectFullyTappable( expect(within, findsOneWidget, reason: 'within parent not found'); final parentBox = tester.renderObject(within); - final parentRect = parentBox.localToGlobal(Offset.zero) & parentBox.size; + final parentRect = Rect.fromPoints( + parentBox.localToGlobal(Offset.zero), + parentBox.localToGlobal(parentBox.size.bottomRight(Offset.zero)), + ); // Allow 1px float tolerance. final inflated = parentRect.inflate(1); expect( diff --git a/test/packages/repository/settings_repository_test.dart b/test/packages/repository/settings_repository_test.dart index fc5907b60..216285525 100644 --- a/test/packages/repository/settings_repository_test.dart +++ b/test/packages/repository/settings_repository_test.dart @@ -122,6 +122,32 @@ void main() { }); }); + group('insiderFeaturesUnlocked', () { + test('defaults to false when not stored', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.insiderFeaturesUnlocked, isFalse); + }); + + test('returns the stored value when set', () async { + SharedPreferences.setMockInitialValues({'insiderFeaturesUnlocked': true}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + expect(repo.insiderFeaturesUnlocked, isTrue); + }); + + test('setter persists', () async { + SharedPreferences.setMockInitialValues({}); + final repo = SettingsRepository(await SharedPreferences.getInstance()); + + repo.insiderFeaturesUnlocked = true; + await Future.delayed(Duration.zero); + + expect(repo.insiderFeaturesUnlocked, isTrue); + }); + }); + group('networkMode', () { test('defaults to mainnet when no value is stored', () async { SharedPreferences.setMockInitialValues({}); diff --git a/test/screens/dashboard/dashboard_responsive_matrix_test.dart b/test/screens/dashboard/dashboard_responsive_matrix_test.dart index 6fd7a62e9..f7bd104d6 100644 --- a/test/screens/dashboard/dashboard_responsive_matrix_test.dart +++ b/test/screens/dashboard/dashboard_responsive_matrix_test.dart @@ -6,6 +6,12 @@ // inside the height-bounded `Expanded > Stack` host (dashboard_page.dart) // overflowed already at default text scale with one pending transaction, // painting the CTA outside the parent's hit-testable region. +// +// A second matrix group below covers the same tappability guarantee for the +// four DashboardActions buttons (Buy/Sell/Pay/Send) in a standalone host — +// pre-existing overflow debt in the surrounding dashboard sections (e.g. +// cash_holding_box.dart) is tracked separately as issue #887 and out of +// scope for that check. import 'package:bloc_test/bloc_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -21,6 +27,7 @@ import 'package:realunit_wallet/screens/dashboard/bloc/balance_cubit.dart'; import 'package:realunit_wallet/screens/dashboard/bloc/dashboard_bloc.dart'; import 'package:realunit_wallet/screens/dashboard/bloc/pending_transactions_cubit.dart'; import 'package:realunit_wallet/screens/dashboard/dashboard_page.dart'; +import 'package:realunit_wallet/screens/dashboard/widgets/sections/dashboard_actions.dart'; import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; import 'package:realunit_wallet/setup/routing/routes/app_routes.dart'; import 'package:realunit_wallet/styles/currency.dart'; @@ -92,13 +99,26 @@ void main() { child: const DashboardView(), ); - // A minimal two-route stack: '/' hosts the dashboard, '/buy' is a marker - // page so a real `context.pushNamed(AppRoutes.buy)` resolves instead of - // throwing (the CTA's actual, unmocked navigation call). - GoRouter buildRouter() => GoRouter( + Widget buildActionsHost() => BlocProvider.value( + value: settingsBloc, + child: const Scaffold( + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 20), + child: DashboardActions(), + ), + ), + ); + + // A minimal five-route stack: '/' hosts either the full dashboard or the + // standalone DashboardActions host (see [homeBuilder]); '/buy', '/sell', + // '/pay' and '/send' are marker pages so the four action buttons' real, + // unmocked `context.pushNamed(...)` calls resolve instead of throwing. + GoRouter buildRouter({ + Widget Function(BuildContext, GoRouterState)? homeBuilder, + }) => GoRouter( initialLocation: '/', routes: [ - GoRoute(path: '/', builder: (_, _) => buildDashboard()), + GoRoute(path: '/', builder: homeBuilder ?? (_, _) => buildDashboard()), GoRoute( name: AppRoutes.buy, path: '/buy', @@ -106,6 +126,27 @@ void main() { body: Center(child: Text('buy-page-marker')), ), ), + GoRoute( + name: AppRoutes.sell, + path: '/sell', + builder: (_, _) => const Scaffold( + body: Center(child: Text('sell-page-marker')), + ), + ), + GoRoute( + name: AppRoutes.pay, + path: '/pay', + builder: (_, _) => const Scaffold( + body: Center(child: Text('pay-page-marker')), + ), + ), + GoRoute( + name: AppRoutes.send, + path: '/send', + builder: (_, _) => const Scaffold( + body: Center(child: Text('send-page-marker')), + ), + ), ], ); @@ -141,6 +182,34 @@ void main() { await tester.pump(const Duration(milliseconds: 100)); } + Future pumpActions(WidgetTester tester, MatrixCell cell) async { + final router = buildRouter(homeBuilder: (_, _) => buildActionsHost()); + addTearDown(router.dispose); + + await tester.binding.setSurfaceSize(cell.device.size); + addTearDown(() => tester.binding.setSurfaceSize(null)); + + await tester.pumpWidget( + MediaQuery( + data: cell.mediaQuery, + child: MaterialApp.router( + routerConfig: router, + theme: realUnitTheme, + locale: const Locale('de'), + localizationsDelegates: const [ + S.delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: S.delegate.supportedLocales, + ), + ), + ); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 100)); + } + group('DashboardView responsive matrix - empty balance, buy CTA reachable ' '(full device x textScale)', () { for (final cell in kFullResponsiveMatrix) { @@ -172,6 +241,60 @@ void main() { } }); + group( + 'DashboardActions responsive matrix - insider unlocked, all four actions ' + 'tappable (full device x textScale)', + () { + for (final cell in kFullResponsiveMatrix) { + testWidgets(cell.id, (tester) async { + await withTargetPlatform(cell.device.platform, () async { + when(() => settingsBloc.state) + .thenReturn(const SettingsState(insiderFeaturesUnlocked: true)); + + await expectNoLayoutOverflow( + tester, + () async { + await pumpActions(tester, cell); + }, + reason: 'overflow on insider unlocked / ${cell.label}', + ); + + await expectFullyTappable( + tester, + find.text(S.current.buy), + within: find.byType(DashboardActions), + reason: '${cell.label}: buy button not tappable', + ); + + await pumpActions(tester, cell); + await expectFullyTappable( + tester, + find.text(S.current.sell), + within: find.byType(DashboardActions), + reason: '${cell.label}: sell button not tappable', + ); + + await pumpActions(tester, cell); + await expectFullyTappable( + tester, + find.text(S.current.pay), + within: find.byType(DashboardActions), + reason: '${cell.label}: pay button not tappable', + ); + + await pumpActions(tester, cell); + await expectFullyTappable( + tester, + find.text(S.current.send), + within: find.byType(DashboardActions), + reason: '${cell.label}: send button not tappable', + ); + }); + }); + } + }, + ); + // Focused regression: the exact reported failure mode (empty balance, one // waitingForPayment pending tx, default text scale) must invoke the real // navigation via a tap - not just have a non-null onPressed. The old code diff --git a/test/screens/dashboard/widgets/sections/dashboard_actions_test.dart b/test/screens/dashboard/widgets/sections/dashboard_actions_test.dart index 0192a2e36..2c0aa6f86 100644 --- a/test/screens/dashboard/widgets/sections/dashboard_actions_test.dart +++ b/test/screens/dashboard/widgets/sections/dashboard_actions_test.dart @@ -1,22 +1,29 @@ +import 'dart:async'; + +import 'package:bloc_test/bloc_test.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:realunit_wallet/generated/i18n.dart'; import 'package:realunit_wallet/screens/dashboard/widgets/sections/dashboard_actions.dart'; +import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; import 'package:realunit_wallet/setup/routing/routes/app_routes.dart'; import 'package:realunit_wallet/widgets/action_button.dart'; +import '../../../../helper/helper.dart'; + void main() { late List pushedRoutes; + late MockSettingsBloc settingsBloc; setUp(() { pushedRoutes = []; + settingsBloc = MockSettingsBloc(); }); - // Routes the four action buttons can push. Each target records the pushed - // route name so the `onPressed` closures are both executed and asserted, - // instead of only painted. GoRouter buildRouter() { GoRoute target(String name, String path) => GoRoute( name: name, @@ -32,7 +39,12 @@ void main() { routes: [ GoRoute( path: '/', - builder: (_, _) => const Scaffold(body: DashboardActions()), + builder: (_, _) => Scaffold( + body: BlocProvider.value( + value: settingsBloc, + child: const DashboardActions(), + ), + ), ), target(AppRoutes.buy, '/buy'), target(AppRoutes.sell, '/sell'), @@ -48,76 +60,130 @@ void main() { await tester.pumpWidget( MaterialApp.router( routerConfig: router, - localizationsDelegates: const [ - S.delegate, - GlobalMaterialLocalizations.delegate, - ], + localizationsDelegates: const [S.delegate, GlobalMaterialLocalizations.delegate], supportedLocales: S.delegate.supportedLocales, ), ); await tester.pumpAndSettle(); } - Finder actionButtonByLabel(String label) => find.byWidgetPredicate( - (w) => w is ActionButton && w.label == label, - ); + Finder actionButtonByLabel(String label) => + find.byWidgetPredicate((w) => w is ActionButton && w.label == label); group('$DashboardActions', () { - testWidgets('renders the buy, sell, pay and send action buttons', (tester) async { - await pumpActions(tester); - - expect(actionButtonByLabel(S.current.buy), findsOneWidget); - expect(actionButtonByLabel(S.current.sell), findsOneWidget); - expect(actionButtonByLabel(S.current.pay), findsOneWidget); - expect(actionButtonByLabel(S.current.send), findsOneWidget); - // Each button is laid out inside an Expanded so the row divides the - // available width into four equal slots. - expect(find.byType(Expanded), findsNWidgets(4)); + group('locked (default)', () { + setUp(() { + when(() => settingsBloc.state).thenReturn(const SettingsState()); + }); + + testWidgets('renders only the buy and sell action buttons', (tester) async { + await pumpActions(tester); + + expect(actionButtonByLabel(S.current.buy), findsOneWidget); + expect(actionButtonByLabel(S.current.sell), findsOneWidget); + expect(actionButtonByLabel(S.current.pay), findsNothing); + expect(actionButtonByLabel(S.current.send), findsNothing); + expect(find.byType(Expanded), findsNWidgets(2)); + }); + + testWidgets('buy button pushes the buy route', (tester) async { + await pumpActions(tester); + await tester.tap(actionButtonByLabel(S.current.buy)); + await tester.pumpAndSettle(); + expect(pushedRoutes, [AppRoutes.buy]); + }); + + testWidgets('sell button pushes the sell route', (tester) async { + await pumpActions(tester); + await tester.tap(actionButtonByLabel(S.current.sell)); + await tester.pumpAndSettle(); + expect(pushedRoutes, [AppRoutes.sell]); + }); }); - testWidgets('renders the expected icons for each action', (tester) async { - await pumpActions(tester); - - expect(find.byIcon(Icons.add_circle_rounded), findsOneWidget); - expect(find.byIcon(Icons.do_not_disturb_on_rounded), findsOneWidget); - expect(find.byIcon(Icons.qr_code_scanner_rounded), findsOneWidget); - expect(find.byIcon(Icons.send_rounded), findsOneWidget); + group('unlocked', () { + setUp(() { + when(() => settingsBloc.state) + .thenReturn(const SettingsState(insiderFeaturesUnlocked: true)); + }); + + testWidgets('renders the buy, sell, pay and send action buttons', (tester) async { + await pumpActions(tester); + + expect(actionButtonByLabel(S.current.buy), findsOneWidget); + expect(actionButtonByLabel(S.current.sell), findsOneWidget); + expect(actionButtonByLabel(S.current.pay), findsOneWidget); + expect(actionButtonByLabel(S.current.send), findsOneWidget); + expect(find.byType(Expanded), findsNWidgets(4)); + }); + + testWidgets('renders the expected icons for each action', (tester) async { + await pumpActions(tester); + + expect(find.byIcon(Icons.add_circle_rounded), findsOneWidget); + expect(find.byIcon(Icons.do_not_disturb_on_rounded), findsOneWidget); + expect(find.byIcon(Icons.qr_code_scanner_rounded), findsOneWidget); + expect(find.byIcon(Icons.send_rounded), findsOneWidget); + }); + + testWidgets('buy button pushes the buy route', (tester) async { + await pumpActions(tester); + await tester.tap(actionButtonByLabel(S.current.buy)); + await tester.pumpAndSettle(); + expect(pushedRoutes, [AppRoutes.buy]); + }); + + testWidgets('sell button pushes the sell route', (tester) async { + await pumpActions(tester); + await tester.tap(actionButtonByLabel(S.current.sell)); + await tester.pumpAndSettle(); + expect(pushedRoutes, [AppRoutes.sell]); + }); + + testWidgets('pay button pushes the pay route', (tester) async { + await pumpActions(tester); + await tester.tap(actionButtonByLabel(S.current.pay)); + await tester.pumpAndSettle(); + expect(pushedRoutes, [AppRoutes.pay]); + }); + + testWidgets('send button pushes the send route', (tester) async { + await pumpActions(tester); + await tester.tap(actionButtonByLabel(S.current.send)); + await tester.pumpAndSettle(); + expect(pushedRoutes, [AppRoutes.send]); + }); }); - testWidgets('buy button pushes the buy route', (tester) async { - await pumpActions(tester); - - await tester.tap(actionButtonByLabel(S.current.buy)); - await tester.pumpAndSettle(); - - expect(pushedRoutes, [AppRoutes.buy]); - }); - - testWidgets('sell button pushes the sell route', (tester) async { - await pumpActions(tester); - - await tester.tap(actionButtonByLabel(S.current.sell)); - await tester.pumpAndSettle(); - - expect(pushedRoutes, [AppRoutes.sell]); - }); - - testWidgets('pay button pushes the pay route', (tester) async { - await pumpActions(tester); - - await tester.tap(actionButtonByLabel(S.current.pay)); - await tester.pumpAndSettle(); - - expect(pushedRoutes, [AppRoutes.pay]); - }); - - testWidgets('send button pushes the send route', (tester) async { - await pumpActions(tester); - - await tester.tap(actionButtonByLabel(S.current.send)); - await tester.pumpAndSettle(); - - expect(pushedRoutes, [AppRoutes.send]); + group('transitions', () { + testWidgets( + 'rebuilds from locked to unlocked when the bloc emits without a remount ' + '(pins context.watch, a regression to context.read would not react)', + (tester) async { + final controller = StreamController(); + addTearDown(controller.close); + whenListen( + settingsBloc, + controller.stream, + initialState: const SettingsState(), + ); + + await pumpActions(tester); + + expect(actionButtonByLabel(S.current.pay), findsNothing); + expect(actionButtonByLabel(S.current.send), findsNothing); + + controller.add(const SettingsState(insiderFeaturesUnlocked: true)); + // Two pumps: the first delivers the stream event (async broadcast + // delivery updates the mock's state and marks the element dirty), + // the second builds the frame that shows the unlocked buttons. + await tester.pump(); + await tester.pump(); + + expect(actionButtonByLabel(S.current.pay), findsOneWidget); + expect(actionButtonByLabel(S.current.send), findsOneWidget); + }, + ); }); }); } diff --git a/test/screens/settings/settings_bloc_test.dart b/test/screens/settings/settings_bloc_test.dart index c84bd2859..525cff27e 100644 --- a/test/screens/settings/settings_bloc_test.dart +++ b/test/screens/settings/settings_bloc_test.dart @@ -20,6 +20,7 @@ void main() { when(() => repo.language).thenReturn('en'); when(() => repo.currency).thenReturn('CHF'); when(() => repo.networkMode).thenReturn(NetworkMode.mainnet); + when(() => repo.insiderFeaturesUnlocked).thenReturn(false); }); SettingsBloc build() => SettingsBloc( @@ -34,6 +35,7 @@ void main() { when(() => repo.language).thenReturn('de'); when(() => repo.currency).thenReturn('EUR'); when(() => repo.networkMode).thenReturn(NetworkMode.testnet); + when(() => repo.insiderFeaturesUnlocked).thenReturn(true); final bloc = build(); @@ -41,6 +43,7 @@ void main() { expect(bloc.state.currency, Currency.eur); expect(bloc.state.networkMode, NetworkMode.testnet); expect(bloc.state.hideAmounts, isFalse); + expect(bloc.state.insiderFeaturesUnlocked, isTrue); }); blocTest( @@ -123,5 +126,15 @@ void main() { expect(bloc.state.hideAmounts, isTrue); verifyNever(() => repo.language = any()); // proxy: no repo call at all }); + + blocTest( + 'UnlockInsiderFeaturesEvent persists to the repo and emits insiderFeaturesUnlocked=true', + build: build, + act: (bloc) => bloc.add(const UnlockInsiderFeaturesEvent()), + verify: (bloc) { + expect(bloc.state.insiderFeaturesUnlocked, isTrue); + verify(() => repo.insiderFeaturesUnlocked = true).called(1); + }, + ); }); } diff --git a/test/screens/settings/settings_event_test.dart b/test/screens/settings/settings_event_test.dart index def20d394..72015be82 100644 --- a/test/screens/settings/settings_event_test.dart +++ b/test/screens/settings/settings_event_test.dart @@ -82,6 +82,18 @@ void main() { }); }); + group('UnlockInsiderFeaturesEvent', () { + test('all instances are equal (singleton-style event, no payload)', () { + const a = UnlockInsiderFeaturesEvent(); + const b = UnlockInsiderFeaturesEvent(); + + expect(a, equals(b)); + expect(a.hashCode, b.hashCode); + // Inherits the empty `props` list from the sealed base class. + expect(a.props, isEmpty); + }); + }); + group('SettingsEvent (cross-subclass identity)', () { test('different subclasses are not equal even when props happen to match', () { // Two payload-less events from different subclasses must still compare @@ -105,16 +117,19 @@ void main() { final cur = SetCurrencyEvent(Currency.eur); final net = SetNetworkModeEvent(NetworkMode.mainnet); final toggle = ToggleHideAmountEvent(); + final unlock = UnlockInsiderFeaturesEvent(); expect(lang, equals(const SetLanguageEvent(Language.de))); expect(cur, equals(const SetCurrencyEvent(Currency.eur))); expect(net, equals(const SetNetworkModeEvent(NetworkMode.mainnet))); expect(toggle, equals(const ToggleHideAmountEvent())); + expect(unlock, equals(const UnlockInsiderFeaturesEvent())); expect(lang.props, [Language.de]); expect(cur.props, [Currency.eur]); expect(net.props, [NetworkMode.mainnet]); expect(toggle.props, isEmpty); + expect(unlock.props, isEmpty); }); }); } diff --git a/test/screens/settings/widgets/settings_version_unlock_test.dart b/test/screens/settings/widgets/settings_version_unlock_test.dart new file mode 100644 index 000000000..a29d4a3b5 --- /dev/null +++ b/test/screens/settings/widgets/settings_version_unlock_test.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/generated/i18n.dart'; +import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; +import 'package:realunit_wallet/screens/settings/widgets/settings_version_unlock.dart'; + +import '../../../helper/helper.dart'; + +void main() { + late MockSettingsBloc settingsBloc; + + setUpAll(() { + GetIt.instance.registerSingleton(MockSettingsBloc()); + }); + + tearDownAll(() async { + await GetIt.instance.reset(); + }); + + setUp(() { + settingsBloc = MockSettingsBloc(); + when(() => settingsBloc.state).thenReturn(const SettingsState()); + }); + + Widget host() { + // Re-register the per-test mock into GetIt so getIt() inside the + // widget picks up the state defined in setUp(). setUpAll() only registers once. + if (GetIt.instance.isRegistered()) { + GetIt.instance.unregister(); + } + GetIt.instance.registerSingleton(settingsBloc); + + return const Scaffold( + body: SettingsVersionUnlock(releaseTag: '1.2.3'), + ); + } + + group('$SettingsVersionUnlock', () { + testWidgets('displays the version text', (tester) async { + await tester.pumpApp(host()); + + expect(find.textContaining('1.2.3'), findsOneWidget); + }); + + testWidgets('6 taps: no event dispatched, no SnackBar shown', (tester) async { + await tester.pumpApp(host()); + + for (var i = 0; i < 6; i++) { + await tester.tap(find.byType(SettingsVersionUnlock)); + await tester.pump(); + } + + verifyNever(() => settingsBloc.add(const UnlockInsiderFeaturesEvent())); + expect(find.byType(SnackBar), findsNothing); + }); + + testWidgets( + '7th tap dispatches UnlockInsiderFeaturesEvent exactly once and shows the SnackBar', + (tester) async { + await tester.pumpApp(host()); + + for (var i = 0; i < 7; i++) { + await tester.tap(find.byType(SettingsVersionUnlock)); + await tester.pump(); + } + + verify(() => settingsBloc.add(const UnlockInsiderFeaturesEvent())).called(1); + expect(find.byType(SnackBar), findsOneWidget); + expect(find.text(S.current.settingsInsiderFeaturesUnlocked), findsOneWidget); + }, + ); + + testWidgets('already unlocked: taps trigger neither event nor SnackBar', (tester) async { + when(() => settingsBloc.state) + .thenReturn(const SettingsState(insiderFeaturesUnlocked: true)); + + await tester.pumpApp(host()); + + for (var i = 0; i < 10; i++) { + await tester.tap(find.byType(SettingsVersionUnlock)); + await tester.pump(); + } + + verifyNever(() => settingsBloc.add(const UnlockInsiderFeaturesEvent())); + expect(find.byType(SnackBar), findsNothing); + }); + + testWidgets('already unlocked: version text is still displayed', (tester) async { + when(() => settingsBloc.state) + .thenReturn(const SettingsState(insiderFeaturesUnlocked: true)); + + await tester.pumpApp(host()); + + expect(find.textContaining('1.2.3'), findsOneWidget); + }); + + testWidgets( + 'nine taps still dispatch UnlockInsiderFeaturesEvent exactly once ' + '(pins the == 7 comparison, a regression to >= 7 would fire on every tap after)', + (tester) async { + await tester.pumpApp(host()); + + for (var i = 0; i < 9; i++) { + await tester.tap(find.byType(SettingsVersionUnlock)); + await tester.pump(); + } + + verify(() => settingsBloc.add(const UnlockInsiderFeaturesEvent())).called(1); + expect(find.byType(SnackBar), findsOneWidget); + }, + ); + }); +} diff --git a/test/screens/settings_currencies/settings_currencies_page_test.dart b/test/screens/settings_currencies/settings_currencies_page_test.dart index c46d2b01c..e7537f0ae 100644 --- a/test/screens/settings_currencies/settings_currencies_page_test.dart +++ b/test/screens/settings_currencies/settings_currencies_page_test.dart @@ -26,6 +26,7 @@ void main() { when(() => settingsRepo.language).thenReturn('en'); when(() => settingsRepo.currency).thenReturn('CHF'); when(() => settingsRepo.networkMode).thenReturn(NetworkMode.mainnet); + when(() => settingsRepo.insiderFeaturesUnlocked).thenReturn(false); settingsBloc = SettingsBloc(settingsRepo, () async {}); final getIt = GetIt.instance; diff --git a/test/screens/settings_languages/settings_languages_page_test.dart b/test/screens/settings_languages/settings_languages_page_test.dart index 9a4e6e15e..3d3b58f58 100644 --- a/test/screens/settings_languages/settings_languages_page_test.dart +++ b/test/screens/settings_languages/settings_languages_page_test.dart @@ -27,6 +27,7 @@ void main() { when(() => settingsRepo.language).thenReturn('en'); when(() => settingsRepo.currency).thenReturn('CHF'); when(() => settingsRepo.networkMode).thenReturn(NetworkMode.mainnet); + when(() => settingsRepo.insiderFeaturesUnlocked).thenReturn(false); settingsBloc = SettingsBloc(settingsRepo, () async {}); final getIt = GetIt.instance; From 9fb121d96ab12ae981204d7efc79ec8eb36119e7 Mon Sep 17 00:00:00 2001 From: Danswar <48102227+Danswar@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:55:00 -0300 Subject: [PATCH 2/4] feat(kyc): add the PersonalData step page (#883) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the KYC onboarding dead ends: adds the missing `PersonalData` step page, and replaces the generic "cannot be completed in this app" failure screen with an actionable handoff. Covers items 4a and 5 of DFXswiss/api#4556, and the dead-end class first flagged as K1/K5 in #613. ## Problem Registration satisfies `PersonalData` without the user ever seeing it, so the app has never had a page for it. But the step **re-opens** when identification rejects the submitted data as not matching the document: the API fails the completed step and opens a fresh one *specifically so the account can correct it*. The app could not render that step. Instead of a correction form the user got the unsupported-step failure screen — "The current KYC step (PersonalData) cannot be completed in this app" — and onboarding dead-ended with no way forward and no way back. It cannot self-heal: the open step blocks the API from opening any later one. This is not a corner case. It is the standard identification data-mismatch flow, and it recurs every time a submitted name or address does not match the document. ## Change - `KycStep.personalData` + the `_mapStepName` arm, so the step routes to a page instead of the failure screen. - `KycPersonalDataPage` — first/last name, phone, street, house number, postcode, city, country. Same field widgets, validators and layout as the registration address/personal steps. - `KycPersonalDataCubit` submits through the generic `setData` PUT already used by the nationality and settings address/name flows, building the body from the existing `KycPersonalData`/`KycAddress` models. ## Guards, and why each exists - **Never offered to a non-personal account.** Submitting this form sets `accountType`, and the API explicitly nulls all six organization columns whenever that value is `Personal` (`user-data.service.ts`, the `isPersonalAccount` branch) and drops five org-only steps from `requiredKycSteps`. The page reads the account type from the registration payload and refuses to render for anything but personal; the cubit sends exactly the value the page gated on, so the two cannot drift. - **Seeded, not blank.** The copy asks the user to check their details and every submit rewrites all eight fields, so an empty form would force a from-memory re-entry in which a typo silently overwrites data that was already correct. - **A missing payload gets a retry, not a dead end** — mirrors `KycLinkWalletPage`'s defensive refresh surface, and has its own golden. - **A late country lookup never overwrites a country the user already picked.** The page and `CountryField` issue independent `GET /v1/country`s and the service does not de-dupe in-flight calls, so either can win. ## The generic dead end `_mapStepName` renders 6 of the 24 step names the API can return. Every other one produced `KycUnsupportedStepFailure`, which rendered the generic failure page — `actions: const []`, a true dead end — with the step's raw wire identifier printed into the message. The user had nothing to do and nothing useful to tell support. `KycUnsupportedStepPage` replaces it with a retry and a route to support, and names no step. The retry is not decorative: for a step under internal review or one the API advances by itself, re-reading is the only way the user finds out. For a genuinely unrenderable step it re-emits the same state, which is honest — the copy and the support CTA are what move that case forward. The identifier is gone deliberately. It is an internal enum value, and DFX support reads the same step server-side, so nothing diagnosable was lost. The personal-data organization refusal renders this same page, so there is one answer to "this step cannot be shown here" instead of two. This covers `Recommendation`, `ResidencePermit` and every future step name at once. Prod data shows no RealUnit account currently behind `ResidencePermit`, and only a very small latent population behind `Recommendation`, so dedicated forms for them would have been the more expensive way to fix less. ## Shared-widget fix `PhoneNumberField` left `prefix` null whenever a seeded value did not start with a dial code it offers. Its prefix dropdown carries no validator, so `Form.validate()` returned true while `updatePhoneNumber()` silently refused to write — the stale number was submitted instead of what the user typed. It now falls back to the first prefix; the number field starts empty, so the validator still blocks submit until it is re-entered. This also fixes the registration prefill (`kyc_registration_page.dart`), which seeds `dto.phoneNumber` unconditionally and is the path that provably carries arbitrary dial codes. ## Verification - `flutter analyze` — no issues. `flutter test --exclude-tags golden` — **4723 passed**. - 4 cubit tests, 17 widget tests, 3 goldens, a `kyc_page_manager` case pinning both hops of the payload plumbing, and both new sticky-CTA surfaces registered in the responsive catalog with full device × text-scale matrix coverage. - Every guard mutation-checked: dropping the account-type gate, the retry branch, the prefill, the url plumbing, either plumbing hop, the country-lookup catch, the racing-pick guard, the `PhoneNumberField` fallback, the handoff page, its retry, its support route, or moving the support CTA out of the sticky block each turns the suite red. - Toolchain matched the CI pin (Flutter 3.41.6); golden baselines produced by `golden-regenerate.yaml` on the self-hosted runner, never locally. The last regeneration after the shared-widget change committed **no** baseline, confirming it is behaviour-neutral for every state under test. ## Two existing tests were updated, not worked around `kyc_cubit_test.dart` used `personalData` as its stand-in for "a step name with no UI mapping" — that premise is now false, so it uses `statutes`. `kyc_bitbox_create_wallet_states_test.dart` pinned the `KycStep` enum at ten variants; it now pins eleven. ## Not in scope Reporting an unmapped step to telemetry. The app has no runtime SDK — `sentry_dart_plugin` is a dev-dependency that only uploads symbols, and there is no `Sentry.capture*` anywhere in `lib/`. Adding one is a product decision, not something to fold in here. Worth doing: this class of failure is invisible in monitoring today, because every response involved is a 200. --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- README.md | 3 +- assets/languages/strings_de.arb | 5 +- assets/languages/strings_en.arb | 5 +- .../real_unit_registration_info_dto.dart | 12 +- lib/screens/kyc/cubits/kyc/kyc_cubit.dart | 6 +- lib/screens/kyc/cubits/kyc/kyc_state.dart | 5 +- lib/screens/kyc/kyc_page_manager.dart | 12 +- .../kyc_personal_data_cubit.dart | 55 +++ .../kyc_personal_data_state.dart | 29 ++ .../personal_data/kyc_personal_data_page.dart | 335 +++++++++++++++++ .../subpages/kyc_unsupported_step_page.dart | 67 ++++ lib/widgets/form/phone_number_field.dart | 21 +- .../macos/kyc_personal_data_page_default.png | Bin 0 -> 38746 bytes ...c_personal_data_page_missing_user_data.png | Bin 0 -> 8872 bytes .../kyc_unsupported_step_page_default.png | Bin 0 -> 38344 bytes .../kyc/kyc_personal_data_golden_test.dart | 99 +++++ .../kyc/kyc_unsupported_step_golden_test.dart | 33 ++ test/helper/responsive_surface_catalog.dart | 16 +- .../kyc/cubits/kyc/kyc_cubit_test.dart | 41 ++- test/screens/kyc/kyc_page_manager_test.dart | 99 ++++- .../steps/kyc_personal_data_page_test.dart | 341 ++++++++++++++++++ .../kyc_personal_data_cubit_test.dart | 98 +++++ ...c_status_pages_responsive_matrix_test.dart | 118 ++++++ .../kyc_unsupported_step_page_test.dart | 104 ++++++ .../kyc_bitbox_create_wallet_states_test.dart | 3 +- 25 files changed, 1472 insertions(+), 35 deletions(-) create mode 100644 lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart create mode 100644 lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_state.dart create mode 100644 lib/screens/kyc/steps/personal_data/kyc_personal_data_page.dart create mode 100644 lib/screens/kyc/subpages/kyc_unsupported_step_page.dart create mode 100644 test/goldens/screens/kyc/goldens/macos/kyc_personal_data_page_default.png create mode 100644 test/goldens/screens/kyc/goldens/macos/kyc_personal_data_page_missing_user_data.png create mode 100644 test/goldens/screens/kyc/goldens/macos/kyc_unsupported_step_page_default.png create mode 100644 test/goldens/screens/kyc/kyc_personal_data_golden_test.dart create mode 100644 test/goldens/screens/kyc/kyc_unsupported_step_golden_test.dart create mode 100644 test/screens/kyc/steps/kyc_personal_data_page_test.dart create mode 100644 test/screens/kyc/steps/personal_data/kyc_personal_data_cubit_test.dart create mode 100644 test/screens/kyc/subpages/kyc_unsupported_step_page_test.dart diff --git a/README.md b/README.md index 2575e765d..abdc459b3 100644 --- a/README.md +++ b/README.md @@ -89,11 +89,12 @@ The transport is USB on Android and Bluetooth on iOS; the original BitBox 02 has | Sell — DFX fiat off-ramp (IBAN) | always | mvp | widget (`sell/sell_page_test.dart`) + golden (`sell/sell_golden_test.dart`, `sell/sell_bank_account_selection_golden_test.dart`); added via [#321](https://github.com/RealUnitCH/app/pull/321) | | KYC: Email + 2FA gate | always | mvp | widget (`kyc_email_page_test.dart`, `kyc_2fa_page_test.dart`) + golden (`kyc/kyc_email_golden_test.dart`, `kyc/kyc_email_verification_golden_test.dart`, `kyc/kyc_2fa_golden_test.dart`); cubit added via [#319](https://github.com/RealUnitCH/app/pull/319) | | KYC: Registration + BitBox EIP-712 sign | always | mvp | widget (`kyc_registration_page_test.dart`) + golden (`kyc/kyc_registration_golden_test.dart`) + unit (`eip712_signer_test.dart`); cubit / `registration_submit` / sign-flow integration tests added via [#319](https://github.com/RealUnitCH/app/pull/319) + [#320](https://github.com/RealUnitCH/app/pull/320) | +| KYC: Personal data (correction after an ident data mismatch) | always | mvp | widget (`kyc_personal_data_page_test.dart`) + golden (`kyc/kyc_personal_data_golden_test.dart`) + cubit (`kyc_personal_data_cubit_test.dart`) | | KYC: Nationality | always | mvp | widget (`kyc_nationality_page_test.dart`) + golden (`kyc/kyc_nationality_golden_test.dart`) | | KYC: Financial data | always | mvp | widget (`kyc_financial_data_page_test.dart`) + golden (`kyc/kyc_financial_data_golden_test.dart`, `kyc/kyc_financial_data_failure_golden_test.dart`, `kyc/kyc_financial_data_loading_golden_test.dart`, `kyc/kyc_financial_data_questions_golden_test.dart`) | | KYC: Ident | always | mvp | widget (`kyc_ident_page_test.dart`) + golden (`kyc/kyc_ident_golden_test.dart`) | | KYC: Pending / Completed / Failure | always | mvp | widget (`kyc/subpages/kyc_*_page_test.dart`) + golden (`kyc/kyc_pending_golden_test.dart`, `kyc/kyc_completed_golden_test.dart`, `kyc/kyc_failure_golden_test.dart`, `kyc/kyc_loading_golden_test.dart`) | -| KYC: AccountMergeRequested / UnsupportedStepFailure | always | mvp | golden (`kyc/kyc_account_merge_golden_test.dart`); cubit paths added via [#319](https://github.com/RealUnitCH/app/pull/319) | +| KYC: AccountMergeRequested / UnsupportedStepFailure | always | mvp | widget (`kyc/subpages/kyc_unsupported_step_page_test.dart`) + golden (`kyc/kyc_account_merge_golden_test.dart`, `kyc/kyc_unsupported_step_golden_test.dart`); cubit paths added via [#319](https://github.com/RealUnitCH/app/pull/319) | | `DFXAuthService` (lazy auth + 401 retry) | always | mvp | — (unit tests added via [#319](https://github.com/RealUnitCH/app/pull/319) + [#321](https://github.com/RealUnitCH/app/pull/321)) | | `balance_service` (balance fetch + cache) | always | mvp | unit (`balance_service_test.dart`) | | `format_fixed` / `parse_fixed` (decimal helpers) | always | mvp | unit (`format_fixed_test.dart`, `parse_fixed_test.dart`) | diff --git a/assets/languages/strings_de.arb b/assets/languages/strings_de.arb index 9b0510b53..ec6dfca44 100644 --- a/assets/languages/strings_de.arb +++ b/assets/languages/strings_de.arb @@ -130,9 +130,12 @@ "kycMergeProcessingTitle": "Konten werden zusammengeführt", "kycPending": "Daten werden geprüft", "kycPendingDescription": "Ihr folgender Schritt ist gerade noch unter Prüfung: ${step}. Bitte haben Sie noch ein wenig Geduld und schauen Sie zu einem späteren Zeitpunkt nochmal rein.", + "kycPersonalDataDescription": "Bitte überprüfen Sie Ihre Angaben und korrigieren Sie alles, was nicht mit Ihrem Ausweisdokument übereinstimmt.", + "kycPersonalDataFailed": "Persönliche Daten konnten nicht gespeichert werden:\n${message}", "kycSignatureUnsupportedDescription": "Dieses Feature erfordert eine EIP-712-Signatur. Im Debug-Modus (Adresse + Signatur) ist dies technisch nicht möglich. Bitte verwenden Sie eine Software-Wallet oder BitBox, um RealUnit zu nutzen.", "kycSignatureUnsupportedTitle": "Signatur nicht verfügbar", - "kycUnsupportedStepDescription": "Der aktuelle KYC-Schritt (${step}) kann in dieser App nicht abgeschlossen werden. Bitte kontaktieren Sie den Support.", + "kycUnsupportedStepDescription": "Der nächste Schritt Ihrer Verifizierung kann in dieser App nicht abgeschlossen werden. Aktualisieren Sie, um zu prüfen, ob er weitergelaufen ist, oder wenden Sie sich an unser Support-Team, das dann übernimmt.", + "kycUnsupportedStepTitle": "Dieser Schritt wird anderswo fortgesetzt", "label": "Bezeichnung", "languageEnglish": "Englisch", "languageGerman": "Deutsch", diff --git a/assets/languages/strings_en.arb b/assets/languages/strings_en.arb index 3f26caeb1..dcf3496cd 100644 --- a/assets/languages/strings_en.arb +++ b/assets/languages/strings_en.arb @@ -130,9 +130,12 @@ "kycMergeProcessingTitle": "Merging your accounts", "kycPending": "Data is being verified", "kycPendingDescription": "Your next step is currently being reviewed: ${step}. Please be patient and check back later.", + "kycPersonalDataDescription": "Please check your details and correct anything that does not match your identity document.", + "kycPersonalDataFailed": "Could not save your personal data:\n${message}", "kycSignatureUnsupportedDescription": "This feature requires an EIP-712 signature. The Debug mode (address + signature) cannot produce one. Please use a Software Wallet or a BitBox to use RealUnit.", "kycSignatureUnsupportedTitle": "Signature not available", - "kycUnsupportedStepDescription": "The current KYC step (${step}) cannot be completed in this app. Please contact support.", + "kycUnsupportedStepDescription": "The next step of your verification cannot be completed in this app. Refresh to check whether it has moved on, or contact our support team and they will take it from here.", + "kycUnsupportedStepTitle": "This step continues elsewhere", "label": "Label", "languageEnglish": "English", "languageGerman": "German", diff --git a/lib/packages/service/dfx/models/wallet/real_unit_registration_info_dto.dart b/lib/packages/service/dfx/models/wallet/real_unit_registration_info_dto.dart index 1a83a9a16..11743d74d 100644 --- a/lib/packages/service/dfx/models/wallet/real_unit_registration_info_dto.dart +++ b/lib/packages/service/dfx/models/wallet/real_unit_registration_info_dto.dart @@ -4,9 +4,15 @@ import 'package:realunit_wallet/packages/service/dfx/models/wallet/real_unit_reg class RealUnitRegistrationInfoDto { /// API-side routing decision for this wallet. Drives KYC dispatch in /// `KycCubit._runCheckKyc` — see CONTRIBUTING.md "API as Decision - /// Authority". `userData` is populated for `addWallet` (prior payload) - /// and `newRegistration` (KYC pre-fill); `null` for `alreadyRegistered` - /// (no UX needed). + /// Authority". `userData` is populated whenever a registration row exists — + /// `alreadyRegistered` and `addWallet` both carry the stored signed payload — + /// and for `newRegistration` when DFX KYC data can pre-fill the form. It is + /// `null` only when the stored registration has no signed payload, or when + /// there is no verified personal data to pre-fill from. + /// + /// `alreadyRegistered` is NOT a no-payload case: the personal-data KYC step + /// is reached only through that branch and seeds its correction form from + /// this payload, so treating it as null would dead-end that step. final RealUnitRegistrationState state; final RealUnitUserDataDto? realUnitUserDataDto; diff --git a/lib/screens/kyc/cubits/kyc/kyc_cubit.dart b/lib/screens/kyc/cubits/kyc/kyc_cubit.dart index 89e3c50e0..779131da3 100644 --- a/lib/screens/kyc/cubits/kyc/kyc_cubit.dart +++ b/lib/screens/kyc/cubits/kyc/kyc_cubit.dart @@ -256,7 +256,7 @@ class KycCubit extends Cubit { emit(KycPending(step)); return; case KycProcessStatus.inProgress: - await _continueKyc(generation); + await _continueKyc(generation, registrationInfo.realUnitUserDataDto); return; case KycProcessStatus.mergeProcessing: // The user confirmed a merge and the backend is still processing it. @@ -311,7 +311,7 @@ class KycCubit extends Cubit { } /// should only be called after realunit registration was completed - Future _continueKyc(int generation) async { + Future _continueKyc(int generation, [RealUnitUserDataDto? realUnitUserData]) async { final kycStatus = await _kycService.continueKyc(context: _kycContext); if (isClosed || generation != _runGeneration) return; @@ -338,12 +338,14 @@ class KycCubit extends Cubit { KycSuccess( currentStep: kycStep, urlOrToken: currentStep.session.url, + realUnitUserData: realUnitUserData, ), ); } KycStep? _mapStepName(KycStepName name) => switch (name) { KycStepName.contactData => KycStep.registration, + KycStepName.personalData => KycStep.personalData, KycStepName.nationalityData => KycStep.nationality, KycStepName.ident => KycStep.ident, KycStepName.financialData => KycStep.financialData, diff --git a/lib/screens/kyc/cubits/kyc/kyc_state.dart b/lib/screens/kyc/cubits/kyc/kyc_state.dart index b5d0d47b1..dac1f5126 100644 --- a/lib/screens/kyc/cubits/kyc/kyc_state.dart +++ b/lib/screens/kyc/cubits/kyc/kyc_state.dart @@ -4,6 +4,7 @@ enum KycStep { email, confirmEmail, registration, + personalData, linkWallet, legalDisclaimer, nationality, @@ -43,7 +44,9 @@ class KycSuccess extends KycState { /// Server-side user record attached to the routing decision. Populated when /// `RealUnitRegistrationService.getRegistrationInfo()` returns userData - /// alongside the state (`AddWallet` always, `NewRegistration` when the + /// alongside the state (`AddWallet` always, `AlreadyRegistered` whenever the + /// registration carries a signed payload — which is what the `personalData` + /// step seeds its correction form from — and `NewRegistration` when the /// backend has fallback data). The cubit forwards the DTO so downstream /// pages do not need to re-fetch — see CONTRIBUTING.md "Single round-trip /// per decision". diff --git a/lib/screens/kyc/kyc_page_manager.dart b/lib/screens/kyc/kyc_page_manager.dart index c5ae9013e..4f75ca0a1 100644 --- a/lib/screens/kyc/kyc_page_manager.dart +++ b/lib/screens/kyc/kyc_page_manager.dart @@ -1,9 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:realunit_wallet/generated/i18n.dart'; import 'package:realunit_wallet/packages/service/app_store.dart'; import 'package:realunit_wallet/packages/service/dfx/dfx_kyc_service.dart'; -import 'package:realunit_wallet/packages/service/dfx/models/kyc/kyc_level.dart'; import 'package:realunit_wallet/packages/service/dfx/real_unit_legal_service.dart'; import 'package:realunit_wallet/packages/service/dfx/real_unit_registration_service.dart'; import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; @@ -14,6 +12,7 @@ import 'package:realunit_wallet/screens/kyc/steps/financial_data/kyc_financial_d import 'package:realunit_wallet/screens/kyc/steps/ident/kyc_ident_page.dart'; import 'package:realunit_wallet/screens/kyc/steps/link_wallet/kyc_link_wallet_page.dart'; import 'package:realunit_wallet/screens/kyc/steps/nationality/kyc_nationality_page.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/kyc_personal_data_page.dart'; import 'package:realunit_wallet/screens/kyc/steps/registration/kyc_registration_page.dart'; import 'package:realunit_wallet/screens/kyc/steps/signature_unsupported/kyc_signature_unsupported_page.dart'; import 'package:realunit_wallet/screens/kyc/subpages/kyc_account_merge_page.dart'; @@ -23,6 +22,7 @@ import 'package:realunit_wallet/screens/kyc/subpages/kyc_loading_page.dart'; import 'package:realunit_wallet/screens/kyc/subpages/kyc_manual_review_page.dart'; import 'package:realunit_wallet/screens/kyc/subpages/kyc_merge_processing_page.dart'; import 'package:realunit_wallet/screens/kyc/subpages/kyc_pending_page.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; import 'package:realunit_wallet/screens/legal/legal_disclaimer_page.dart'; import 'package:realunit_wallet/setup/di.dart'; @@ -55,9 +55,7 @@ class KycViewManager extends StatelessWidget { KycLoading() => const KycLoadingPage(), KycFailure(:final message) => KycFailurePage(message: message), KycSignatureUnsupportedFailure() => const KycSignatureUnsupportedPage(), - KycUnsupportedStepFailure(:final stepName) => KycFailurePage( - message: S.of(context).kycUnsupportedStepDescription(stepName?.value ?? '-'), - ), + KycUnsupportedStepFailure() => const KycUnsupportedStepPage(), KycAccountMergeRequested() => const KycAccountMergePage(), KycMergeProcessing() => const KycMergeProcessingPage(), KycManualReview() => const KycManualReviewPage(), @@ -75,6 +73,10 @@ class KycViewManager extends StatelessWidget { }, ), KycStep.registration => KycRegistrationPage(initialUserData: realUnitUserData), + KycStep.personalData => KycPersonalDataPage( + url: urlOrToken ?? '', + initialUserData: realUnitUserData, + ), KycStep.linkWallet => KycLinkWalletPage(userData: realUnitUserData), KycStep.nationality => KycNationalityPage(url: urlOrToken ?? ''), KycStep.twoFa => const Kyc2FaPage(), diff --git a/lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart b/lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart new file mode 100644 index 000000000..d4aab5fe3 --- /dev/null +++ b/lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart @@ -0,0 +1,55 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_kyc_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/country/country.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/registration/kyc/kyc_personal_data.dart'; + +part 'kyc_personal_data_state.dart'; + +class KycPersonalDataCubit extends Cubit { + final DfxKycService _kycService; + + KycPersonalDataCubit(DfxKycService kycService) + : _kycService = kycService, + super(const KycPersonalDataInitial()); + + Future submit({ + required String url, + required KycAccountType accountType, + required String firstName, + required String lastName, + required String phone, + required String street, + required String houseNumber, + required String zip, + required String city, + required Country country, + }) async { + try { + emit(const KycPersonalDataLoading()); + await _kycService.setData( + url, + KycPersonalData( + // Passed in, never assumed: the page refuses to render for anything but a personal + // account, and sending the same value it checked keeps the two from drifting apart. + accountType: accountType, + firstName: firstName, + lastName: lastName, + phone: phone, + address: KycAddress( + street: street, + // Always sent. The form requires it, and an omitted key would leave the stored value + // unchanged rather than clearing it — wrong for a form whose purpose is correction. + houseNumber: houseNumber, + zip: zip, + city: city, + country: country.id, + ), + ).toJson(), + ); + emit(const KycPersonalDataSuccess()); + } catch (e) { + emit(KycPersonalDataFailure(e.toString())); + } + } +} diff --git a/lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_state.dart b/lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_state.dart new file mode 100644 index 000000000..41e2fb90f --- /dev/null +++ b/lib/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_state.dart @@ -0,0 +1,29 @@ +part of 'kyc_personal_data_cubit.dart'; + +abstract class KycPersonalDataState extends Equatable { + const KycPersonalDataState(); + + @override + List get props => []; +} + +class KycPersonalDataInitial extends KycPersonalDataState { + const KycPersonalDataInitial(); +} + +class KycPersonalDataLoading extends KycPersonalDataState { + const KycPersonalDataLoading(); +} + +class KycPersonalDataSuccess extends KycPersonalDataState { + const KycPersonalDataSuccess(); +} + +class KycPersonalDataFailure extends KycPersonalDataState { + final String message; + + const KycPersonalDataFailure(this.message); + + @override + List get props => [message]; +} diff --git a/lib/screens/kyc/steps/personal_data/kyc_personal_data_page.dart b/lib/screens/kyc/steps/personal_data/kyc_personal_data_page.dart new file mode 100644 index 000000000..f5994ba3a --- /dev/null +++ b/lib/screens/kyc/steps/personal_data/kyc_personal_data_page.dart @@ -0,0 +1,335 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:realunit_wallet/generated/i18n.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_country_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_kyc_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/country/country.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/registration/kyc/kyc_personal_data.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/user/dto/real_unit_user_data_dto.dart'; +import 'package:realunit_wallet/packages/utils/swiss_payment_text.dart'; +import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; +import 'package:realunit_wallet/setup/di.dart'; +import 'package:realunit_wallet/styles/colors.dart'; +import 'package:realunit_wallet/widgets/buttons/app_filled_button.dart'; +import 'package:realunit_wallet/widgets/form/country_field.dart'; +import 'package:realunit_wallet/widgets/form/labeled_text_field.dart'; +import 'package:realunit_wallet/widgets/form/phone_number_field.dart'; +import 'package:realunit_wallet/widgets/scrollable_actions_layout.dart'; + +/// The PersonalData KYC step. +/// +/// Registration normally satisfies this step without the user ever seeing it. It surfaces when the +/// step was re-opened deliberately — identification rejected the submitted data as not matching the +/// document — and the account has to correct it before identification can be retried. Until this +/// page existed the API asked for a step the app could not render, and onboarding dead-ended. +class KycPersonalDataPage extends StatelessWidget { + final String url; + final RealUnitUserDataDto? initialUserData; + + const KycPersonalDataPage({super.key, required this.url, this.initialUserData}); + + @override + Widget build(BuildContext context) { + // The form can only express a personal account: submitting it sets `accountType` on the + // account, and the API nulls every organization field whenever that value is `Personal`. So an + // organization or sole-proprietorship account must never be offered this form — it would destroy + // its organization data and drop the org-only steps from its required set. + final userData = initialUserData; + if (userData == null) { + // Transient: the registration row carries no signed payload yet. Gets the dedicated + // missing-payload surface, mirroring KycLinkWalletPage — distinct from the shared handoff an + // unsupported account type gets below. + return const _PersonalDataMissingUserDataPage(); + } + if (userData.kycData.accountType != KycAccountType.personal) { + // Same answer the app gives for any step it cannot render: an actionable handoff rather than a + // dead end, and no internal step identifier surfaced to the user. + return const KycUnsupportedStepPage(); + } + + return BlocProvider( + create: (_) => KycPersonalDataCubit(getIt()), + child: KycPersonalDataView(url: url, initialUserData: userData), + ); + } +} + +class KycPersonalDataView extends StatefulWidget { + final String url; + final RealUnitUserDataDto initialUserData; + + const KycPersonalDataView({super.key, required this.url, required this.initialUserData}); + + @override + State createState() => _KycPersonalDataViewState(); +} + +class _KycPersonalDataViewState extends State { + final _formKey = GlobalKey(); + final firstNameCtrl = TextEditingController(); + final lastNameCtrl = TextEditingController(); + final phoneCtrl = ValueNotifier(null); + final streetCtrl = TextEditingController(); + final houseNumberCtrl = TextEditingController(); + final zipCtrl = TextEditingController(); + final cityCtrl = TextEditingController(); + final countryCtrl = ValueNotifier(null); + Country? _initialCountry; + + @override + void initState() { + super.initState(); + + // This is a correction form, not a fresh capture: the copy asks the user to check their details, + // and every submit rewrites all of them, so shipping it empty would force a from-memory re-entry + // and let a typo overwrite data that was already correct. Seeded from the payload the parent + // cubit already fetched — no extra round-trip. Same shape as KycRegistrationView.initState. + final kycData = widget.initialUserData.kycData; + firstNameCtrl.text = kycData.firstName; + lastNameCtrl.text = kycData.lastName; + phoneCtrl.value = kycData.phone; + streetCtrl.text = kycData.address.street; + houseNumberCtrl.text = kycData.address.houseNumber ?? ''; + zipCtrl.text = kycData.address.zip; + cityCtrl.text = kycData.address.city; + + // The DTO carries only the country id, so the field populates when the lookup resolves; the + // form renders immediately either way. + unawaited(_resolveInitialCountry(kycData.address.country)); + } + + Future _resolveInitialCountry(int countryId) async { + try { + final countries = await getIt().getAllCountries(); + if (!mounted) return; + + final country = countries.where((c) => c.id == countryId).firstOrNull; + // Never clobber a pick the user already made: CountryField runs its own lookup, and if that one + // resolves first the field is live before this seed arrives. + if (country == null || countryCtrl.value != null) return; + + setState(() => _initialCountry = country); + countryCtrl.value = country; + } catch (_) { + // Degrade to an empty picker — CountryField renders its own error and retry. + } + } + + String? _required(String? value) { + if (value == null || value.isEmpty) return ''; + if (!isSwissPaymentText(value)) return S.of(context).swissPaymentTextInvalid; + return null; + } + + void _submit() { + FocusManager.instance.primaryFocus?.unfocus(); + // CountryField registers a validator with the enclosing Form, so a successful validate() + // guarantees countryCtrl is set. phoneCtrl is guaranteed by PhoneNumberField itself: it defaults + // to its first prefix when unseeded and only accepts a seeded value it can decompose. + if (!(_formKey.currentState?.validate() ?? false)) return; + + context.read().submit( + url: widget.url, + accountType: widget.initialUserData.kycData.accountType, + firstName: firstNameCtrl.text, + lastName: lastNameCtrl.text, + phone: phoneCtrl.value!, + street: streetCtrl.text, + houseNumber: houseNumberCtrl.text, + zip: zipCtrl.text, + city: cityCtrl.text, + country: countryCtrl.value!, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(S.of(context).personalData)), + body: BlocListener( + listener: (context, state) { + if (state is KycPersonalDataSuccess) { + // The API decides what comes next; re-reading it is what moves the flow on. + context.read().checkKyc(); + } + if (state is KycPersonalDataFailure) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(S.of(context).kycPersonalDataFailed(state.message)), + backgroundColor: RealUnitColors.status.red600, + ), + ); + } + }, + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: SafeArea( + child: GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + behavior: HitTestBehavior.opaque, + child: Form( + key: _formKey, + child: Column( + spacing: 16, + children: [ + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text(S.of(context).kycPersonalDataDescription), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Expanded( + child: LabeledTextField( + label: S.of(context).firstName, + hintText: 'Max', + controller: firstNameCtrl, + textCapitalization: TextCapitalization.words, + validator: _required, + ), + ), + Expanded( + child: LabeledTextField( + label: S.of(context).lastName, + hintText: 'Mustermann', + controller: lastNameCtrl, + textCapitalization: TextCapitalization.words, + validator: _required, + ), + ), + ], + ), + PhoneNumberField(controller: phoneCtrl), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Expanded( + flex: 2, + child: LabeledTextField( + hintText: S.of(context).streetHint, + controller: streetCtrl, + label: S.of(context).street, + keyboardType: TextInputType.streetAddress, + textCapitalization: TextCapitalization.words, + validator: _required, + ), + ), + Expanded( + child: LabeledTextField( + hintText: '13', + controller: houseNumberCtrl, + label: S.of(context).number, + keyboardType: TextInputType.streetAddress, + validator: _required, + ), + ), + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 10, + children: [ + Expanded( + flex: 2, + child: LabeledTextField( + hintText: '8000', + controller: zipCtrl, + label: S.of(context).postcodeAbr, + // Alphanumeric in many residence countries (NL "1011 AB", UK "EC1A 1BB"), + // so not a number-only keyboard — mirrors the registration address step. + keyboardType: TextInputType.text, + validator: _required, + ), + ), + Expanded( + flex: 3, + child: LabeledTextField( + hintText: S.of(context).cityHint, + controller: cityCtrl, + label: S.of(context).city, + keyboardType: TextInputType.text, + textCapitalization: TextCapitalization.words, + validator: _required, + ), + ), + ], + ), + CountryField( + label: S.of(context).country, + purpose: CountryFieldPurpose.residence, + initialValue: _initialCountry, + onChanged: (country) => countryCtrl.value = country, + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: BlocBuilder( + builder: (context, state) { + return AppFilledButton( + state: state is KycPersonalDataLoading ? .loading : .idle, + onPressed: _submit, + label: S.of(context).next, + ); + }, + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + } + + @override + void dispose() { + firstNameCtrl.dispose(); + lastNameCtrl.dispose(); + phoneCtrl.dispose(); + streetCtrl.dispose(); + houseNumberCtrl.dispose(); + zipCtrl.dispose(); + cityCtrl.dispose(); + countryCtrl.dispose(); + super.dispose(); + } +} + +/// Shown when the step is actionable but the registration row carries no signed payload to seed the +/// form from. Transient, so it offers a refresh rather than dead-ending. +class _PersonalDataMissingUserDataPage extends StatelessWidget { + const _PersonalDataMissingUserDataPage(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(S.of(context).personalData)), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: SafeArea( + child: ScrollableActionsLayout( + centerBody: true, + body: Text( + S.of(context).kycFailure, + style: Theme.of(context).textTheme.bodyMedium, + textAlign: TextAlign.center, + ), + actions: [ + AppFilledButton( + onPressed: () => context.read().checkKyc(), + label: S.of(context).refresh, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/screens/kyc/subpages/kyc_unsupported_step_page.dart b/lib/screens/kyc/subpages/kyc_unsupported_step_page.dart new file mode 100644 index 000000000..675d8f720 --- /dev/null +++ b/lib/screens/kyc/subpages/kyc_unsupported_step_page.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:go_router/go_router.dart'; +import 'package:realunit_wallet/generated/i18n.dart'; +import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; +import 'package:realunit_wallet/styles/colors.dart'; +import 'package:realunit_wallet/setup/routing/routes/support_routes.dart'; +import 'package:realunit_wallet/widgets/buttons/app_filled_button.dart'; +import 'package:realunit_wallet/widgets/buttons/app_text_button.dart'; +import 'package:realunit_wallet/widgets/scrollable_actions_layout.dart'; + +/// Shown when the API asks for a KYC step this app has no screen for. +/// +/// The app renders a subset of the step names the API can return, so this is reachable whenever +/// verification routes an account down a branch the app does not implement. It used to render the +/// generic failure page — no actions, and the raw wire identifier of the step printed into the +/// message — which left the user with nothing to do and nothing to tell support. +/// +/// Deliberately does not name the step: the identifier is an internal enum value, not something a +/// user can act on. Offering a retry matters because the state is not always terminal — the API can +/// move the account on by itself (an internal review completing, a step expiring), and the retry +/// re-reads it rather than stranding the user on a screen that will never change on its own. +class KycUnsupportedStepPage extends StatelessWidget { + const KycUnsupportedStepPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(S.of(context).kyc)), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: SafeArea( + child: ScrollableActionsLayout( + centerBody: true, + body: Column( + spacing: 8.0, + children: [ + Text( + S.of(context).kycUnsupportedStepTitle, + style: Theme.of(context).textTheme.headlineMedium, + textAlign: TextAlign.center, + ), + Text( + S.of(context).kycUnsupportedStepDescription, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: RealUnitColors.neutral500, + ), + ), + ], + ), + actions: [ + AppFilledButton( + onPressed: () => context.read().checkKyc(), + label: S.of(context).refresh, + ), + AppTextButton( + onPressed: () => context.pushNamed(SupportRoutes.support), + label: S.of(context).contactSupport, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/form/phone_number_field.dart b/lib/widgets/form/phone_number_field.dart index 469cf364b..a2684db8d 100644 --- a/lib/widgets/form/phone_number_field.dart +++ b/lib/widgets/form/phone_number_field.dart @@ -21,17 +21,20 @@ class _PhoneNumberFieldState extends State { void initState() { super.initState(); final value = widget.controller.value; - if (value != null) { - for (var p in prefixes) { - if (value.startsWith(p)) { - prefix = p; - number = value.substring(p.length); - break; - } + for (final p in prefixes) { + if (value != null && value.startsWith(p)) { + prefix = p; + number = value.substring(p.length); + break; } - } else { - prefix = prefixes.first; } + + // A seeded value this field cannot decompose (empty, or a dial code it does not offer) must not + // leave `prefix` null: the dropdown carries no validator, so `Form.validate()` would pass while + // `updatePhoneNumber()` silently refused to write, and the stale value would be submitted + // instead of what the user typed. Fall back to the first prefix; the number field starts empty, + // so the validator still blocks submit until it is re-entered. + prefix ??= prefixes.first; } void updatePhoneNumber() { diff --git a/test/goldens/screens/kyc/goldens/macos/kyc_personal_data_page_default.png b/test/goldens/screens/kyc/goldens/macos/kyc_personal_data_page_default.png new file mode 100644 index 0000000000000000000000000000000000000000..8c72f9ff274708b3610c98da77cbfd8eae0a07f8 GIT binary patch literal 38746 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¬4oS>TflN1lbb}AKQcn3qs}!?+hOypy&=G$x9Rh} zalF7Kdmi(y1lOF0=-Xo50zX8OoEBP+g`N@hhxyP*(x(~PoDVxL^;k{Cpi58)A?~&9 zPIXr=^!4wa80DxHDsD*;`BL**&l^vj4pJV+S*;f+@mM#mZkYG1C6&-yc^r%}Z&@5S z4r3M0>mI$+q$N0BA3Cov8K*@7rWWFSK7o2g1vw*ER!xxzrta6F+7sm*X}HjXr$fb~ z>y-T;kyWBM!Ke`b!#X^+dPQ+hM+sTV`^(?FXWcKO;WgY26wO{ x^6i4_l+g0O|BnH}|Nn>n2T=F_XD{*v-j~;VuS(0hek0%?NpV@RTv46({|nf4K5GB~ literal 0 HcmV?d00001 diff --git a/test/goldens/screens/kyc/goldens/macos/kyc_personal_data_page_missing_user_data.png b/test/goldens/screens/kyc/goldens/macos/kyc_personal_data_page_missing_user_data.png new file mode 100644 index 0000000000000000000000000000000000000000..eab60d884e57b3239c56e9d3114a89c01a980334 GIT binary patch literal 8872 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 E03O!bn*aa+ literal 0 HcmV?d00001 diff --git a/test/goldens/screens/kyc/goldens/macos/kyc_unsupported_step_page_default.png b/test/goldens/screens/kyc/goldens/macos/kyc_unsupported_step_page_default.png new file mode 100644 index 0000000000000000000000000000000000000000..87e0a9d5a1737ce8347f533b7588b308c525a3fb GIT binary patch literal 38344 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 literal 0 HcmV?d00001 diff --git a/test/goldens/screens/kyc/kyc_personal_data_golden_test.dart b/test/goldens/screens/kyc/kyc_personal_data_golden_test.dart new file mode 100644 index 000000000..79d3328be --- /dev/null +++ b/test/goldens/screens/kyc/kyc_personal_data_golden_test.dart @@ -0,0 +1,99 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_country_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/registration/kyc/kyc_personal_data.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/user/dto/real_unit_user_data_dto.dart'; +import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/kyc_personal_data_page.dart'; + +import '../../../helper/helper.dart'; + +class _MockKycPersonalDataCubit extends MockCubit + implements KycPersonalDataCubit {} + +class _MockKycCubit extends MockCubit implements KycCubit {} + +RealUnitUserDataDto _userData() => const RealUnitUserDataDto( + email: 'erika@example.com', + name: 'Erika Mueller', + type: 'HUMAN', + phoneNumber: '+41790000000', + birthday: '1990-01-01', + nationality: 'CH', + addressStreet: 'Bahnhofstrasse 1', + addressPostalCode: '8001', + addressCity: 'Winterthur', + addressCountry: 'CH', + swissTaxResidence: true, + lang: 'EN', + kycData: KycPersonalData( + accountType: KycAccountType.personal, + firstName: 'Erika', + lastName: 'Mueller', + phone: '+41790000000', + address: KycAddress( + street: 'Bahnhofstrasse', + houseNumber: '1', + zip: '8001', + city: 'Winterthur', + country: 41, + ), + ), +); + +void main() { + late _MockKycPersonalDataCubit personalDataCubit; + late _MockKycCubit kycCubit; + + setUp(() { + personalDataCubit = _MockKycPersonalDataCubit(); + kycCubit = _MockKycCubit(); + + when(() => personalDataCubit.state).thenReturn(const KycPersonalDataInitial()); + when(() => kycCubit.state).thenReturn(const KycInitial()); + }); + + setUpAll(() { + GetIt.instance.registerSingleton(fixtureCountryService()); + }); + + tearDownAll(() async => GetIt.instance.reset()); + + group('$KycPersonalDataView', () { + // initialUserData == null → the page short-circuits to its defensive refresh surface. No cubit is + // created, so drive the page directly with only the parent KycCubit in scope for the handler. + goldenTest( + 'missing user data — defensive refresh page', + fileName: 'kyc_personal_data_page_missing_user_data', + constraints: phoneConstraints, + builder: () => wrapForGolden( + BlocProvider.value( + value: kycCubit, + child: const KycPersonalDataPage(url: 'https://example.com'), + ), + ), + ); + + goldenTest( + 'seeded from the registration payload', + fileName: 'kyc_personal_data_page_default', + constraints: phoneConstraints, + builder: () => wrapForGolden( + MultiBlocProvider( + providers: [ + BlocProvider.value(value: personalDataCubit), + BlocProvider.value(value: kycCubit), + ], + child: KycPersonalDataView( + url: 'https://example.com', + initialUserData: _userData(), + ), + ), + ), + ); + }); +} diff --git a/test/goldens/screens/kyc/kyc_unsupported_step_golden_test.dart b/test/goldens/screens/kyc/kyc_unsupported_step_golden_test.dart new file mode 100644 index 000000000..6c2ef9fbe --- /dev/null +++ b/test/goldens/screens/kyc/kyc_unsupported_step_golden_test.dart @@ -0,0 +1,33 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; + +import '../../../helper/helper.dart'; + +class _MockKycCubit extends MockCubit implements KycCubit {} + +void main() { + late _MockKycCubit kycCubit; + + setUp(() { + kycCubit = _MockKycCubit(); + when(() => kycCubit.state).thenReturn(const KycInitial()); + }); + + group('$KycUnsupportedStepPage', () { + goldenTest( + 'actionable handoff for a step the app cannot render', + fileName: 'kyc_unsupported_step_page_default', + constraints: phoneConstraints, + builder: () => wrapForGolden( + BlocProvider.value( + value: kycCubit, + child: const KycUnsupportedStepPage(), + ), + ), + ); + }); +} diff --git a/test/helper/responsive_surface_catalog.dart b/test/helper/responsive_surface_catalog.dart index f45b7dfd3..8c35aa01c 100644 --- a/test/helper/responsive_surface_catalog.dart +++ b/test/helper/responsive_surface_catalog.dart @@ -82,6 +82,20 @@ const kResponsiveSurfaceCatalog = [ 'test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart', productionPath: 'lib/screens/kyc/subpages/kyc_pending_page.dart', ), + ResponsiveSurface( + id: 'kyc_unsupported_step_page', + description: 'KYC unsupported-step handoff page', + matrixTestPath: + 'test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart', + productionPath: 'lib/screens/kyc/subpages/kyc_unsupported_step_page.dart', + ), + ResponsiveSurface( + id: 'kyc_personal_data_missing_user_data_page', + description: 'KYC personal-data missing-payload refresh page', + matrixTestPath: + 'test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart', + productionPath: 'lib/screens/kyc/steps/personal_data/kyc_personal_data_page.dart', + ), ResponsiveSurface( id: 'kyc_account_merge_page', description: 'KYC account merge page', @@ -259,7 +273,7 @@ const kResponsiveSurfaceCatalog = [ matrixTestPath: 'test/screens/pin/pin_sheets_responsive_matrix_test.dart', productionPath: 'lib/screens/pin/widgets/enable_biometric_bottom_sheet.dart', ), - // Migration covers 34 surfaces total (bitbox_connect_sheet + 33 above). No + // Migration covers 36 surfaces total (bitbox_connect_sheet + 35 above). No // further known candidates remain from the prior sweep. welcome_page was // reviewed and found safe (scrolls end-to-end, no separate sticky CTA) — not // a migration candidate. Not exhaustive — review responsibility for every diff --git a/test/screens/kyc/cubits/kyc/kyc_cubit_test.dart b/test/screens/kyc/cubits/kyc/kyc_cubit_test.dart index 27fcb1d91..804e99e6f 100644 --- a/test/screens/kyc/cubits/kyc/kyc_cubit_test.dart +++ b/test/screens/kyc/cubits/kyc/kyc_cubit_test.dart @@ -809,9 +809,9 @@ void main() { ); // PendingReview + a required step the app cannot render (e.g. - // additionalDocuments, residencePermit, statutes, personalData — all - // absent from `_mapStepName`). Must surface an explicit failure with - // the step name, never `KycCompleted`. + // additionalDocuments, residencePermit, statutes — all absent from + // `_mapStepName`). Must surface an explicit failure with the step name, + // never `KycCompleted`. blocTest( 'emits KycUnsupportedStepFailure(step) when PendingReview required step is unmapped', setUp: () { @@ -838,6 +838,35 @@ void main() { ], ); + // Registration normally satisfies PersonalData without the user seeing it. It re-opens when + // identification rejects the submitted data, and until the page existed that landed the user on + // the unsupported-step failure screen with no way to correct anything. + blocTest( + 'routes PersonalData to its own step instead of the unsupported-step failure', + setUp: () { + when(() => kycService.getKycStatus()).thenAnswer( + (_) async => _kycStatus( + level: KycLevel.level20, + processStatus: KycProcessStatus.pendingReview, + steps: [ + _step( + KycStepName.personalData, + status: KycStepStatus.inProgress, + isRequired: true, + ), + ], + ), + ); + when(() => kycService.getUser()).thenAnswer((_) async => _user()); + }, + build: buildCubit, + act: (cubit) => cubit.checkKyc(), + expect: () => [ + const KycLoading(), + const KycPending(KycStep.personalData), + ], + ); + blocTest( 'emits KycPending(dfxApproval) when dfxApproval is the only required step in PendingReview', setUp: () { @@ -903,7 +932,9 @@ void main() { (_) async => _session( level: KycLevel.level20, steps: const [], - currentStep: _currentStep(KycStepName.personalData), + // personalData used to stand in for "unmapped" here; it has its own page now, so this + // needs a name that is still absent from `_mapStepName`. + currentStep: _currentStep(KycStepName.statutes), ), ); }, @@ -911,7 +942,7 @@ void main() { act: (cubit) => cubit.checkKyc(), expect: () => [ const KycLoading(), - const KycUnsupportedStepFailure(KycStepName.personalData), + const KycUnsupportedStepFailure(KycStepName.statutes), ], ); diff --git a/test/screens/kyc/kyc_page_manager_test.dart b/test/screens/kyc/kyc_page_manager_test.dart index af5204ce2..cf7dc572c 100644 --- a/test/screens/kyc/kyc_page_manager_test.dart +++ b/test/screens/kyc/kyc_page_manager_test.dart @@ -4,6 +4,11 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:get_it/get_it.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_country_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/registration/kyc/kyc_personal_data.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/user/dto/real_unit_user_data_dto.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/kyc_personal_data_page.dart'; import 'package:realunit_wallet/packages/service/app_store.dart'; import 'package:realunit_wallet/packages/service/dfx/dfx_kyc_service.dart'; import 'package:realunit_wallet/packages/service/dfx/models/kyc/dto/kyc_level_dto.dart'; @@ -77,6 +82,34 @@ KycStepSessionDto _currentStep( void main() { late _MockDfxKycService kycService; late _MockRealUnitRegistrationService registrationService; + + RealUnitUserDataDto personalUserData() => const RealUnitUserDataDto( + email: 'erika@example.com', + name: 'Erika Mueller', + type: 'HUMAN', + phoneNumber: '+41790000000', + birthday: '1990-01-01', + nationality: 'CH', + addressStreet: 'Bahnhofstrasse 1', + addressPostalCode: '8001', + addressCity: 'Winterthur', + addressCountry: 'CH', + swissTaxResidence: true, + lang: 'EN', + kycData: KycPersonalData( + accountType: KycAccountType.personal, + firstName: 'Erika', + lastName: 'Mueller', + phone: '+41790000000', + address: KycAddress( + street: 'Bahnhofstrasse', + houseNumber: '1', + zip: '8001', + city: 'Winterthur', + country: 41, + ), + ), + ); late _MockRealUnitLegalService legalService; late _MockAppStore appStore; late _MockAWallet wallet; @@ -101,6 +134,59 @@ void main() { ); }); + // The personal-data step only renders its correction form when the registration payload reaches it. + // Both hops are easy to drop silently — `_continueKyc` forwarding it into `KycSuccess`, and the + // manager passing it to the page — and either one makes the gate refuse for EVERY account, which is + // exactly the dead end this step exists to remove. + testWidgets( + 'KycSuccess(personalData) renders the form, not the refusal screen', + (tester) async { + when(() => registrationService.getRegistrationInfo()).thenAnswer( + (_) async => RealUnitRegistrationInfoDto( + state: RealUnitRegistrationState.alreadyRegistered, + realUnitUserDataDto: personalUserData(), + ), + ); + when(() => kycService.getKycStatus()).thenAnswer( + (_) async => _kycStatus( + level: KycLevel.level20, + processStatus: KycProcessStatus.inProgress, + ), + ); + when(() => kycService.getUser()).thenAnswer((_) async => _user()); + when(() => kycService.continueKyc()).thenAnswer( + (_) async => _session( + level: KycLevel.level20, + steps: const [], + currentStep: _currentStep(KycStepName.personalData), + ), + ); + + // the page resolves both from getIt + final getIt = GetIt.instance; + getIt.registerSingleton(kycService); + getIt.registerSingleton(fixtureCountryService()); + addTearDown(() async => getIt.reset()); + + final cubit = KycCubit(kycService, registrationService, legalService, appStore); + await tester.pumpApp( + BlocProvider.value(value: cubit, child: const KycViewManager()), + ); + + await cubit.checkKyc(); + await tester.pumpAndSettle(); + + expect(cubit.state, isA()); + expect((cubit.state as KycSuccess).currentStep, KycStep.personalData); + // the payload survived both hops + expect((cubit.state as KycSuccess).realUnitUserData, isNotNull); + expect(find.byType(KycPersonalDataView), findsOneWidget); + expect(find.byType(KycFailurePage), findsNothing); + + await cubit.close(); + }, + ); + // An in-progress `dfxApproval` step used to land on a blank white Scaffold // (the `(_) => const Scaffold()` fallback in KycViewManager). It must render // the existing pending page instead. @@ -185,19 +271,22 @@ void main() { }, ); - // The KycUnsupportedStepFailure arm renders a KycFailurePage with the - // unsupported step name — a state no page test drives directly. + // The KycUnsupportedStepFailure arm renders the actionable handoff, never the generic failure page + // (which carries no actions) and never the raw wire identifier of the step. testWidgets( - 'KycViewManager renders KycFailurePage for KycUnsupportedStepFailure', + 'KycViewManager renders KycUnsupportedStepPage for KycUnsupportedStepFailure', (tester) async { final cubit = _MockKycCubit(); when(() => cubit.state).thenReturn( - const KycUnsupportedStepFailure(KycStepName.personalData), + const KycUnsupportedStepFailure(KycStepName.statutes), ); await tester.pumpApp(viewWithState(cubit)); - expect(find.byType(KycFailurePage), findsOneWidget); + expect(find.byType(KycUnsupportedStepPage), findsOneWidget); + expect(find.byType(KycFailurePage), findsNothing); + // the internal step name must not leak into the UI + expect(find.textContaining(KycStepName.statutes.value), findsNothing); }, ); diff --git a/test/screens/kyc/steps/kyc_personal_data_page_test.dart b/test/screens/kyc/steps/kyc_personal_data_page_test.dart new file mode 100644 index 000000000..720475d93 --- /dev/null +++ b/test/screens/kyc/steps/kyc_personal_data_page_test.dart @@ -0,0 +1,341 @@ +import 'dart:async'; + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:http/testing.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_country_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_kyc_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/country/country.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/registration/kyc/kyc_personal_data.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/user/dto/real_unit_user_data_dto.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; +import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/kyc_personal_data_page.dart'; +import 'package:realunit_wallet/widgets/form/country_field.dart'; +import 'package:realunit_wallet/widgets/form/labeled_text_field.dart'; +import 'package:realunit_wallet/widgets/form/phone_number_field.dart'; + +import '../../../helper/country_fixture.dart'; +import '../../../helper/pump_app.dart'; + +class MockKycPersonalDataCubit extends MockCubit + implements KycPersonalDataCubit {} + +class MockKycCubit extends MockCubit implements KycCubit {} + +class MockDfxKycService extends Mock implements DfxKycService {} + +void main() { + late KycPersonalDataCubit personalDataCubit; + late KycCubit kycCubit; + const url = 'https://example.com/kyc/data/personal/1'; + + RealUnitUserDataDto userDataDto({ + KycAccountType accountType = KycAccountType.personal, + String phone = '+41790000000', + }) => RealUnitUserDataDto( + email: 'erika@example.com', + name: 'Erika Mueller', + type: 'HUMAN', + phoneNumber: phone, + birthday: '1990-01-01', + nationality: 'CH', + addressStreet: 'Bahnhofstrasse 1', + addressPostalCode: '8001', + addressCity: 'Winterthur', + addressCountry: 'CH', + swissTaxResidence: true, + lang: 'EN', + kycData: KycPersonalData( + accountType: accountType, + firstName: 'Erika', + lastName: 'Mueller', + phone: phone, + address: const KycAddress( + street: 'Bahnhofstrasse', + houseNumber: '1', + zip: '8001', + city: 'Winterthur', + country: 41, + ), + ), + ); + + setUp(() { + personalDataCubit = MockKycPersonalDataCubit(); + kycCubit = MockKycCubit(); + + when(() => personalDataCubit.state).thenReturn(const KycPersonalDataInitial()); + when(() => personalDataCubit.stream).thenAnswer((_) => const Stream.empty()); + when(() => kycCubit.state).thenReturn(const KycInitial()); + when(() => kycCubit.checkKyc()).thenAnswer((_) => Future.value()); + }); + + void setupDependencyInjection() { + final getIt = GetIt.instance; + getIt.registerSingleton(MockDfxKycService()); + getIt.registerSingleton(fixtureCountryService()); + } + + setUpAll(() { + setupDependencyInjection(); + registerFallbackValue( + const Country(id: 41, symbol: 'CH', name: 'Switzerland', kycAllowed: true), + ); + registerFallbackValue(KycAccountType.personal); + }); + + tearDownAll(() async => await GetIt.instance.reset()); + + Widget buildSubject(Widget child) { + return MultiBlocProvider( + providers: [ + BlocProvider.value(value: personalDataCubit), + BlocProvider.value(value: kycCubit), + ], + child: child, + ); + } + + group('$KycPersonalDataPage', () { + testWidgets('renders $KycPersonalDataView', (tester) async { + await tester.pumpApp(KycPersonalDataPage(url: url, initialUserData: userDataDto())); + + expect(find.byType(KycPersonalDataView), findsOne); + }); + }); + + group('$KycPersonalDataPage account-type guard', () { + // Submitting this form sets `accountType` on the account, and the API nulls every organization + // field whenever that value is Personal — so offering the form to a non-personal account would + // destroy its organization data and drop the org-only steps from its required set. + for (final type in [KycAccountType.organization, KycAccountType.soleProprietorship]) { + testWidgets('refuses the form for a $type account', (tester) async { + await tester.pumpApp( + KycPersonalDataPage(url: url, initialUserData: userDataDto(accountType: type)), + ); + + expect(find.byType(KycPersonalDataView), findsNothing); + expect(find.byType(KycUnsupportedStepPage), findsOne); + }); + } + + // A missing payload is transient (the registration row has no signed payload yet), so it gets + // its own refresh surface rather than the shared handoff an unsupported account type gets. + testWidgets('offers a retry, not a dead end, when the payload is missing', (tester) async { + await tester.pumpApp( + BlocProvider.value( + value: kycCubit, + child: const KycPersonalDataPage(url: url), + ), + ); + + expect(find.byType(KycPersonalDataView), findsNothing); + expect(find.byType(KycUnsupportedStepPage), findsNothing); + + await tester.tap(find.byType(FilledButton)); + await tester.pump(); + + verify(() => kycCubit.checkKyc()).called(1); + }); + }); + + group('$KycPersonalDataView', () { + testWidgets('renders every field the personal-data step submits', (tester) async { + await tester.pumpApp(buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto()))); + + // six placed directly (first/last name, street, house number, postcode, city) plus the one + // PhoneNumberField nests for the number input + expect(find.byType(LabeledTextField), findsNWidgets(7)); + expect(find.byType(PhoneNumberField), findsOne); + expect(find.byType(CountryField), findsOne); + expect(find.byType(FilledButton), findsOne); + }); + + // The copy asks the user to check their details and every submit rewrites all of them, so an + // empty form would force a from-memory re-entry and let a typo overwrite correct data. + testWidgets('seeds the form from the registration payload', (tester) async { + await tester.pumpApp( + buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto())), + ); + await tester.pumpAndSettle(); + + expect(find.text('Erika'), findsOne); + expect(find.text('Mueller'), findsOne); + expect(find.text('Bahnhofstrasse'), findsOne); + expect(find.text('8001'), findsOne); + expect(find.text('Winterthur'), findsOne); + }); + + // A stored number with a dial code the field does not offer must still leave an editable field: + // PhoneNumberField falls back to its first prefix rather than leaving `prefix` null, which would + // render a blank dropdown and make it silently drop every edit the user makes. + testWidgets('stays editable when the stored phone has an unsupported prefix', (tester) async { + final dto = userDataDto(phone: '+33612345678'); + await tester.pumpApp(buildSubject(KycPersonalDataView(url: url, initialUserData: dto))); + await tester.pumpAndSettle(); + + expect(find.text('+41'), findsOne); + }); + + // The country lookup is fire-and-forget; without a catch a failing GET escapes as an uncaught + // async error instead of degrading to an empty picker. + testWidgets('survives a failing country lookup', (tester) async { + final getIt = GetIt.instance; + await getIt.reset(); + getIt.registerSingleton(MockDfxKycService()); + getIt.registerSingleton(failingCountryService()); + addTearDown(() async { + await getIt.reset(); + setupDependencyInjection(); + }); + + await tester.pumpApp( + buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto())), + ); + await tester.pumpAndSettle(); + + // the rest of the form still rendered + expect(find.text('Erika'), findsOne); + }); + + // Two independent country lookups race — this page's and CountryField's own. If this one is the + // slower, it must not overwrite a country the user has already chosen in the meantime. + testWidgets('does not overwrite a country the user already picked', (tester) async { + final gate = Completer(); + var served = 0; + final getIt = GetIt.instance; + await getIt.reset(); + getIt.registerSingleton(MockDfxKycService()); + getIt.registerSingleton( + countryServiceWithClient( + MockClient((_) async { + // hold only the first caller (this page); let CountryField's own load through + if (served++ == 0) await gate.future; + return countriesFixtureResponse(); + }), + ), + ); + addTearDown(() async { + await getIt.reset(); + setupDependencyInjection(); + }); + + await tester.pumpApp( + buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto())), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.byType(CountryField)); + await tester.pumpAndSettle(); + await tester.tap(find.text('Germany').last); + await tester.pumpAndSettle(); + + gate.complete(); + await tester.pumpAndSettle(); + + expect(find.text('Germany'), findsOne); + expect(find.text('Switzerland'), findsNothing); + }); + + // Pins the url plumbing: the step's session url is what the submit PUTs to. + testWidgets('submits the seeded values to the step url', (tester) async { + when(() => personalDataCubit.submit( + url: any(named: 'url'), + accountType: any(named: 'accountType'), + firstName: any(named: 'firstName'), + lastName: any(named: 'lastName'), + phone: any(named: 'phone'), + street: any(named: 'street'), + houseNumber: any(named: 'houseNumber'), + zip: any(named: 'zip'), + city: any(named: 'city'), + country: any(named: 'country'), + )).thenAnswer((_) async {}); + + await tester.pumpApp( + buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto())), + ); + await tester.pumpAndSettle(); + + await tester.ensureVisible(find.byType(FilledButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(FilledButton)); + await tester.pump(); + + verify(() => personalDataCubit.submit( + url: url, + accountType: KycAccountType.personal, + firstName: 'Erika', + lastName: 'Mueller', + phone: '+41790000000', + street: 'Bahnhofstrasse', + houseNumber: '1', + zip: '8001', + city: 'Winterthur', + country: any(named: 'country'), + )).called(1); + }); + + // The step exists so a rejected account can correct its data; submitting an empty form must + // surface the validation errors rather than PUT an incomplete body. + testWidgets('does not submit while a required field is empty', (tester) async { + await tester.pumpApp( + buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto())), + ); + await tester.pumpAndSettle(); + + await tester.enterText(find.widgetWithText(LabeledTextField, 'Erika'), ''); + await tester.ensureVisible(find.byType(FilledButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(FilledButton)); + await tester.pump(); + + verifyNever(() => personalDataCubit.submit( + url: any(named: 'url'), + accountType: any(named: 'accountType'), + firstName: any(named: 'firstName'), + lastName: any(named: 'lastName'), + phone: any(named: 'phone'), + street: any(named: 'street'), + houseNumber: any(named: 'houseNumber'), + zip: any(named: 'zip'), + city: any(named: 'city'), + country: any(named: 'country'), + )); + }); + }); + + group('$BlocListener', () { + testWidgets('triggers checkKyc when the submit succeeds', (tester) async { + whenListen( + personalDataCubit, + Stream.fromIterable([const KycPersonalDataSuccess()]), + initialState: const KycPersonalDataInitial(), + ); + + await tester.pumpApp(buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto()))); + await tester.pump(); + + verify(() => kycCubit.checkKyc()).called(1); + }); + + testWidgets('shows a SnackBar when the submit fails', (tester) async { + whenListen( + personalDataCubit, + Stream.fromIterable([const KycPersonalDataFailure('fail')]), + initialState: const KycPersonalDataInitial(), + ); + + await tester.pumpApp(buildSubject(KycPersonalDataView(url: url, initialUserData: userDataDto()))); + await tester.pump(); + + expect(find.byType(SnackBar), findsOne); + }); + }); +} diff --git a/test/screens/kyc/steps/personal_data/kyc_personal_data_cubit_test.dart b/test/screens/kyc/steps/personal_data/kyc_personal_data_cubit_test.dart new file mode 100644 index 000000000..f5b57bd01 --- /dev/null +++ b/test/screens/kyc/steps/personal_data/kyc_personal_data_cubit_test.dart @@ -0,0 +1,98 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/packages/service/dfx/dfx_kyc_service.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/country/country.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/registration/kyc/kyc_personal_data.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/cubit/kyc_personal_data/kyc_personal_data_cubit.dart'; + +class _MockKycService extends Mock implements DfxKycService {} + +const _switzerland = Country( + id: 41, + symbol: 'CH', + name: 'Switzerland', + kycAllowed: true, +); + +void main() { + late _MockKycService service; + + setUpAll(() { + registerFallbackValue({}); + }); + + setUp(() { + service = _MockKycService(); + }); + + KycPersonalDataCubit build() => KycPersonalDataCubit(service); + + Future submit(KycPersonalDataCubit c) => c.submit( + url: 'https://kyc/data/personal/1', + accountType: KycAccountType.personal, + firstName: 'Erika', + lastName: 'Mueller', + phone: '+41790000000', + street: 'Bahnhofstrasse', + houseNumber: '13', + zip: '8001', + city: 'Zurich', + country: _switzerland, + ); + + group('initial state', () { + test('emits $KycPersonalDataInitial', () { + expect(build().state, isA()); + }); + }); + + group('submit', () { + blocTest( + 'success: forwards the KycPersonalData body to setData; Loading → Success', + setUp: () => when(() => service.setData(any(), any())).thenAnswer((_) async {}), + build: build, + act: submit, + expect: () => const [KycPersonalDataLoading(), KycPersonalDataSuccess()], + verify: (_) => verify( + () => service.setData('https://kyc/data/personal/1', { + 'accountType': 'Personal', + 'firstName': 'Erika', + 'lastName': 'Mueller', + 'phone': '+41790000000', + 'address': { + 'street': 'Bahnhofstrasse', + 'houseNumber': '13', + 'zip': '8001', + 'city': 'Zurich', + 'country': {'id': 41}, + }, + }), + ).called(1), + ); + + blocTest( + 'failure: setData throws → Loading → Failure(e.toString())', + setUp: () => when( + () => service.setData(any(), any()), + ).thenAnswer((_) async => throw Exception('boom')), + build: build, + act: submit, + expect: () => [ + const KycPersonalDataLoading(), + isA().having((s) => s.message, 'message', contains('boom')), + ], + ); + }); + + group('$KycPersonalDataFailure', () { + test('Equatable props cover message', () { + const a = KycPersonalDataFailure('x'); + const b = KycPersonalDataFailure('x'); + const c = KycPersonalDataFailure('y'); + + expect(a, b); + expect(a, isNot(c)); + }); + }); +} diff --git a/test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart b/test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart index 8f42e609b..f016054bc 100644 --- a/test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart +++ b/test/screens/kyc/subpages/kyc_status_pages_responsive_matrix_test.dart @@ -12,6 +12,10 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:realunit_wallet/setup/routing/routes/support_routes.dart'; +import 'package:realunit_wallet/widgets/buttons/app_text_button.dart'; +import 'package:realunit_wallet/screens/kyc/steps/personal_data/kyc_personal_data_page.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; import 'package:realunit_wallet/generated/i18n.dart'; import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; import 'package:realunit_wallet/screens/kyc/subpages/kyc_completed_page.dart'; @@ -74,6 +78,54 @@ void main() { /// Hosts [KycCompletedPage] under a two-route GoRouter so `context.pop` has /// somewhere to go back to (mirrors support_email_capture_page_test). + /// Hosts the unsupported-step page under a router so its support CTA — which navigates — can be + /// really tapped. `pumpPage` cannot: it mounts pages under `MaterialApp(home:)`, and a tap would + /// throw "No GoRouter found in context". + Future pumpUnsupportedStepPage( + WidgetTester tester, + MatrixCell cell, + ) async { + await tester.binding.setSurfaceSize(cell.device.size); + addTearDown(() async { + await tester.binding.setSurfaceSize(null); + }); + + final router = GoRouter( + initialLocation: '/', + routes: [ + GoRoute( + path: '/', + builder: (_, _) => BlocProvider.value( + value: cubit, + child: const KycUnsupportedStepPage(), + ), + ), + GoRoute( + name: SupportRoutes.support, + path: '/support', + builder: (_, _) => const Scaffold(body: Text('SUPPORT')), + ), + ], + ); + addTearDown(router.dispose); + + await tester.pumpWidget( + MediaQuery( + data: cell.mediaQuery, + child: MaterialApp.router( + theme: realUnitTheme, + locale: const Locale('de'), + localizationsDelegates: _localizationsDelegates, + supportedLocales: S.delegate.supportedLocales, + routerConfig: router, + ), + ), + ); + await tester.pumpAndSettle(); + + return router; + } + Future pumpCompletedPage( WidgetTester tester, MatrixCell cell, @@ -173,6 +225,72 @@ void main() { } }); + // Two live tap targets in one sticky block, so both are asserted rather than just the primary CTA. + // The DE copy is long enough that the 3.0 text-scale cells are the point of this group. + group('KycUnsupportedStepPage responsive matrix (full device × textScale)', () { + for (final cell in kFullResponsiveMatrix) { + testWidgets(cell.id, (tester) async { + await withTargetPlatform(cell.device.platform, () async { + await expectNoLayoutOverflow( + tester, + () async { + await pumpUnsupportedStepPage(tester, cell); + }, + reason: 'overflow on KycUnsupportedStepPage / ${cell.label}', + ); + + await expectFullyTappable( + tester, + find.byType(AppFilledButton), + within: find.byType(KycUnsupportedStepPage), + reason: 'KycUnsupportedStepPage / ${cell.label}: retry not tappable', + ); + + // Asserted for real, not inferred from the overflow check: ScrollableActionsLayout scrolls + // an over-tall action block instead of overflowing, so a CTA pushed out of the viewport + // raises nothing. Only a hit test catches it. + await expectFullyTappable( + tester, + find.byType(AppTextButton), + within: find.byType(KycUnsupportedStepPage), + reason: 'KycUnsupportedStepPage / ${cell.label}: support CTA not tappable', + ); + }); + }); + } + }); + + group('KycPersonalDataPage missing-payload responsive matrix (full device × textScale)', () { + for (final cell in kFullResponsiveMatrix) { + testWidgets(cell.id, (tester) async { + await withTargetPlatform(cell.device.platform, () async { + await expectNoLayoutOverflow( + tester, + () async { + await pumpPage( + tester, + cell, + BlocProvider.value( + value: cubit, + // null payload → the defensive refresh surface + child: const KycPersonalDataPage(url: 'https://example.com'), + ), + ); + }, + reason: 'overflow on KycPersonalDataPage(missing payload) / ${cell.label}', + ); + + await expectFullyTappable( + tester, + find.byType(AppFilledButton), + within: find.byType(KycPersonalDataPage), + reason: 'KycPersonalDataPage(missing payload) / ${cell.label}: CTA not tappable', + ); + }); + }); + } + }); + group('KycPendingPage responsive matrix (full device × textScale)', () { for (final cell in kFullResponsiveMatrix) { testWidgets(cell.id, (tester) async { diff --git a/test/screens/kyc/subpages/kyc_unsupported_step_page_test.dart b/test/screens/kyc/subpages/kyc_unsupported_step_page_test.dart new file mode 100644 index 000000000..aa29aaecf --- /dev/null +++ b/test/screens/kyc/subpages/kyc_unsupported_step_page_test.dart @@ -0,0 +1,104 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:realunit_wallet/generated/i18n.dart'; +import 'package:realunit_wallet/setup/routing/routes/support_routes.dart'; +import 'package:realunit_wallet/packages/service/dfx/models/kyc/kyc_level.dart'; +import 'package:realunit_wallet/screens/kyc/cubits/kyc/kyc_cubit.dart'; +import 'package:realunit_wallet/screens/kyc/subpages/kyc_unsupported_step_page.dart'; +import 'package:realunit_wallet/widgets/buttons/app_filled_button.dart'; +import 'package:realunit_wallet/widgets/buttons/app_text_button.dart'; + +import '../../../helper/pump_app.dart'; + +class _MockKycCubit extends MockCubit implements KycCubit {} + +void main() { + late _MockKycCubit kycCubit; + + // Hosting a router is what makes the support handoff assertable: without one the CTA's + // `pushNamed` throws, so a test that only checks the button exists proves nothing about where it + // goes. Mirrors settings_contact_page_test. + late List pushedRoutes; + + setUp(() { + kycCubit = _MockKycCubit(); + when(() => kycCubit.state).thenReturn(const KycInitial()); + when(() => kycCubit.checkKyc()).thenAnswer((_) => Future.value()); + pushedRoutes = []; + }); + + Widget subject() => BlocProvider.value( + value: kycCubit, + child: const KycUnsupportedStepPage(), + ); + + GoRouter buildRouter() => GoRouter( + initialLocation: '/', + routes: [ + GoRoute(path: '/', builder: (_, _) => subject()), + GoRoute( + name: SupportRoutes.support, + path: '/support', + builder: (_, _) { + pushedRoutes.add(SupportRoutes.support); + return const Scaffold(body: Text('SUPPORT')); + }, + ), + ], + ); + + group('$KycUnsupportedStepPage', () { + testWidgets('offers both a retry and a route to support', (tester) async { + await tester.pumpApp(subject()); + + expect(find.byType(AppFilledButton), findsOne); + expect(find.byType(AppTextButton), findsOne); + }); + + testWidgets('the support action navigates to the support screen', (tester) async { + await tester.pumpWidget( + MaterialApp.router( + // pumpApp cannot host a router, so the delegates it normally supplies are repeated here + localizationsDelegates: [S.delegate, GlobalMaterialLocalizations.delegate], + supportedLocales: S.delegate.supportedLocales, + routerConfig: buildRouter(), + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.byType(AppTextButton)); + await tester.pumpAndSettle(); + + expect(pushedRoutes, [SupportRoutes.support]); + }); + + // The whole point of the page: the previous screen was a dead end with no actions at all. + testWidgets('the retry re-reads the KYC state', (tester) async { + await tester.pumpApp(subject()); + + await tester.tap(find.byType(AppFilledButton)); + await tester.pump(); + + verify(() => kycCubit.checkKyc()).called(1); + }); + + // The step identifier is an internal enum value; surfacing it told the user nothing and was the + // defect this page replaces. + testWidgets('never renders an internal step identifier', (tester) async { + await tester.pumpApp(subject()); + + for (final name in KycStepName.values) { + expect( + find.textContaining(name.value), + findsNothing, + reason: 'the wire identifier ${name.value} must not reach the UI', + ); + } + }); + }); +} diff --git a/test/screens/kyc_bitbox_create_wallet_states_test.dart b/test/screens/kyc_bitbox_create_wallet_states_test.dart index 2fb1438da..4e2b9d442 100644 --- a/test/screens/kyc_bitbox_create_wallet_states_test.dart +++ b/test/screens/kyc_bitbox_create_wallet_states_test.dart @@ -9,13 +9,14 @@ const _testSeed = void main() { group('$KycState', () { - test('KycStep enum has all 10 documented variants', () { + test('KycStep enum has all 11 documented variants', () { // The KycCubit advances through these steps in order; pin the set so a // refactor that drops one surfaces here. expect(KycStep.values.toSet(), { KycStep.email, KycStep.confirmEmail, KycStep.registration, + KycStep.personalData, KycStep.linkWallet, KycStep.legalDisclaimer, KycStep.nationality, From f1c1ea7a4f22b19c74289b8006bcfabc0f1ac8ef Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Mon, 3 Aug 2026 22:55:28 +0200 Subject: [PATCH 3/4] feat(crash-reporting): opt-in crash reporting behind a build-time SENTRY_DSN gate (#878) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Two customer cases this week reached support with **zero diagnostic evidence**: a BitBox02 USB connect crash/hang on Android and a registration-signing blocker (both 23.07.). Server-side request tracing covers everything that reaches the API — but a client-side crash before any request is invisible. The app has no crash reporter; every error thrown from a `Future`, `Stream` or `Timer` callback vanishes without trace (#866 documents this gap explicitly, and `installErrorHandlers()` was designed as the hook a reporter plugs into). ## Change - **`sentry_flutter` behind a compile-time gate.** `initCrashReporting()` (new, `lib/setup/error_handling/crash_reporting.dart`) reads `--dart-define=SENTRY_DSN`. Without an injected DSN — i.e. in every local, test and current CI build — the SDK never starts and produces no network traffic. The app behaves exactly as before this PR. - **Best-effort by contract:** a malformed DSN or a failing native binding is logged and swallowed inside `initCrashReporting()` — reporting infrastructure can never keep the wallet from starting. Covered by a dedicated test. - **Wiring order is load-bearing:** `main()` calls `initCrashReporting()` *after* `installErrorHandlers()`, because `installErrorHandlers()` overwrites `PlatformDispatcher.onError` without chaining — the reverse order would silently drop the SDK's async-error hook. The SDK itself chains both handlers it wraps (`FlutterError.onError`: capture, then delegate; `PlatformDispatcher.onError`: delegate, then capture). In release mode the native splash is now preserved *before* this first await, so the added async gap cannot flash the splash to blank. - **Pinned option surface** — the guarantee is exactly this list: `sendDefaultPii=false`, `attachScreenshot=false`, `enableAutoSessionTracking=false`, `tracesSampleRate=null` — error events only, no session telemetry. Native crash handling and ANR detection deliberately stay on their SDK defaults: they produce precisely the error events this reporter exists for. View-hierarchy attachment stays off by SDK default; its option is experimental and deliberately not referenced. Environment defaults to `production`, overridable via `--dart-define=SENTRY_ENVIRONMENT`. - **CONTRIBUTING § API Access:** adds the one scoped exception for first-party crash reporting, and declares any widening of the reported data (breadcrumbs with request URLs, user context, attachments) a review-blocking change. ## Tests - `test/setup/error_handling/crash_reporting_test.dart`: DSN gate (no-op without DSN, exactly one init with DSN), the full pinned option set, and the swallow-on-failure contract, via the injectable `CrashReporterInit` — no platform channels involved. - `// @no-integration-test` annotation on `initCrashReporting` per CONTRIBUTING: the native SDK only starts in builds that inject a DSN, which no test build does. ## Open points before this becomes effective 1. **Release pipeline:** the release workflow must inject `SENTRY_DSN` (repo/environment secret + `--dart-define`) — deliberately a separate PR, so this one stays inert and fully reviewable on its own. 2. **Native release build check:** PR CI runs analyze + tests; the first tagged build after the pipeline change should be smoke-checked once (Android Gradle / iOS pods pull in the native SDK parts). 3. **Follow-up (separate PR):** attach BitBox device context (product, firmware version) and connect-flow breadcrumbs after connect, so hardware-related crashes carry the device facts that today require asking the customer. --- CONTRIBUTING.md | 1 + lib/main.dart | 8 +- lib/setup/error_handling/crash_reporting.dart | 75 +++++++++++++++++++ lib/setup/error_handling/error_handlers.dart | 6 +- pubspec.lock | 40 ++++++++++ pubspec.yaml | 1 + .../error_handling/crash_reporting_test.dart | 57 ++++++++++++++ 7 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 lib/setup/error_handling/crash_reporting.dart create mode 100644 test/setup/error_handling/crash_reporting_test.dart diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 90547ff1f..da7f04aac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,6 +53,7 @@ The auto-opened promotion PRs are idempotent — only one is open per branch pai - **No third-party APIs**: no direct Ethereum JSON-RPC calls (Infura, Alchemy, public nodes, etc.), no block explorer APIs (Etherscan, …), no price feeds, no analytics endpoints, no third-party SDKs that call out over the network. - If a feature needs on-chain data (e.g. native ETH balance, transaction status, token balance), add a new endpoint to [`DFXswiss/api`](https://github.com/DFXswiss/api) and let the app call that endpoint. The API is the single gateway. - All network calls must go through `AppStore.httpClient` with `buildUri(_host, …)` — `_host` resolves to the DFX API host via `ApiConfig`. Do not instantiate `http.Client`/`Dio`/`Web3Client` against other hosts. +- **One scoped exception — crash reporting.** Builds that inject `--dart-define=SENTRY_DSN=...` deliver crash reports to the company-operated crash-reporting service ([`lib/setup/error_handling/crash_reporting.dart`](lib/setup/error_handling/crash_reporting.dart)). This is first-party infrastructure telemetry, not a third-party service: without an injected DSN (all local and test builds) the SDK never starts and produces no network traffic, and the delivered data is limited to error events — no PII, no screenshots, no performance tracing, no session telemetry (the exact pinned option surface lives in `crash_reporting.dart`). Widening what is sent (breadcrumbs with request URLs, user context, attachments) is a review-blocking change, not a config tweak. ## API as Decision Authority — CRITICAL diff --git a/lib/main.dart b/lib/main.dart index cb13b4100..47c34073c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'package:realunit_wallet/screens/home/bloc/home_bloc.dart'; import 'package:realunit_wallet/screens/pin/bloc/auth/pin_auth_cubit.dart'; import 'package:realunit_wallet/screens/settings/bloc/settings_bloc.dart'; import 'package:realunit_wallet/setup/di.dart'; +import 'package:realunit_wallet/setup/error_handling/crash_reporting.dart'; import 'package:realunit_wallet/setup/error_handling/error_handlers.dart'; import 'package:realunit_wallet/setup/lifecycle_initializer.dart'; import 'package:realunit_wallet/setup/routing/boot_navigation.dart'; @@ -19,10 +20,15 @@ Future main() async { final widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); installErrorHandlers(); + // Preserve before the first await: an async gap ahead of preserve() would + // let the native splash auto-dismiss and flash to blank. + if (kReleaseMode) FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); + // After installErrorHandlers on purpose: the reporter chains the handlers + // installed above, while installErrorHandlers overwrites the async hook. + await initCrashReporting(); // only preserve splash screen for 3 seconds for release version if (kReleaseMode) { - FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); await _initializeWithSplashDuration(); FlutterNativeSplash.remove(); } else { diff --git a/lib/setup/error_handling/crash_reporting.dart b/lib/setup/error_handling/crash_reporting.dart new file mode 100644 index 000000000..b9aa5bac2 --- /dev/null +++ b/lib/setup/error_handling/crash_reporting.dart @@ -0,0 +1,75 @@ +import 'dart:developer' as developer; + +import 'package:flutter/foundation.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + +/// The crash-reporting DSN, injected at build time via +/// `--dart-define=SENTRY_DSN=...`. Local and CI builds that do not inject a +/// DSN get the empty default, which keeps crash reporting fully disabled — +/// no SDK start, no network traffic. The DSN points at the company-operated +/// crash-reporting service; see CONTRIBUTING § API Access for why this is the +/// one sanctioned non-API endpoint. +const crashReportingDsn = String.fromEnvironment('SENTRY_DSN'); + +/// Reported as the Sentry environment. Only release builds carrying a DSN +/// report at all, so the default names the production environment; testnet +/// builds can override via `--dart-define=SENTRY_ENVIRONMENT=...`. +const crashReportingEnvironment = String.fromEnvironment( + 'SENTRY_ENVIRONMENT', + defaultValue: 'production', +); + +/// Matches the shape of [SentryFlutter.init] so tests can swap in a recording +/// fake without touching the native SDK. +typedef CrashReporterInit = Future Function(FlutterOptionsConfiguration configuration); + +/// Starts crash reporting when a DSN was injected at build time; a no-op +/// otherwise. Best-effort by design: a malformed DSN or a failing native +/// binding is logged and swallowed — reporting infrastructure must never keep +/// the wallet from starting. +/// +/// Must run AFTER [installErrorHandlers]: that installer overwrites +/// `PlatformDispatcher.onError` without chaining, so in the reverse order the +/// SDK's async-error hook would be silently dropped. The SDK itself chains +/// both handlers it wraps — `FlutterError.onError` captures first and then +/// delegates to the handler installed before it; `PlatformDispatcher.onError` +/// delegates first and then captures. +/// +/// @no-integration-test: the native SDK only starts in a build that injects a +/// DSN, which no test build does; the DSN gate, the option pinning and the +/// swallow-on-failure contract are covered by unit tests via the injectable +/// [init]. +Future initCrashReporting({ + String dsn = crashReportingDsn, + CrashReporterInit init = SentryFlutter.init, +}) async { + if (dsn.isEmpty) return; + try { + await init((options) => configureCrashReporting(options, dsn: dsn)); + } catch (error, stackTrace) { + developer.log( + 'crash reporting init failed: $error', + name: 'WalletApp', + error: error, + stackTrace: stackTrace, + ); + } +} + +/// Applies the pinned option set. The guarantee is exactly this list — an +/// upstream default flip outside it is not caught here: no PII, no +/// screenshots, no performance tracing, no session telemetry. Native crash +/// handling and ANR detection stay on their SDK defaults deliberately; they +/// produce precisely the error events this reporter exists for. +/// (View-hierarchy attachment also stays off by SDK default; its option is +/// experimental and deliberately not referenced here.) +@visibleForTesting +void configureCrashReporting(SentryFlutterOptions options, {required String dsn}) { + options + ..dsn = dsn + ..environment = crashReportingEnvironment + ..sendDefaultPii = false + ..attachScreenshot = false + ..enableAutoSessionTracking = false + ..tracesSampleRate = null; +} diff --git a/lib/setup/error_handling/error_handlers.dart b/lib/setup/error_handling/error_handlers.dart index a38ae7448..87423a680 100644 --- a/lib/setup/error_handling/error_handlers.dart +++ b/lib/setup/error_handling/error_handlers.dart @@ -27,9 +27,9 @@ import 'package:realunit_wallet/setup/error_handling/realunit_error_view.dart'; /// engine's own reporting running instead of suppressing it (returning `true` /// would claim the error as handled while our log is a no-op, i.e. total /// silence). So this makes async errors *reachable where a developer is already -/// attached*; it adds no release-mode visibility on its own. Getting evidence -/// off a customer's device needs a crash reporter or a persisted log sink — -/// this handler body is the hook such a sink plugs into. +/// attached*; it adds no release-mode visibility on its own. Release-mode +/// evidence comes from the crash reporter (`crash_reporting.dart`), which is +/// initialized after this call and chains the handlers installed here. /// /// @no-integration-test: the engine-side fallback reporting that runs after /// [PlatformDispatcher.onError] returns false is embedder behaviour and is not diff --git a/pubspec.lock b/pubspec.lock index a6d39b085..a68f0b590 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -823,6 +823,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + jni: + dependency: transitive + description: + name: jni + sha256: d2c361082d554d4593c3012e26f6b188f902acd291330f13d6427641a92b3da1 + url: "https://pub.dev" + source: hosted + version: "0.14.2" js: dependency: transitive description: @@ -1087,6 +1095,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" + url: "https://pub.dev" + source: hosted + version: "9.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: "direct main" description: @@ -1271,6 +1295,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + sentry: + dependency: transitive + description: + name: sentry + sha256: a84bf3a83b3ce1c89fce28b9f97659e3826df14a73a256952465aac2c5efdf5a + url: "https://pub.dev" + source: hosted + version: "9.25.0" sentry_dart_plugin: dependency: "direct dev" description: @@ -1279,6 +1311,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.4.0" + sentry_flutter: + dependency: "direct main" + description: + name: sentry_flutter + sha256: c85575266d91f57364e9b4cb522835156ec3c5581c78339dc7fae491cd0c6f76 + url: "https://pub.dev" + source: hosted + version: "9.25.0" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0a22ecbc0..775cd3438 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,6 +72,7 @@ dependencies: path_provider: 2.1.5 pointycastle: ^3.9.1 qr_flutter: ^4.1.0 + sentry_flutter: ^9.25.0 shared_preferences: ^2.5.2 sqlite3: ^3.3.0 url_launcher: ^6.3.1 diff --git a/test/setup/error_handling/crash_reporting_test.dart b/test/setup/error_handling/crash_reporting_test.dart new file mode 100644 index 000000000..b1aa3a1b6 --- /dev/null +++ b/test/setup/error_handling/crash_reporting_test.dart @@ -0,0 +1,57 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:realunit_wallet/setup/error_handling/crash_reporting.dart'; + +void main() { + group('initCrashReporting', () { + test('stays a no-op when no DSN is injected', () async { + var initCalls = 0; + + await initCrashReporting( + dsn: '', + init: (_) async => initCalls++, + ); + + expect(initCalls, 0); + }); + + test('starts the reporter exactly once when a DSN is injected', () async { + var initCalls = 0; + + await initCrashReporting( + dsn: 'https://key@reporting.invalid/1', + init: (_) async => initCalls++, + ); + + expect(initCalls, 1); + }); + + test('applies the pinned option set', () async { + final options = SentryFlutterOptions(); + late FlutterOptionsConfiguration configuration; + + await initCrashReporting( + dsn: 'https://key@reporting.invalid/1', + init: (config) async => configuration = config, + ); + await configuration(options); + + expect(options.dsn, 'https://key@reporting.invalid/1'); + expect(options.environment, crashReportingEnvironment); + expect(options.sendDefaultPii, isFalse); + expect(options.attachScreenshot, isFalse); + expect(options.enableAutoSessionTracking, isFalse); + expect(options.tracesSampleRate, isNull); + }); + + test('swallows a failing reporter init instead of blocking startup', () async { + await expectLater( + initCrashReporting( + dsn: 'https://key@reporting.invalid/1', + init: (_) async => throw StateError('native binding unavailable'), + ), + completes, + ); + }); + }); +} From 98484cdae38c27596fb4db7b6becba9c04a94fce Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Mon, 3 Aug 2026 22:55:48 +0200 Subject: [PATCH 4/4] chore(l10n): remove unused `logout` string key (#748) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Follow-up to [#746](https://github.com/RealUnitCH/app/pull/746). That PR relabelled the Settings wallet action to **"Reset wallet" / "Wallet zurücksetzen"** and switched the confirm button to the existing `reset` key. The generic `logout` key — whose only consumer was that button — is now unreferenced. ## Change - Remove `"logout"` from `assets/languages/strings_de.arb` ("Abmelden") and `strings_en.arb` ("Logout"). ## Verification - `S.of(context).logout` has **0 call sites** across `lib/` and `test/` (`isLogout` in `settings_page.dart` is an unrelated local bool, not the key). - ARB stays valid; DE/EN key parity preserved (358 = 358). - No widget renders the string, so **no goldens change** and `Visual Regression` is unaffected. ## Test plan - [ ] `Analyze & Test` green - [ ] `Visual Regression` green (no baseline change expected) - [ ] `Coverage Floor Gate` green --- assets/languages/strings_de.arb | 1 - assets/languages/strings_en.arb | 1 - 2 files changed, 2 deletions(-) diff --git a/assets/languages/strings_de.arb b/assets/languages/strings_de.arb index ec6dfca44..a2da73a5c 100644 --- a/assets/languages/strings_de.arb +++ b/assets/languages/strings_de.arb @@ -163,7 +163,6 @@ "legalDocumentLoadFailedDescription": "Beim Laden des Dokuments ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", "legalDocuments": "Rechtsdokumente", "location": "Ort", - "logout": "Abmelden", "max": "Max", "month": "Monat", "name": "Name", diff --git a/assets/languages/strings_en.arb b/assets/languages/strings_en.arb index dcf3496cd..5b9dab60a 100644 --- a/assets/languages/strings_en.arb +++ b/assets/languages/strings_en.arb @@ -163,7 +163,6 @@ "legalDocumentLoadFailedDescription": "Something went wrong while loading this document. Please try again.", "legalDocuments": "Legal documents", "location": "Location", - "logout": "Logout", "max": "Max", "month": "Month", "name": "Name",