Files
kooltab/test/history_view_model_test.dart
T

109 lines
3.0 KiB
Dart

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 [],
);