import 'package:flutter_test/flutter_test.dart'; import 'package:kooltab2/models/bar_tab.dart'; import 'package:kooltab2/models/closed_tab.dart'; import 'package:kooltab2/models/payment_method.dart'; import 'package:kooltab2/services/bar_tab_service.dart'; import 'package:kooltab2/viewmodels/history_view_model.dart'; import 'package:mocktail/mocktail.dart'; class MockBarTabService extends Mock implements BarTabService {} void main() { late MockBarTabService service; late HistoryViewModel viewModel; setUp(() { service = MockBarTabService(); viewModel = HistoryViewModel(barTabService: service); when( () => service.getClosedTabsPaginated( limit: 20, offset: 0, customerName: null, ), ).thenAnswer((_) async => []); when( () => service.getClosedTabCount(customerName: null), ).thenAnswer((_) async => 0); when(() => service.getDistinctCustomerNames()).thenAnswer((_) async => []); when( () => service.getOpenTabs(includeRemoved: true), ).thenAnswer((_) async => [_openTab]); }); test('loads open tabs for the top of history', () async { await viewModel.load(); expect(viewModel.openTabs, hasLength(1)); expect(viewModel.openTabs.first.customerName, 'Alice'); expect(viewModel.customerNames, ['Alice']); }); test('search filters open tabs as well as closed tabs', () async { await viewModel.load(); viewModel.search('bob'); expect(viewModel.openTabs, isEmpty); }); test('sorts closed and open tabs newest first', () async { final olderClosedTab = _closedTab('closed-old', DateTime(2026, 8, 1)); final newerClosedTab = _closedTab('closed-new', DateTime(2026, 8, 3)); final olderOpenTab = _barTab('open-old', DateTime(2026, 8, 1)); final newerOpenTab = _barTab('open-new', DateTime(2026, 8, 3)); when( () => service.getClosedTabsPaginated( limit: 20, offset: 0, customerName: null, ), ).thenAnswer((_) async => [olderClosedTab, newerClosedTab]); when( () => service.getClosedTabCount(customerName: null), ).thenAnswer((_) async => 2); when( () => service.getOpenTabs(includeRemoved: true), ).thenAnswer((_) async => [olderOpenTab, newerOpenTab]); await viewModel.load(); expect(viewModel.closedTabs.map((tab) => tab.id), [ 'closed-new', 'closed-old', ]); expect(viewModel.openTabs.map((tab) => tab.id), ['open-new', 'open-old']); }); } ClosedTab _closedTab(String id, DateTime closedAt) { return ClosedTab( id: id, originalTabId: id, customerName: id, closedAt: closedAt, paymentMethod: PaymentMethod.cash, items: const [], ); } BarTab _barTab(String id, DateTime openedAt) { return BarTab( id: id, customerName: id, status: 'open', openedAt: openedAt, items: const [], ); } final _openTab = BarTab( id: 'tab-1', customerName: 'Alice', status: 'open', openedAt: DateTime(2026, 8, 2, 12), items: const [], );