import 'package:flutter_test/flutter_test.dart'; import 'package:tane/db/database.dart'; import 'package:tane/db/enums.dart'; import '../support/test_support.dart'; void main() { late AppDatabase db; setUp(() => db = newTestDatabase()); tearDown(() => db.close()); test('shareableLots returns non-private lots with their id and label', () async { final repo = newTestRepository(db); final varietyId = await repo.addQuickVariety( label: 'Tomate rosa', category: 'Solanaceae', ); final sharedId = await repo.addLot( varietyId: varietyId, offerStatus: OfferStatus.exchange, ); final lots = await repo.shareableLots(); final shared = lots.where((l) => l.lotId == sharedId).toList(); expect(shared, hasLength(1)); expect(shared.single.summary, 'Tomate rosa'); expect(shared.single.offerStatus, OfferStatus.exchange); expect(shared.single.category, 'Solanaceae'); }); test('private lots are never shareable', () async { final repo = newTestRepository(db); final varietyId = await repo.addQuickVariety(label: 'Pimiento'); final privateId = await repo.addLot( varietyId: varietyId, offerStatus: OfferStatus.private, ); final lots = await repo.shareableLots(); expect(lots.where((l) => l.lotId == privateId), isEmpty); }); test('sell lots expose their asking price; other statuses never do', () async { final repo = newTestRepository(db); final varietyId = await repo.addQuickVariety(label: 'Calabaza'); final sellId = await repo.addLot( varietyId: varietyId, offerStatus: OfferStatus.sell, priceAmount: 3.5, priceCurrency: 'Ğ1', ); // Price passed on a gift lot is dropped, not stored. final giftId = await repo.addLot( varietyId: varietyId, offerStatus: OfferStatus.shared, priceAmount: 99, priceCurrency: '€', ); final lots = await repo.shareableLots(); final sell = lots.singleWhere((l) => l.lotId == sellId); expect(sell.priceAmount, 3.5); expect(sell.priceCurrency, 'Ğ1'); final gift = lots.singleWhere((l) => l.lotId == giftId); expect(gift.priceAmount, isNull); expect(gift.priceCurrency, isNull); }); test('a sell lot without amount is "to be agreed" — shareable, no price', () async { final repo = newTestRepository(db); final varietyId = await repo.addQuickVariety(label: 'Lechuga'); final sellId = await repo.addLot( varietyId: varietyId, offerStatus: OfferStatus.sell, ); final lots = await repo.shareableLots(); final sell = lots.singleWhere((l) => l.lotId == sellId); expect(sell.priceAmount, isNull); }); test('moving a lot out of sale clears its stored price', () async { final repo = newTestRepository(db); final varietyId = await repo.addQuickVariety(label: 'Haba'); final lotId = await repo.addLot( varietyId: varietyId, offerStatus: OfferStatus.sell, priceAmount: 2, priceCurrency: '€', ); await repo.updateLot( lotId: lotId, type: LotType.seed, offerStatus: OfferStatus.shared, // Price args still sent by the form; must be ignored off-sale. priceAmount: 2, priceCurrency: '€', ); final detail = await repo.watchVariety(varietyId).first; final lot = detail!.lots.singleWhere((l) => l.id == lotId); expect(lot.priceAmount, isNull); expect(lot.priceCurrency, isNull); expect(lot.offerStatus, OfferStatus.shared); }); }