132 lines
5.2 KiB
Dart
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);
|
|
},
|
|
);
|
|
}
|