1import 'package:blood_pressure_app/features/measurement_list/weight_list.dart';
  2import 'package:blood_pressure_app/model/storage/interval_store.dart';
  3import 'package:blood_pressure_app/model/storage/settings_store.dart';
  4import 'package:blood_pressure_app/model/weight_unit.dart';
  5import 'package:flutter/material.dart';
  6import 'package:blood_pressure_app/l10n/app_localizations.dart';
  7import 'package:flutter_test/flutter_test.dart';
  8import 'package:health_data_store/health_data_store.dart';
  9
 10import '../../util.dart';
 11
 12void main() {
 13  testWidgets('shows all elements in time range in order', (tester) async {
 14    final interval = IntervalStorage();
 15    interval.changeStepSize(TimeStep.lifetime);
 16
 17    await tester.pumpWidget(await appBaseWithData(
 18      weights: [
 19        BodyweightRecord(time: DateTime(2001), weight: Weight.kg(123.0)),
 20        BodyweightRecord(time: DateTime(2003), weight: Weight.kg(122.1)),
 21        BodyweightRecord(time: DateTime(2000), weight: Weight.kg(70.0)),
 22        BodyweightRecord(time: DateTime(2002), weight: Weight.kg(7000.12345)),
 23      ],
 24      intervallStoreManager: IntervalStoreManager(interval, IntervalStorage(), IntervalStorage()),
 25      const WeightList(rangeType: IntervalStoreManagerLocation.mainPage),
 26    ));
 27    await tester.pumpAndSettle();
 28
 29    expect(find.byType(ListTile), findsNWidgets(4));
 30    expect(find.text('123 kg'), findsOneWidget);
 31    expect(find.text('122.1 kg'), findsOneWidget);
 32    expect(find.text('70 kg'), findsOneWidget);
 33    expect(find.text('7000.12 kg'), findsOneWidget);
 34
 35    expect(
 36      tester.getCenter(find.textContaining('2003')).dy,
 37      lessThan(tester.getCenter(find.textContaining('2002')).dy),
 38    );
 39    expect(
 40      tester.getCenter(find.textContaining('2002')).dy,
 41      lessThan(tester.getCenter(find.textContaining('2001')).dy),
 42    );
 43    expect(
 44      tester.getCenter(find.textContaining('2001')).dy,
 45      lessThan(tester.getCenter(find.textContaining('2000')).dy),
 46    );
 47  });
 48  testWidgets('deletes elements from repo', (tester) async {
 49    final interval = IntervalStorage();
 50    interval.changeStepSize(TimeStep.lifetime);
 51    final repo = MockBodyweightRepository();
 52    await repo.add(BodyweightRecord(time: DateTime(2001), weight: Weight.kg(123.0)));
 53
 54    await tester.pumpWidget(appBase(
 55      weightRepo: repo,
 56      intervallStoreManager: IntervalStoreManager(interval, IntervalStorage(), IntervalStorage()),
 57      const WeightList(rangeType: IntervalStoreManagerLocation.mainPage),
 58    ));
 59    final localizations = await AppLocalizations.delegate.load(const Locale('en'));
 60    await tester.pumpAndSettle();
 61
 62    expect(find.text('123 kg'), findsOneWidget);
 63    expect(find.byIcon(Icons.delete), findsOneWidget);
 64    expect(find.text(localizations.confirmDelete), findsNothing);
 65    expect(find.text(localizations.btnConfirm), findsNothing);
 66
 67    await tester.tap(find.byIcon(Icons.delete));
 68    await tester.pumpAndSettle();
 69
 70    expect(find.text(localizations.confirmDelete), findsOneWidget);
 71    expect(find.text(localizations.btnConfirm), findsOneWidget);
 72
 73    await tester.tap(find.text(localizations.btnConfirm));
 74    await tester.pumpAndSettle();
 75    await tester.pumpAndSettle();
 76    await tester.pumpAndSettle();
 77    await tester.pumpAndSettle();
 78
 79    expect(find.text('123 kg'), findsNothing);
 80    expect(repo.data, isEmpty);
 81  });
 82  testWidgets('respects confirm deletion setting', (tester) async {
 83    final interval = IntervalStorage();
 84    interval.changeStepSize(TimeStep.lifetime);
 85    final repo = MockBodyweightRepository();
 86    await repo.add(BodyweightRecord(time: DateTime(2001), weight: Weight.kg(123.0)));
 87
 88    await tester.pumpWidget(appBase(
 89      weightRepo: repo,
 90      intervallStoreManager: IntervalStoreManager(interval, IntervalStorage(), IntervalStorage()),
 91      settings: Settings(confirmDeletion: false),
 92      const WeightList(rangeType: IntervalStoreManagerLocation.mainPage),
 93    ));
 94    final localizations = await AppLocalizations.delegate.load(const Locale('en'));
 95    await tester.pumpAndSettle();
 96
 97    expect(find.text('123 kg'), findsOneWidget);
 98    expect(find.text(localizations.confirmDelete), findsNothing);
 99
100    await tester.tap(find.byIcon(Icons.delete));
101    await tester.pumpAndSettle();
102
103    expect(find.text(localizations.confirmDelete), findsNothing);
104    expect(find.text('123 kg'), findsNothing);
105  });
106  testWidgets('respects confirm weight unit setting', (tester) async {
107    final interval = IntervalStorage();
108    interval.changeStepSize(TimeStep.lifetime);
109    final repo = MockBodyweightRepository();
110    await repo.add(BodyweightRecord(time: DateTime(2001), weight: Weight.kg(123.0)));
111
112    await tester.pumpWidget(appBase(
113      weightRepo: repo,
114      intervallStoreManager: IntervalStoreManager(interval, IntervalStorage(), IntervalStorage()),
115      settings: Settings(weightUnit: WeightUnit.lbs),
116      const WeightList(rangeType: IntervalStoreManagerLocation.mainPage),
117    ));
118    await tester.pumpAndSettle();
119
120    expect(find.text('123 kg'), findsNothing);
121    expect(find.text('55.79 lbs'), findsOneWidget);
122  });
123}