import 'package:flutter_test/flutter_test.dart'; import 'package:myapp/models/overview_favourite.dart'; import 'package:myapp/models/transaction_meta.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, updatedAt: 100, deleted: 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); expect(restored.updatedAt, 100); expect(restored.deleted, isFalse); }); test('mergeOverviewFavourites unions by id with last-write-wins', () { const local = OverviewFavourite( id: 'fav_1', name: 'Local name', display: true, updatedAt: 200, ); const remoteOnly = OverviewFavourite( id: 'fav_2', name: 'Remote only', display: false, metric: OverviewMetricMode.labels, updatedAt: 50, ); const remoteConflictOlder = OverviewFavourite( id: 'fav_1', name: 'Remote name', display: false, updatedAt: 100, ); const remoteConflictNewer = OverviewFavourite( id: 'fav_3', name: 'Remote newer', display: true, updatedAt: 300, ); const localOlder = OverviewFavourite( id: 'fav_3', name: 'Local older', display: false, updatedAt: 10, ); final merged = mergeOverviewFavourites( [local, localOlder], [remoteConflictOlder, remoteOnly, remoteConflictNewer], ); expect(merged.length, 3); 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'); expect(byId['fav_3']!.name, 'Remote newer'); }); }