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:
@@ -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:00–10: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:00–09.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');
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user