Two fixes: 1. notification_service.dart: initNotifications() now catches MissingPluginException (and any other init failure) so the app no longer crashes when flutter_local_notifications is unavailable on some Android devices. _initialized tracks success; showNewMailNotification skips the plugin call when it never initialised. 2. crash_screen.dart: "Report Issue on Codeberg" no longer puts the full report in the URL query string. Long stack traces exceeded browser URL-length limits and caused "create issue failed". The URL now carries only the pre-filled title; the user copies the full report via "Copy to Clipboard" and pastes it in the issue body. Tests added: - test/unit/notification_service_test.dart: verifies initNotifications() completes without throwing when the plugin channel is unavailable. - test/widget/crash_screen_test.dart: verifies the Codeberg URL contains the title but no &body= parameter. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
27 lines
1.2 KiB
Dart
27 lines
1.2 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:sharedinbox/core/services/notification_service.dart';
|
|
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
// Regression test for https://codeberg.org/guettli/sharedinbox/issues/146:
|
|
// On some Android devices the flutter_local_notifications plugin channel is
|
|
// absent at startup, throwing MissingPluginException (or a similar error).
|
|
// initNotifications() must absorb the failure and let the app continue.
|
|
test(
|
|
'initNotifications completes without throwing when plugin is unavailable',
|
|
() async {
|
|
// In the unit-test environment the native plugin is not registered, so
|
|
// _plugin.initialize() throws. The fix catches it and keeps _initialized
|
|
// false. This test fails before the fix (exception propagates) and passes
|
|
// after it (exception is swallowed).
|
|
await expectLater(initNotifications(), completes);
|
|
});
|
|
|
|
test('showNewMailNotification completes without throwing', () async {
|
|
// Platform.isAndroid is false in tests, so this returns early without
|
|
// touching the plugin. Ensures the guard path is exercised.
|
|
await expectLater(showNewMailNotification('test@example.com'), completes);
|
|
});
|
|
}
|