implemented a backend-independent emergency notice system

This commit is contained in:
2026-07-15 20:30:20 +02:00
parent e8c6ac1c65
commit 7c1f5c06df
11 changed files with 599 additions and 3 deletions
+127
View File
@@ -0,0 +1,127 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:marianum_mobile/api/emergency/emergency_notice.dart';
void main() {
group('EmergencyNotice.parse', () {
test('parses an active, dismissible notice', () {
final notice = EmergencyNotice.parse('''
---
active: true
dismissible: true
title: Störung
---
# Ausfall
Der Server ist **down**.
''');
expect(notice, isNotNull);
expect(notice!.dismissible, isTrue);
expect(notice.title, 'Störung');
expect(notice.body, '# Ausfall\nDer Server ist **down**.');
});
test('parses a full-screen (dismissible: false) notice', () {
final notice = EmergencyNotice.parse('''
---
active: true
dismissible: false
---
Wichtige Meldung
''');
expect(notice, isNotNull);
expect(notice!.dismissible, isFalse);
expect(notice.title, isNull);
});
test('defaults dismissible to true when absent', () {
final notice = EmergencyNotice.parse('''
---
active: true
---
Body
''');
expect(notice!.dismissible, isTrue);
});
test('returns null when active is false', () {
expect(
EmergencyNotice.parse('---\nactive: false\n---\nBody'),
isNull,
);
});
test('returns null when active is missing', () {
expect(
EmergencyNotice.parse('---\ntitle: Hallo\n---\nBody'),
isNull,
);
});
test('ignores comment lines in the frontmatter', () {
final notice = EmergencyNotice.parse('''
---
# dismissible: false <- example config, disabled
active: true
dismissible: true
---
Body
''');
expect(notice, isNotNull);
expect(notice!.dismissible, isTrue);
});
test('returns null without a frontmatter', () {
expect(EmergencyNotice.parse('Just some **markdown** text'), isNull);
});
test('returns null when the closing delimiter is missing', () {
expect(EmergencyNotice.parse('---\nactive: true\nBody'), isNull);
});
test('returns null on empty input', () {
expect(EmergencyNotice.parse(''), isNull);
expect(EmergencyNotice.parse(' \n '), isNull);
});
test('returns null when the body is empty', () {
expect(EmergencyNotice.parse('---\nactive: true\n---\n '), isNull);
});
test('preserves the markdown body verbatim', () {
final notice = EmergencyNotice.parse('''
---
active: true
---
# Titel
- Punkt 1
- Punkt 2
Mehr [Info](https://example.org).
''');
expect(
notice!.body,
'# Titel\n\n- Punkt 1\n- Punkt 2\n\nMehr [Info](https://example.org).',
);
});
test('handles CRLF line endings', () {
final notice = EmergencyNotice.parse(
'---\r\nactive: true\r\n---\r\nHallo\r\n',
);
expect(notice, isNotNull);
expect(notice!.body, 'Hallo');
});
test('accepts alternative truthy values for active', () {
expect(EmergencyNotice.parse('---\nactive: yes\n---\nB'), isNotNull);
expect(EmergencyNotice.parse('---\nactive: 1\n---\nB'), isNotNull);
expect(EmergencyNotice.parse('---\nactive: on\n---\nB'), isNotNull);
});
});
}