import "dart:io"; import "package:app_links_platform_interface/app_links_platform_interface.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_test/flutter_test.dart"; import "package:hive_flutter/hive_flutter.dart"; import "package:smol_mail/data/providers/providers.dart"; import "package:smol_mail/presentation/app_widget.dart"; import "package:smol_mail/smol/store.dart"; late final SmolStore store; // AppWidget subscribes to app_links on boot; in the test shell there is no // platform plugin to talk to, so the subscription points at this no-op. class _NoopAppLinks extends AppLinksPlatform { @override Future getInitialLink() async => null; @override Stream get uriLinkStream => const Stream.empty(); } void main() { // Hive's box opening is real file IO, which never completes inside a // testWidgets fake-async zone — so it happens here, outside one. setUpAll(() async { TestWidgetsFlutterBinding.ensureInitialized(); AppLinksPlatform.instance = _NoopAppLinks(); final dir = await Directory.systemTemp.createTemp("smol-widget-test"); Hive.init(dir.path); store = await SmolStore.open(dbPath: "${dir.path}/widget.db"); }); testWidgets("onboarding invites to create or restore an identity", (tester) async { await tester.pumpWidget( ProviderScope( overrides: [storeProvider.overrideWithValue(store)], child: const AppWidget(), ), ); await tester.pumpAndSettle(); expect(find.text("Create Identity"), findsOneWidget); expect(find.text("Restore From Seed"), findsOneWidget); }); }