import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:relationship_saver/core/config/app_theme.dart'; import 'package:relationship_saver/features/dashboard/dashboard_view.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/sync/storage/sync_state_store_in_memory.dart'; import 'package:relationship_saver/features/sync/storage/sync_state_store_provider.dart'; void main() { testWidgets( 'graph supports pan/zoom shell and opens person insights on long press', (WidgetTester tester) async { await tester.binding.setSurfaceSize(const Size(390, 844)); addTearDown(() => tester.binding.setSurfaceSize(null)); final ProviderContainer container = ProviderContainer( overrides: [ localDataStoreProvider.overrideWithValue(InMemoryLocalDataStore()), syncStateStoreProvider.overrideWithValue(InMemorySyncStateStore()), ], ); addTearDown(container.dispose); await container.read(localRepositoryProvider.future); await container .read(localRepositoryProvider.notifier) .addPerson( name: 'Ava Hart', relationship: 'Friend', notes: '', tags: const [], ); final LocalDataState seeded = await container.read( localRepositoryProvider.future, ); final String personId = seeded.people.first.id; await container .read(localRepositoryProvider.notifier) .upsertInferredPreferenceSignalObservation( personId: personId, key: 'drink:tea', label: 'Tea', category: 'drink', polarity: PreferenceSignalPolarity.like, confidence: 0.82, sourceApp: 'whatsapp', evidenceMessageId: 'sm-seed-1', evidenceSnippet: 'I prefer tea over coffee after dinner.', ); await tester.pumpWidget( UncontrolledProviderScope( container: container, child: MaterialApp( theme: AppTheme.light(), home: const Scaffold(body: DashboardView()), ), ), ); await tester.pumpAndSettle(const Duration(milliseconds: 600)); expect(find.text('Relationship Graph'), findsOneWidget); expect(find.byType(InteractiveViewer), findsOneWidget); expect(find.text('Explore'), findsOneWidget); final Finder avaNode = find.byKey( ValueKey('graph-node-$personId'), ); expect(avaNode, findsOneWidget); await tester.longPress(avaNode); await tester.pumpAndSettle(const Duration(milliseconds: 700)); expect(find.text('Person Insights'), findsOneWidget); expect(find.byTooltip('Quick add'), findsOneWidget); expect(find.byTooltip('Add to person'), findsOneWidget); expect(find.text('Promotions & Signals'), findsOneWidget); expect(find.text('Chat-derived preferences'), findsOneWidget); expect(find.text('Ideas'), findsOneWidget); expect(find.text('Moments'), findsOneWidget); expect(find.text('Reminders'), findsOneWidget); expect(find.text('Tea'), findsOneWidget); expect(find.text('Confirm'), findsOneWidget); expect(find.text('Why?'), findsOneWidget); await tester.tap(find.text('Why?').first); await tester.pumpAndSettle(const Duration(milliseconds: 400)); expect(find.text('Why this signal?'), findsOneWidget); expect(find.textContaining('I prefer tea over coffee'), findsOneWidget); await tester.tap(find.widgetWithText(TextButton, 'Close')); await tester.pumpAndSettle(const Duration(milliseconds: 300)); await tester.tap(find.text('Confirm').first); await tester.pumpAndSettle(const Duration(milliseconds: 350)); final LocalDataState afterConfirm = await container.read( localRepositoryProvider.future, ); expect( afterConfirm.preferenceSignals .firstWhere( (PersonPreferenceSignal signal) => signal.key == 'drink:tea', ) .status, PreferenceSignalStatus.confirmed, ); await tester.tap(find.byTooltip('Back')); await tester.pumpAndSettle(const Duration(milliseconds: 500)); expect(find.text('Relationship Graph'), findsOneWidget); await tester.tap(find.widgetWithText(OutlinedButton, 'Explore')); await tester.pumpAndSettle(const Duration(milliseconds: 500)); expect(find.text('Relationship Graph'), findsWidgets); expect(find.byTooltip('Reset view'), findsOneWidget); await tester.tap(find.byTooltip('Reset view')); await tester.pumpAndSettle(const Duration(milliseconds: 250)); await tester.tap(find.byTooltip('Back')); await tester.pumpAndSettle(const Duration(milliseconds: 500)); expect(find.text('Relationship Graph'), findsOneWidget); }, ); }