MO-Fuel-Tax-Back/test/faq_screen_test.dart

104 lines
4.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fuel_tax_tracker/screens/faq_screen.dart';
/// Covers [FaqScreen] itself (question list, collapsed-by-default,
/// deep-linking a specific entry open) and [FaqActionButton], the shared
/// "?" AppBar action reused across every tab — see settings_screen_test.dart
/// for the Settings landing page's own FAQ entry, and
/// backup_reminder_test.dart for the "Learn More" link into a specific
/// entry.
void main() {
testWidgets('every question starts collapsed with no initiallyExpandedQuestion given',
(tester) async {
await tester.pumpWidget(const MaterialApp(home: FaqScreen()));
expect(find.text('What is the Missouri Motor Fuel Tax Refund?'), findsOneWidget);
expect(find.textContaining('12.5¢ per gallon'), findsNothing);
});
testWidgets('groups questions under section headers', (tester) async {
await tester.pumpWidget(const MaterialApp(home: FaqScreen()));
// The first section header is visible without scrolling; the last
// one only reachable by scrolling all the way down — checking both
// confirms headers span the whole list, not just its start.
expect(find.text('Missouri Motor Fuel Tax Refund'), findsOneWidget);
await tester.scrollUntilVisible(find.text('Advertisements'), 300,
scrollable: find.byType(Scrollable));
expect(find.text('Advertisements'), findsOneWidget);
});
testWidgets('tapping a question expands its answer', (tester) async {
await tester.pumpWidget(const MaterialApp(home: FaqScreen()));
await tester.scrollUntilVisible(find.text('How do I remove ads?'), 300,
scrollable: find.byType(Scrollable));
// scrollUntilVisible stops as soon as any part is on-screen, which can
// leave it right at the bottom edge — nudge further so its center
// (what tap() targets) is comfortably inside the viewport.
await tester.drag(find.byType(Scrollable), const Offset(0, -100));
await tester.pumpAndSettle();
await tester.tap(find.text('How do I remove ads?'));
await tester.pumpAndSettle();
expect(find.textContaining("doesn't auto-renew"), findsOneWidget);
});
testWidgets('includes a contact email for problem receipts/VINs/errors', (tester) async {
await tester.pumpWidget(const MaterialApp(home: FaqScreen()));
await tester.scrollUntilVisible(
find.text("Found a receipt, VIN, or error the app couldn't handle?"), 300,
scrollable: find.byType(Scrollable));
await tester.tap(find.text("Found a receipt, VIN, or error the app couldn't handle?"));
await tester.pumpAndSettle();
expect(find.textContaining('ohbrer+ShowMeTheFuelRefund@gmail.com'), findsOneWidget);
});
testWidgets('the refund program question covers both highway and non-highway refunds',
(tester) async {
await tester.pumpWidget(const MaterialApp(home: FaqScreen()));
await tester.tap(find.text('What is the Missouri Motor Fuel Tax Refund?'));
await tester.pumpAndSettle();
expect(find.textContaining('Highway use — up to 12.5¢ per gallon'), findsOneWidget);
expect(find.textContaining('Non-highway use — up to 29.5¢ per gallon'), findsOneWidget);
expect(find.textContaining("isn't tax advice"), findsOneWidget);
expect(find.textContaining('consult a tax professional'), findsOneWidget);
});
testWidgets('initiallyExpandedQuestion starts that one entry open, others collapsed',
(tester) async {
await tester.pumpWidget(
const MaterialApp(home: FaqScreen(initiallyExpandedQuestion: 'Is my data backed up?')),
);
await tester.pumpAndSettle();
// Its section (Data Safety) is further down the page now that
// questions are grouped — scroll to it before checking its content.
await tester.scrollUntilVisible(find.text('Is my data backed up?'), 300,
scrollable: find.byType(Scrollable));
expect(find.textContaining('Not by default'), findsOneWidget);
expect(find.textContaining('12.5¢ per gallon'), findsNothing,
reason: 'only the targeted question starts expanded');
});
testWidgets('FaqActionButton pushes FaqScreen', (tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(appBar: AppBar(actions: const [FaqActionButton()])),
),
);
await tester.tap(find.byIcon(Icons.help_outline));
await tester.pumpAndSettle();
expect(find.byType(FaqScreen), findsOneWidget);
});
}