Files
rely/test/features/dashboard/dashboard_graph_interactions_test.dart
T
2026-05-18 20:33:54 +02:00

132 lines
5.2 KiB
Dart

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 <String>[],
);
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<String>('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);
},
);
}