diff --git a/lib/ui/screens/sieve_scripts_screen.dart b/lib/ui/screens/sieve_scripts_screen.dart index 8ca1dfa..0f23ebd 100644 --- a/lib/ui/screens/sieve_scripts_screen.dart +++ b/lib/ui/screens/sieve_scripts_screen.dart @@ -138,7 +138,7 @@ class _SieveScriptsScreenState extends ConsumerState { return Scaffold( appBar: AppBar( title: Text( - widget.isLocal ? 'Local email filters' : 'Server email filters', + widget.isLocal ? 'Local Filters' : 'Remote Filters', ), ), body: _buildBody(), @@ -178,7 +178,7 @@ class _SieveScriptsScreenState extends ConsumerState { Expanded( child: scripts.isEmpty ? const Center( - child: Text('No Sieve scripts. Tap + to create one.'), + child: Text('No filters yet. Tap + to create one.'), ) : RefreshIndicator( onRefresh: _load, @@ -208,10 +208,11 @@ class _SieveSourceBanner extends StatelessWidget { @override Widget build(BuildContext context) { final text = isLocal - ? 'These scripts run locally on this device. ' - 'Server email filters are separate and independent.' - : 'These scripts run on the mail server (ManageSieve / JMAP). ' - 'Local email filters are separate and independent.'; + ? 'Local Filters run Sieve scripts directly on this device. ' + 'Remote Filters, which run on the mail server, are configured separately.' + : 'Remote Filters run Sieve scripts on the mail server ' + '(ManageSieve or JMAP). ' + 'Local Filters, which run on this device, are configured separately.'; return Container( width: double.infinity, color: Theme.of(context).colorScheme.surfaceContainerHighest, diff --git a/lib/ui/widgets/folder_drawer.dart b/lib/ui/widgets/folder_drawer.dart index 95c3d38..b4c8dd1 100644 --- a/lib/ui/widgets/folder_drawer.dart +++ b/lib/ui/widgets/folder_drawer.dart @@ -70,13 +70,21 @@ class FolderDrawer extends ConsumerWidget { }, ), ListTile( - leading: const Icon(Icons.filter_list), - title: const Text('Email filters'), + leading: const Icon(Icons.dns), + title: const Text('Remote Filters'), onTap: () { Navigator.pop(context); unawaited(context.push('/accounts/$accountId/sieve')); }, ), + ListTile( + leading: const Icon(Icons.phone_android), + title: const Text('Local Filters'), + onTap: () { + Navigator.pop(context); + unawaited(context.push('/accounts/$accountId/sieve/local')); + }, + ), const Divider(height: 1), Expanded( child: StreamBuilder( diff --git a/test/widget/sieve_scripts_screen_test.dart b/test/widget/sieve_scripts_screen_test.dart new file mode 100644 index 0000000..ed3453a --- /dev/null +++ b/test/widget/sieve_scripts_screen_test.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:sharedinbox/core/models/sieve_script.dart'; +import 'package:sharedinbox/data/db/local_sieve_repository.dart'; +import 'package:sharedinbox/data/jmap/sieve_repository.dart'; +import 'package:sharedinbox/di.dart'; +import 'package:sharedinbox/ui/screens/sieve_scripts_screen.dart'; + +import '../unit/db_test_helper.dart'; +import 'helpers.dart'; + +class _FakeSieveRepository extends SieveRepository { + _FakeSieveRepository() : super(FakeAccountRepository(), http.Client()); + + @override + Future> listScripts(String accountId) async => []; +} + +void main() { + configureSqliteForTests(); + + testWidgets('Remote Filters page shows correct title and banner', ( + tester, + ) async { + await tester.pumpWidget( + ProviderScope( + overrides: [ + sieveRepositoryProvider.overrideWith( + (ref) => _FakeSieveRepository(), + ), + ], + child: const MaterialApp( + home: SieveScriptsScreen(accountId: 'acc-1'), + ), + ), + ); + await tester.pumpAndSettle(); + + expect(find.text('Remote Filters'), findsOneWidget); + expect( + find.textContaining('Remote Filters run Sieve scripts'), + findsOneWidget, + ); + expect(find.textContaining('Local Filters'), findsOneWidget); + }); + + testWidgets('Local Filters page shows correct title and banner', ( + tester, + ) async { + final db = openTestDatabase(); + addTearDown(db.close); + + await tester.pumpWidget( + ProviderScope( + overrides: [ + localSieveRepositoryProvider.overrideWith( + (ref) => LocalSieveRepository(db), + ), + ], + child: const MaterialApp( + home: SieveScriptsScreen(accountId: 'acc-1', isLocal: true), + ), + ), + ); + await tester.pumpAndSettle(); + + expect(find.text('Local Filters'), findsOneWidget); + expect( + find.textContaining('Local Filters run Sieve scripts'), + findsOneWidget, + ); + expect(find.textContaining('Remote Filters'), findsOneWidget); + }); +}