refactored broad range of the application, split files, modularized calendar and file views, centralized bottom sheets and clipboard handling, and implemented unit test coverage

This commit is contained in:
2026-05-08 19:05:16 +02:00
parent 3b1b0d0c19
commit c62a14645a
68 changed files with 4633 additions and 3141 deletions
@@ -0,0 +1,109 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/state/app/modules/marianum_dates/bloc/marianum_dates_state.dart';
import 'package:marianum_mobile/view/pages/marianum_dates/data/event_formatter.dart';
MarianumDate _event({
required DateTime start,
required DateTime end,
bool isAllDay = false,
}) =>
MarianumDate(
uid: 't',
title: 't',
description: null,
start: start,
end: end,
isAllDay: isAllDay,
);
void main() {
setUpAll(() async {
await Jiffy.setLocale('de');
});
group('EventFormatter.trailingLabel', () {
test('all-day events show "Ganztägig"', () {
final e = _event(
start: DateTime(2026, 5, 8),
end: DateTime(2026, 5, 9),
isAllDay: true,
);
expect(EventFormatter.trailingLabel(e), 'Ganztägig');
});
test('zero-length same-day event shows a single time', () {
final at = DateTime(2026, 5, 8, 9, 30);
final e = _event(start: at, end: at);
expect(EventFormatter.trailingLabel(e), '09:30');
});
test('same-day event shows time range', () {
final e = _event(
start: DateTime(2026, 5, 8, 9),
end: DateTime(2026, 5, 8, 10, 30),
);
expect(EventFormatter.trailingLabel(e), '09:0010:30');
});
test('multi-day event shows date+time on both sides', () {
final e = _event(
start: DateTime(2026, 5, 8, 9),
end: DateTime(2026, 5, 9, 11),
);
expect(EventFormatter.trailingLabel(e), '08.05. 09:0009.05. 11:00');
});
});
group('EventFormatter.longRange', () {
test('all-day single-day collapses inclusive end to start date', () {
// ICS-style all-day: end is exclusive (next midnight). Display drops it.
final e = _event(
start: DateTime(2026, 5, 8),
end: DateTime(2026, 5, 9),
isAllDay: true,
);
expect(EventFormatter.longRange(e), '08.05.2026 · Ganztägig');
});
test('all-day multi-day shows inclusive end (one day before exclusive end)', () {
final e = _event(
start: DateTime(2026, 5, 8),
end: DateTime(2026, 5, 11), // exclusive → display "until 10.05."
isAllDay: true,
);
expect(EventFormatter.longRange(e), '08.05.2026 10.05.2026 · Ganztägig');
});
test('all-day event whose end equals start (degenerate) renders as single day', () {
final e = _event(
start: DateTime(2026, 5, 8),
end: DateTime(2026, 5, 8),
isAllDay: true,
);
expect(EventFormatter.longRange(e), '08.05.2026 · Ganztägig');
});
test('zero-length same-day timed event shows single time', () {
final at = DateTime(2026, 5, 8, 9, 30);
final e = _event(start: at, end: at);
expect(EventFormatter.longRange(e), '08.05.2026 · 09:30');
});
test('same-day timed event shows date · range', () {
final e = _event(
start: DateTime(2026, 5, 8, 9),
end: DateTime(2026, 5, 8, 10, 30),
);
expect(EventFormatter.longRange(e), '08.05.2026 · 09:00 10:30');
});
test('multi-day timed event shows full datetimes on both sides', () {
final e = _event(
start: DateTime(2026, 5, 8, 9),
end: DateTime(2026, 5, 9, 11),
);
expect(EventFormatter.longRange(e), '08.05.2026 09:00 09.05.2026 11:00');
});
});
}