add ticker page bloc and avatar disk cache

This commit is contained in:
2026-07-12 23:18:53 +02:00
parent 94794ff092
commit 9b5198c6db
18 changed files with 944 additions and 233 deletions
@@ -23,15 +23,11 @@ Widget _host({
List<TickerNavSection>? sections,
String? initialSlug,
void Function(String? slug)? onSelectionChanged,
String? homePublishedAt,
VoidCallback? onRefreshHome,
}) => MaterialApp(
home: TickerScaffold(
sections: sections ?? _sections(),
initialSlug: initialSlug,
onSelectionChanged: onSelectionChanged,
homePublishedAt: homePublishedAt,
onRefreshHome: onRefreshHome,
homeBuilder: (context, onLinkTap) => const Text('HOME'),
pageBuilder: (context, slug, onLinkTap) => Text('PAGE:$slug'),
),
@@ -231,50 +227,6 @@ void main() {
});
});
group('home date button', () {
testWidgets('shows the publish date on home and refreshes on tap', (
tester,
) async {
var refreshed = 0;
await tester.pumpWidget(
_host(
homePublishedAt: '2026-02-17T14:30:00',
onRefreshHome: () => refreshed++,
),
);
await tester.pumpAndSettle();
expect(find.text('17.02.2026, 14:30'), findsOneWidget);
await tester.tap(find.text('17.02.2026, 14:30'));
await tester.pumpAndSettle();
expect(refreshed, 1);
});
testWidgets('hides the date button when there is no date', (tester) async {
await tester.pumpWidget(_host());
await tester.pumpAndSettle();
expect(find.byIcon(Icons.schedule), findsNothing);
});
testWidgets('hides the date button once a page is open', (tester) async {
tester.view.physicalSize = const Size(1200, 2000);
tester.view.devicePixelRatio = 1.0;
addTearDown(tester.view.resetPhysicalSize);
addTearDown(tester.view.resetDevicePixelRatio);
await tester.pumpWidget(_host(homePublishedAt: '2026-02-17T14:30:00'));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.schedule), findsOneWidget);
await tester.tap(find.text('Über uns'));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.schedule), findsNothing);
});
});
group('back gesture', () {
testWidgets('pops from a sub-page back to home via the tab navigator', (
tester,
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/view/pages/ticker/widgets/ticker_updated_bar.dart';
Widget _host(String? publishedAt) =>
MaterialApp(home: Scaffold(body: TickerUpdatedBar(publishedAt: publishedAt)));
void main() {
setUpAll(() async {
await Jiffy.setLocale('de');
});
testWidgets('renders the formatted publish date', (tester) async {
await tester.pumpWidget(_host('2026-02-17T14:30:00'));
await tester.pumpAndSettle();
expect(find.text('Aktualisiert am 17.02.2026 14:30'), findsOneWidget);
expect(find.byIcon(Icons.schedule), findsOneWidget);
});
testWidgets('renders nothing without a date', (tester) async {
await tester.pumpWidget(_host(null));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.schedule), findsNothing);
expect(find.textContaining('Aktualisiert'), findsNothing);
});
testWidgets('renders nothing for an unparseable date', (tester) async {
await tester.pumpWidget(_host('not-a-date'));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.schedule), findsNothing);
});
}