diet-guard/app/test/screens/edit_entry_screen_test.dart
2026-11-09 08:21:05 +01:00

157 lines
4.8 KiB
Dart

import 'dart:io';
import 'package:diet_guard_app/services/document_store_io.dart';
import 'package:diet_guard_app/models/food_bank_record.dart';
import 'package:diet_guard_app/models/food_entry.dart';
import 'package:diet_guard_app/screens/edit_entry_screen.dart';
import 'package:diet_guard_app/screens/history_screen.dart';
import 'package:diet_guard_app/services/foodbank_service.dart';
import 'package:diet_guard_app/services/log_storage_service.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import '../label_finders.dart';
const _entry = FoodEntry(
id: 'test-uuid',
time: '2026-06-22T12:00:00+02:00',
desc: 'pizza obok pracy',
grams: 400,
kcal: 1200,
proteinG: 52,
carbsG: 145,
fatG: 42,
source: 'manual',
);
void main() {
late Directory tempDir;
setUp(() async {
tempDir = await Directory.systemTemp.createTemp('diet_guard_edit_test_');
LogStorageService.resetForTesting(store: FileDocumentStore(tempDir));
FoodBankService.resetForTesting(store: FileDocumentStore(tempDir));
});
tearDown(() async {
LogStorageService.resetForTesting();
FoodBankService.resetForTesting();
await tempDir.delete(recursive: true);
});
Future<void> settle(WidgetTester tester) async {
await Future<void>.delayed(const Duration(milliseconds: 200));
await tester.pumpAndSettle();
}
testWidgets('pre-fills all fields from the entry', (tester) async {
await tester.runAsync(() async {
await LogStorageService.instance.writeLog({
'2026-06-22': [_entry],
});
await tester.pumpWidget(
MaterialApp(home: EditEntryScreen(entry: _entry)),
);
await settle(tester);
expect(find.text('pizza obok pracy'), findsOneWidget);
expect(find.text('1200'), findsOneWidget);
expect(find.text('52'), findsOneWidget);
expect(find.text('145'), findsOneWidget);
expect(find.text('42'), findsOneWidget);
expect(find.text('400'), findsOneWidget);
});
});
testWidgets('Save button is present and AppBar title is correct', (
tester,
) async {
await tester.runAsync(() async {
await LogStorageService.instance.writeLog({
'2026-06-22': [_entry],
});
await tester.pumpWidget(
MaterialApp(home: EditEntryScreen(entry: _entry)),
);
await settle(tester);
expect(find.byType(EditEntryScreen), findsOneWidget);
expect(byIconLabel('Save'), findsOneWidget);
});
});
testWidgets('shows error when description is cleared', (tester) async {
await tester.runAsync(() async {
await LogStorageService.instance.writeLog({
'2026-06-22': [_entry],
});
await tester.pumpWidget(
MaterialApp(home: EditEntryScreen(entry: _entry)),
);
await settle(tester);
// Clear the description field.
final descField = find.ancestor(
of: find.text('pizza obok pracy'),
matching: find.byType(TextField),
);
await tester.enterText(descField, '');
await tester.tap(byIconLabel('Save'));
await settle(tester);
expect(cueLabelled('Description cannot be empty.'), findsOneWidget);
});
});
testWidgets('Save persists updated kcal to the log', (tester) async {
await tester.runAsync(() async {
await LogStorageService.instance.writeLog({
'2026-06-22': [_entry],
});
await tester.pumpWidget(
MaterialApp(home: EditEntryScreen(entry: _entry)),
);
await settle(tester);
// Change kcal.
await tester.enterText(
find.ancestor(of: find.text('1200'), matching: find.byType(TextField)),
'999',
);
await tester.tap(byIconLabel('Save'));
await settle(tester);
final log = await LogStorageService.instance.readLog();
final saved = log['2026-06-22']!.first;
expect(saved.kcal, 999);
expect(saved.desc, 'pizza obok pracy');
expect(saved.id, 'test-uuid');
});
});
testWidgets('legacy null-id entry gains a UUID on save', (tester) async {
await tester.runAsync(() async {
const legacy = FoodEntry(
time: '2026-06-22T08:00:00+02:00',
desc: 'kabanosy',
grams: 380,
kcal: 1174,
proteinG: 53,
carbsG: 19,
fatG: 152,
source: 'food bank',
);
await LogStorageService.instance.writeLog({
'2026-06-22': [legacy],
});
await tester.pumpWidget(
MaterialApp(home: EditEntryScreen(entry: legacy)),
);
await settle(tester);
await tester.tap(byIconLabel('Save'));
await settle(tester);
final log = await LogStorageService.instance.readLog();
final saved = log['2026-06-22']!.first;
expect(saved.id, isNotNull);
expect(saved.id, isNotEmpty);
expect(saved.kcal, 1174);
});
});
}