Files
doormile_milderapp/test/app_bar_glass_test.dart
2026-08-11 13:16:33 +05:30

106 lines
4.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:miler/views/helpers/constants/Colorconstants.dart';
import 'package:miler/views/helpers/widgets/app_widgets.dart';
import 'package:miler/views/helpers/widgets/miler_app_bar.dart';
/// Two rules the bars now share, and both are the kind that quietly comes
/// undone the next time someone adds a screen:
///
/// • **One line.** The bar carries the page's name and nothing under it. Every
/// caption that used to sit there duplicated a figure the page itself showed
/// louder and lower down, and two sources for one number is how they drift.
///
/// • **One surface.** A frosted brand wash, not a solid slab, so a tab and a
/// pushed page read as the same app at the top of the screen.
void main() {
Future<void> pump(WidgetTester tester, Widget page) async {
tester.view.physicalSize = const Size(390 * 3, 844 * 3);
tester.view.devicePixelRatio = 3.0;
addTearDown(tester.view.resetPhysicalSize);
addTearDown(tester.view.resetDevicePixelRatio);
await tester.pumpWidget(
ScreenUtilInit(
designSize: const Size(390, 844),
builder: (_, _) => MaterialApp(home: page),
),
);
await tester.pumpAndSettle();
}
group('MilerAppBar', () {
testWidgets('shows the page name and nothing beneath it', (tester) async {
await pump(tester, const Scaffold(appBar: MilerAppBar(title: 'Activity')));
expect(find.text('Activity'), findsOneWidget);
expect(
tester.widgetList<Text>(find.byType(Text)),
hasLength(1),
reason: 'the caption under the title is gone from every bar',
);
});
testWidgets('wears the frosted brand wash, not a solid fill',
(tester) async {
await pump(tester, const Scaffold(appBar: MilerAppBar(title: 'Activity')));
final bar = tester.widget<AppBar>(find.byType(AppBar));
expect(bar.backgroundColor, Colors.transparent);
expect(bar.flexibleSpace, isNotNull);
// A blur is the difference between glass and a tinted box: content
// passing under the bar softens instead of sliding under a lid.
expect(find.byType(BackdropFilter), findsOneWidget);
});
testWidgets('closes with no rule under it', (tester) async {
await pump(tester, const Scaffold(appBar: MilerAppBar(title: 'Activity')));
// The wash is a surface, and a surface against an untinted page is
// already an edge. A hairline under it drew that boundary a second time —
// the same doubled-up border this app has been pulling out of its cards.
final bar = tester.widget<AppBar>(find.byType(AppBar));
expect(bar.bottom, isNull);
});
testWidgets('keeps a trailing slot for the pages that need one',
(tester) async {
await pump(
tester,
Scaffold(
appBar: MilerAppBar(
title: 'My Bookings',
trailing: const Icon(Icons.map_rounded),
),
),
);
expect(find.byIcon(Icons.map_rounded), findsOneWidget);
});
});
group('appTopBar', () {
testWidgets('uses the same wash as the tab bars', (tester) async {
await pump(tester, Scaffold(appBar: milerPageBar('Rewards', onBack: () {})));
final bar = tester.widget<AppBar>(find.byType(AppBar));
expect(bar.backgroundColor, Colors.transparent);
expect(find.byType(BackdropFilter), findsOneWidget);
expect(bar.bottom, isNull, reason: 'no rule under the glass here either');
});
});
test('the wash is a brand tint light enough to carry near-black type', () {
// Flattened against white, which is what both the real bars and Home's
// pinned header composite it over.
final flat = Color.alphaBlend(ColorConstants.glassRed, Colors.white);
expect(
flat.computeLuminance(),
greaterThan(0.85),
reason: 'a saturated red bar would force white text onto a mid-tone red, '
'the weakest contrast pairing in the palette',
);
});
}