added guardian letters with chat and multiple answer functionalities

This commit is contained in:
2026-09-20 16:12:45 +02:00
parent 67c935c05b
commit 2423c1a75e
68 changed files with 8348 additions and 226 deletions
+66
View File
@@ -0,0 +1,66 @@
import 'dart:convert';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:marianum_mobile/push/push_tap_router.dart';
import 'package:marianum_mobile/push/push_target.dart';
void main() {
group('resolvePushTarget', () {
test('a parent letter push routes by its letter id', () {
final target = resolvePushTarget({
'source': 'connect',
'type': 'parent-letter',
'parentLetterId': 'l1',
'event': 'reply',
'title': 'Hr. Müller: Wandertag',
});
expect(
target,
isA<ParentLetterTarget>().having((t) => t.letterId, 'letterId', 'l1'),
);
});
test('newsletter pushes route by newsletterId', () {
expect(
resolvePushTarget({'source': 'connect', 'newsletterId': 'n1'}),
isA<NewsletterTarget>().having((t) => t.newsletterId, 'id', 'n1'),
);
});
test('chat pushes accept every token key in use', () {
for (final key in ['chatToken', 'token', 'roomToken']) {
expect(
resolvePushTarget({key: 'abc', 'nid': 5}),
isA<ChatTarget>().having((t) => t.chatToken, 'chatToken', 'abc'),
reason: key,
);
}
});
test('empty ids and unrelated data name no target', () {
expect(resolvePushTarget({'parentLetterId': ''}), isNull);
expect(resolvePushTarget({'type': 'widget-refresh'}), isNull);
expect(resolvePushTarget({'chatToken': 7}), isNull);
});
});
group('PushTapRouter.handleResponse', () {
setUp(() => PushTapRouter.pendingTarget.value = null);
NotificationResponse tap(String payload) => NotificationResponse(
notificationResponseType: NotificationResponseType.selectedNotification,
payload: payload,
);
test('publishes the target of a tapped notification', () {
PushTapRouter.handleResponse(tap(jsonEncode({'parentLetterId': 'l1'})));
expect(PushTapRouter.pendingTarget.value, isA<ParentLetterTarget>());
});
test('ignores broken payloads', () {
PushTapRouter.handleResponse(tap('not json'));
expect(PushTapRouter.pendingTarget.value, isNull);
});
});
}