143 lines
4.9 KiB
Dart
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 {}
|
|
}
|