104 lines
3.0 KiB
Dart
104 lines
3.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:mockito/mockito.dart';
|
|
import 'package:sharedinbox/core/models/undo_action.dart';
|
|
import 'package:sharedinbox/di.dart';
|
|
import 'package:sharedinbox/ui/widgets/undo_shell.dart';
|
|
|
|
import '../unit/undo_service_test.mocks.dart';
|
|
|
|
void main() {
|
|
late MockUndoRepository mockUndoRepo;
|
|
|
|
setUp(() {
|
|
mockUndoRepo = MockUndoRepository();
|
|
when(mockUndoRepo.saveAction(any)).thenAnswer((_) async {});
|
|
when(mockUndoRepo.deleteAction(any)).thenAnswer((_) async {});
|
|
when(mockUndoRepo.clearHistory()).thenAnswer((_) async {});
|
|
});
|
|
|
|
Widget buildShell(MockUndoRepository repo) {
|
|
return ProviderScope(
|
|
overrides: [undoRepositoryProvider.overrideWithValue(repo)],
|
|
child: const MaterialApp(
|
|
home: UndoShell(child: Scaffold(body: Text('content'))),
|
|
),
|
|
);
|
|
}
|
|
|
|
testWidgets(
|
|
'does not show snackbar for stale action loaded from persistence on startup',
|
|
(tester) async {
|
|
final staleAction = UndoAction(
|
|
id: '1',
|
|
accountId: 'acc1',
|
|
type: UndoType.move,
|
|
emailIds: ['e1'],
|
|
sourceMailboxPath: 'INBOX',
|
|
timestamp: DateTime.now().subtract(const Duration(hours: 1)),
|
|
);
|
|
when(
|
|
mockUndoRepo.getHistory(limit: anyNamed('limit')),
|
|
).thenAnswer((_) async => [staleAction]);
|
|
|
|
await tester.pumpWidget(buildShell(mockUndoRepo));
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('1 email(s) moved'), findsNothing);
|
|
},
|
|
);
|
|
|
|
testWidgets('shows snackbar for fresh action pushed in current session', (
|
|
tester,
|
|
) async {
|
|
when(
|
|
mockUndoRepo.getHistory(limit: anyNamed('limit')),
|
|
).thenAnswer((_) async => []);
|
|
|
|
await tester.pumpWidget(buildShell(mockUndoRepo));
|
|
await tester.pumpAndSettle();
|
|
|
|
final context = tester.element(find.byType(UndoShell));
|
|
final freshAction = UndoAction(
|
|
id: '1',
|
|
accountId: 'acc1',
|
|
type: UndoType.move,
|
|
emailIds: ['e1'],
|
|
sourceMailboxPath: 'INBOX',
|
|
);
|
|
await ProviderScope.containerOf(
|
|
context,
|
|
).read(undoServiceProvider.notifier).pushAction(freshAction);
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('1 email(s) moved'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('shows correct text for delete action (moved to Trash)', (
|
|
tester,
|
|
) async {
|
|
when(
|
|
mockUndoRepo.getHistory(limit: anyNamed('limit')),
|
|
).thenAnswer((_) async => []);
|
|
|
|
await tester.pumpWidget(buildShell(mockUndoRepo));
|
|
await tester.pumpAndSettle();
|
|
|
|
final context = tester.element(find.byType(UndoShell));
|
|
final deleteAction = UndoAction(
|
|
id: '2',
|
|
accountId: 'acc1',
|
|
type: UndoType.delete,
|
|
emailIds: ['e1', 'e2'],
|
|
sourceMailboxPath: 'INBOX',
|
|
);
|
|
await ProviderScope.containerOf(
|
|
context,
|
|
).read(undoServiceProvider.notifier).pushAction(deleteAction);
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.text('2 email(s) moved to Trash'), findsOneWidget);
|
|
});
|
|
}
|