Files
rely/test/features/share_intake/share_inbox_view_test.dart
T
2026-02-19 01:02:32 +01:00

143 lines
4.9 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/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_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(<String, Object>{});
});
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 <String>[],
);
await container
.read(localRepositoryProvider.notifier)
.addPerson(
name: 'Alex Morgan',
relationship: 'Cousin',
notes: '',
tags: const <String>[],
);
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 & Match'), 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 <String>[],
);
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 & Match').first);
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<void> clearAll() async {}
@override
Future<bool> requestPermissions() async => true;
@override
Future<void> reconcile(List<ReminderRule> reminders) async {}
}