Files
receipity/test/widget_test.dart
T
2026-08-31 09:40:38 +02:00

120 lines
4.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:receipity/main.dart';
import 'package:receipity/models/line_item.dart';
import 'package:receipity/review_screen.dart';
import 'package:receipity/services/product_repository.dart';
import 'package:receipity/widgets/shop_heatmap.dart';
void main() {
testWidgets('scan screen shows capture actions and bottom navigation', (
tester,
) async {
await tester.pumpWidget(ReceipityApp());
expect(find.text('Receipity'), findsOneWidget);
expect(find.text('Take photo'), findsOneWidget);
expect(find.text('Pick from gallery'), findsOneWidget);
expect(find.text('Enter manually'), findsOneWidget);
expect(find.text('Use sample receipt'), findsOneWidget);
expect(
find.textContaining('Scan a receipt or enter a trip by hand'),
findsOneWidget,
);
expect(find.text('Products'), findsOneWidget);
expect(find.text('Lists'), findsOneWidget);
expect(find.byTooltip('Add'), findsOneWidget);
expect(find.byIcon(Icons.add), findsOneWidget);
expect(find.text('Shop log'), findsOneWidget);
});
testWidgets('shop log has product search', (tester) async {
await tester.pumpWidget(ReceipityApp());
await tester.tap(find.text('Shop log'));
await tester.pump();
expect(find.byTooltip('Search products'), findsOneWidget);
});
testWidgets('shop heatmap renders the visible month', (tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: ShopHeatmap(
month: DateTime(2026, 8),
counts: const {},
monthTotal: 0,
monthTripCount: 0,
canGoForward: false,
onPreviousMonth: () {},
onNextMonth: () {},
onSelectDay: (_) {},
),
),
),
);
expect(find.text('August 2026'), findsOneWidget);
expect(find.text('No trips this month'), findsOneWidget);
expect(find.text('Less'), findsOneWidget);
expect(find.text('More'), findsOneWidget);
});
testWidgets('enter manually opens a blank trip', (tester) async {
await tester.pumpWidget(ReceipityApp());
await tester.tap(find.text('Enter manually'));
await tester.pumpAndSettle();
expect(find.text('New trip'), findsOneWidget);
expect(find.text('Add item'), findsOneWidget);
});
testWidgets('lists tab shows shopping lists', (tester) async {
await tester.pumpWidget(ReceipityApp());
await tester.tap(find.text('Lists'));
await tester.pump();
expect(find.text('Shopping lists'), findsOneWidget);
});
testWidgets('review screen lists items and can delete one', (tester) async {
await tester.pumpWidget(
MaterialApp(
home: ReviewScreen(
items: [
LineItem(id: '1', name: 'Milk', price: 1.5),
LineItem(id: '2', name: 'Bread', price: 2),
],
rawText: 'Milk 1.50\nBread 2.00',
repository: ProductRepository(databasePath: ':memory:'),
),
),
);
expect(find.text('Milk'), findsOneWidget);
expect(find.text('Bread'), findsOneWidget);
expect(find.text('Add item'), findsOneWidget);
expect(find.textContaining('Save trip'), findsOneWidget);
expect(find.text('Supermarket'), findsOneWidget);
expect(find.text('Trip name'), findsOneWidget);
expect(find.text('Add tag'), findsOneWidget);
await tester.drag(find.text('Milk'), const Offset(-500, 0));
await tester.pumpAndSettle();
expect(find.text('Milk'), findsNothing);
expect(find.text('Bread'), findsOneWidget);
});
testWidgets('review screen preselects a supermarket from OCR text', (
tester,
) async {
await tester.pumpWidget(
MaterialApp(
home: ReviewScreen(
items: [LineItem(id: '1', name: 'Milk', price: 1.5)],
rawText: 'Jumbo\nMilk 1.50',
repository: ProductRepository(databasePath: ':memory:'),
),
),
);
expect(find.text('Jumbo'), findsWidgets);
});
}