import 'package:flutter_test/flutter_test.dart'; import 'package:myapp/models/overview_favourite.dart'; import 'package:myapp/models/transaction_meta.dart'; import 'package:myapp/services/pb_sync_service.dart'; import 'package:myapp/widgets/label_filter_dialog.dart'; void main() { test('OverviewFavourite JSON round-trips', () { const fav = OverviewFavourite( id: 'fav_1', name: 'Groceries', display: true, metric: OverviewMetricMode.labels, period: OverviewPeriodMode.monthly, labelIds: ['groceries', 'custom_ah'], flow: TxFlowFilter.expense, barStyle: LabelChartBarStyle.stacked, invertExpensePerspective: false, ); final restored = OverviewFavourite.fromJson(fav.toJson()); expect(restored.id, fav.id); expect(restored.name, fav.name); expect(restored.display, isTrue); expect(restored.metric, OverviewMetricMode.labels); expect(restored.period, OverviewPeriodMode.monthly); expect(restored.labelIds, ['groceries', 'custom_ah']); expect(restored.flow, TxFlowFilter.expense); expect(restored.barStyle, LabelChartBarStyle.stacked); }); test('mergeOverviewFavourites unions by id with local wins', () { const local = OverviewFavourite( id: 'fav_1', name: 'Local name', display: true, ); const remoteOnly = OverviewFavourite( id: 'fav_2', name: 'Remote only', display: false, metric: OverviewMetricMode.labels, ); const remoteConflict = OverviewFavourite( id: 'fav_1', name: 'Remote name', display: false, ); final merged = mergeOverviewFavourites( [local], [remoteConflict, remoteOnly], ); expect(merged.length, 2); final byId = {for (final f in merged) f.id: f}; expect(byId['fav_1']!.name, 'Local name'); expect(byId['fav_1']!.display, isTrue); expect(byId['fav_2']!.name, 'Remote only'); }); }