import 'package:flutter_test/flutter_test.dart'; import 'package:marianum_mobile/api/marianumconnect/queries/timetable_get_week/timetable_get_week_response.dart'; import 'package:marianum_mobile/extensions/date_time.dart'; import 'package:marianum_mobile/state/app/modules/timetable/bloc/week_cache.dart'; TimetableGetWeekResponse _week(DateTime monday, {String room = 'A101'}) => TimetableGetWeekResponse( from: monday, until: monday.addDays(4), entries: [ McTimetableEntry( id: 1, date: monday, startTime: DateTime(1970, 1, 1, 8), endTime: DateTime(1970, 1, 1, 9), subjects: const ['ma'], teachers: const [], rooms: [room], classNames: const [], lessonType: 'LESSON', status: 'REGULAR', substitutionText: null, lessonText: null, infoText: null, ), ], ); void main() { final monday = DateTime(2026, 9, 21); test('returns null when the stored week has identical content', () { final cache = {monday.weekKey(): _week(monday)}; final result = mergeWeekIntoCache( cache, monday, _week(monday), viewedWeekStart: monday, now: monday, ); expect(result, isNull); }); test('stores changed content', () { final cache = {monday.weekKey(): _week(monday)}; final changed = _week(monday, room: 'B202'); final result = mergeWeekIntoCache( cache, monday, changed, viewedWeekStart: monday, now: monday, ); expect(result![monday.weekKey()], same(changed)); }); test('drops weeks far from both the viewed week and today', () { final far = monday.addDays(7 * (kWeekCacheRadius + 3)); final nearToday = monday.addDays(-7 * kWeekCacheRadius); final viewed = monday.addDays(7 * (kWeekCacheRadius * 3)); final cache = { far.weekKey(): _week(far), nearToday.weekKey(): _week(nearToday), }; final result = mergeWeekIntoCache( cache, viewed, _week(viewed), viewedWeekStart: viewed, now: monday.addDays(2), ); expect(result!.keys, {nearToday.weekKey(), viewed.weekKey()}); }); }