import 'dart:typed_data'; import 'package:commons_core/commons_core.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:tane/data/variety_repository.dart'; import 'package:tane/db/database.dart'; import 'package:tane/db/enums.dart'; import '../support/test_support.dart'; void main() { late AppDatabase db; late VarietyRepository repo; setUp(() { db = newTestDatabase(); repo = newTestRepository(db); }); tearDown(() => db.close()); test( 'addQuickVariety persists a variety that appears in the stream', () async { await repo.addQuickVariety( label: 'Grandma tomato', category: 'Solanaceae', ); final items = await repo.watchInventory().first; expect(items.single.label, 'Grandma tomato'); expect(items.single.category, 'Solanaceae'); }, ); test( 'a quantity creates a Lot and a photo creates an encrypted-BLOB Attachment', () async { final id = await repo.addQuickVariety( label: 'Maize', quantity: const Quantity(kind: QuantityKind.cob), photoBytes: Uint8List.fromList([1, 2, 3]), ); final lot = await db.select(db.lots).getSingle(); expect(lot.varietyId, id); expect(lot.quantityKind, 'cob'); final attachment = await db.select(db.attachments).getSingle(); expect(attachment.parentType, ParentType.variety); expect(attachment.parentId, id); expect(attachment.kind, AttachmentKind.photo); expect(attachment.bytes, [1, 2, 3]); }, ); test( 'stream is ordered by category then label and excludes soft-deleted rows', () async { await repo.addQuickVariety(label: 'Bean', category: 'Fabaceae'); await repo.addQuickVariety(label: 'Apple', category: 'Rosaceae'); await repo.addQuickVariety(label: 'Almond', category: 'Rosaceae'); final items = await repo.watchInventory().first; expect(items.map((i) => i.label), ['Bean', 'Almond', 'Apple']); }, ); test('writes stamp a monotonic HLC into updated_at', () async { await repo.addQuickVariety(label: 'First'); await repo.addQuickVariety(label: 'Second'); final rows = await db.select(db.varieties).get(); final stamps = rows.map((r) => r.updatedAt).toList()..sort(); // Distinct, parseable, ordered HLC stamps. expect(stamps.toSet().length, 2); expect(() => stamps.map(Hlc.parse).toList(), returnsNormally); }); }