import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:relationship_saver/features/local/local_models.dart'; import 'package:relationship_saver/features/local/local_repository.dart'; import 'package:relationship_saver/features/local/storage/local_data_store_in_memory.dart'; import 'package:relationship_saver/features/local/storage/local_data_store_provider.dart'; import 'package:relationship_saver/features/reminders/scheduling/reminder_scheduler.dart'; import 'package:relationship_saver/features/reminders/scheduling/reminder_scheduler_provider.dart'; import 'package:relationship_saver/features/share_intake/share_capture_models.dart'; import 'package:relationship_saver/features/share_intake/share_inbox_view.dart'; import 'package:relationship_saver/features/sync/storage/sync_state_store_in_memory.dart'; import 'package:relationship_saver/features/sync/storage/sync_state_store_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); testWidgets('shows queued inbox entry and allows dismiss', ( WidgetTester tester, ) async { final ProviderContainer container = ProviderContainer( overrides: [ localDataStoreProvider.overrideWithValue(InMemoryLocalDataStore()), syncStateStoreProvider.overrideWithValue(InMemorySyncStateStore()), reminderSchedulerProvider.overrideWithValue(_NoopReminderScheduler()), ], ); addTearDown(container.dispose); await container.read(localRepositoryProvider.future); await container .read(localRepositoryProvider.notifier) .addPerson( name: 'Alex Morgan', relationship: 'Friend', notes: '', tags: const [], ); await container .read(localRepositoryProvider.notifier) .addPerson( name: 'Alex Morgan', relationship: 'Cousin', notes: '', tags: const [], ); await container .read(localRepositoryProvider.notifier) .ingestSharedMessage( const SharedMessageIngestInput( sourceApp: 'whatsapp', sourceDisplayName: 'Alex Morgan', messageText: 'Need help choosing this gift?', ), ); await tester.pumpWidget( UncontrolledProviderScope( container: container, child: const MaterialApp(home: Scaffold(body: ShareInboxView())), ), ); await tester.pumpAndSettle(); expect(find.text('Share Inbox'), findsOneWidget); expect(find.text('Ambiguous match'), findsOneWidget); expect(find.widgetWithText(FilledButton, 'Review & Save'), findsOneWidget); await tester.tap(find.widgetWithText(TextButton, 'Dismiss Item').first); await tester.pumpAndSettle(); expect(find.text('No unresolved shares.'), findsOneWidget); }); testWidgets('opens conflict review dialog and confirms mapping', ( WidgetTester tester, ) async { final ProviderContainer container = ProviderContainer( overrides: [ localDataStoreProvider.overrideWithValue(InMemoryLocalDataStore()), syncStateStoreProvider.overrideWithValue(InMemorySyncStateStore()), reminderSchedulerProvider.overrideWithValue(_NoopReminderScheduler()), ], ); addTearDown(container.dispose); await container.read(localRepositoryProvider.future); await container .read(localRepositoryProvider.notifier) .addPerson( name: 'Marek Havel', relationship: 'Friend', notes: '', tags: const [], ); await container .read(localRepositoryProvider.notifier) .ingestSharedMessage( const SharedMessageIngestInput( sourceApp: 'whatsapp', sourceDisplayName: 'Marek Havl', sourceUserId: 'wa:marek_882', messageText: 'Can you check this event?', ), ); await tester.pumpWidget( UncontrolledProviderScope( container: container, child: const MaterialApp(home: Scaffold(body: ShareInboxView())), ), ); await tester.pumpAndSettle(); expect(find.text('Near match conflict'), findsOneWidget); await tester.tap(find.widgetWithText(FilledButton, 'Review & Save').first); await tester.pumpAndSettle(); expect(find.text('Review Capture Mapping'), findsOneWidget); await tester.tap(find.widgetWithText(FilledButton, 'Use Mapping')); await tester.pumpAndSettle(); expect(find.text('Review Match'), findsOneWidget); expect(find.text('Incoming Share'), findsOneWidget); expect(find.text('Candidate profiles'), findsOneWidget); await tester.tap(find.widgetWithText(FilledButton, 'Confirm Match')); await tester.pumpAndSettle(); expect(find.text('No unresolved shares.'), findsOneWidget); }); } class _NoopReminderScheduler implements ReminderScheduler { @override Future clearAll() async {} @override Future requestPermissions() async => true; @override Future reconcile(List reminders) async {} }