import 'package:flutter_test/flutter_test.dart'; import 'package:tane/db/database.dart'; import 'package:tane/db/enums.dart'; import '../support/test_support.dart'; /// A Sale is a recorded seed sale/purchase — a model separate from a gift or a /// Plantare, with a price in any currency. void main() { late AppDatabase db; setUp(() => db = newTestDatabase()); tearDown(() => db.close()); test('records a sale with amount + currency and lists it', () async { final repo = newTestRepository(db); final vid = await repo.addQuickVariety(label: 'Tomate rosa'); await repo.createSale( direction: SaleDirection.iSold, varietyId: vid, counterparty: 'Ana', amount: 5, currency: '€', ); final all = await repo.watchSales().first; expect(all.single.direction, SaleDirection.iSold); expect(all.single.amount, 5); expect(all.single.currency, '€'); expect(all.single.counterparty, 'Ana'); expect(await repo.watchSalesForVariety(vid).first, hasLength(1)); }); test('supports any currency (Ğ1, time…) and a price-less record', () async { final repo = newTestRepository(db); await repo.createSale(direction: SaleDirection.iBought, amount: 12, currency: 'Ğ1'); await repo.createSale(direction: SaleDirection.iSold); // no figure yet final all = await repo.watchSales().first; expect(all, hasLength(2)); expect(all.any((s) => s.currency == 'Ğ1' && s.amount == 12), isTrue); expect(all.any((s) => s.amount == null), isTrue); }); test('deleting a sale tombstones it', () async { final repo = newTestRepository(db); final id = await repo.createSale(direction: SaleDirection.iSold, amount: 3); expect(await repo.watchSales().first, hasLength(1)); await repo.deleteSale(id); expect(await repo.watchSales().first, isEmpty); }); test('sales survive a backup round-trip', () async { final repoA = newTestRepository(db); await repoA.createSale( direction: SaleDirection.iSold, counterparty: 'Feria de la comarca', amount: 2.5, currency: '€', ); final snapshot = await repoA.exportInventory(); expect(snapshot.sales, hasLength(1)); final dbB = newTestDatabase(); addTearDown(dbB.close); final repoB = newTestRepository(dbB); await repoB.importInventory(snapshot); final onB = await repoB.watchSales().first; expect(onB.single.amount, 2.5); expect(onB.single.currency, '€'); expect(onB.single.counterparty, 'Feria de la comarca'); }); }