109 lines
3.0 KiB
Dart
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 [],
|
|
);
|