import 'package:drift/native.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:glp1_companion/core/database/app_database.dart'; import 'package:glp1_companion/features/medication/data/repositories/medication_repository.dart'; import 'package:glp1_companion/features/medication/domain/entities/dose_entry.dart'; import 'package:glp1_companion/features/medication/domain/entities/injection_site.dart'; void main() { late AppDatabase database; late MedicationRepository repository; final administeredAt = DateTime(2026, 10, 16, 8); setUp(() { database = AppDatabase.forTesting(NativeDatabase.memory()); repository = MedicationRepository(database); }); tearDown(() => database.close()); DoseEntry makeEntry({ int? id, String compound = 'Tirzepatide', double doseMg = 5, DateTime? administered, InjectionSite? site, }) => DoseEntry( id: id, compoundName: compound, doseMg: doseMg, administeredAt: administered ?? administeredAt, injectionSite: site, ); group('MedicationRepository', () { test('saveDoseEntry assigns an id and persists all fields', () async { final saved = await repository.saveDoseEntry( makeEntry(site: InjectionSite.abdomenLeftLower, doseMg: 4.5), ); expect(saved.id, isNotNull); final fetched = await repository.getDoseEntries(); expect(fetched, hasLength(1)); expect(fetched.single.id, saved.id); expect(fetched.single.compoundName, 'Tirzepatide'); expect(fetched.single.doseMg, 4.5); expect(fetched.single.administeredAt, administeredAt); expect(fetched.single.injectionSite, InjectionSite.abdomenLeftLower); }); test('getDoseEntries returns entries newest first', () async { await repository.saveDoseEntry( makeEntry(administered: administeredAt.subtract(const Duration(days: 7))), ); await repository.saveDoseEntry( makeEntry(administered: administeredAt), ); final entries = await repository.getDoseEntries(); expect(entries, hasLength(2)); expect(entries.first.administeredAt, administeredAt); expect(entries.last.administeredAt, administeredAt.subtract(const Duration(days: 7))); }); test('watchDoseEntries emits the current history on subscription', () async { await repository.saveDoseEntry(makeEntry()); final first = await repository.watchDoseEntries().first; expect(first, hasLength(1)); }); test('saveDoseEntry updates an existing row when id is present', () async { final saved = await repository.saveDoseEntry(makeEntry()); final updated = await repository.saveDoseEntry( makeEntry(id: saved.id, doseMg: 9.5, site: InjectionSite.thighLeftAnterior), ); expect(updated.id, saved.id); final entries = await repository.getDoseEntries(); expect(entries, hasLength(1)); expect(entries.single.doseMg, 9.5); expect(entries.single.injectionSite, InjectionSite.thighLeftAnterior); }); test('deleteDoseEntry removes the row', () async { final saved = await repository.saveDoseEntry(makeEntry()); await repository.deleteDoseEntry(saved.id!); expect(await repository.getDoseEntries(), isEmpty); }); test('getLatestAdministeredDose ignores an empty history', () async { expect(await repository.getLatestAdministeredDose(), isNull); }); test('getLatestAdministeredDose returns the most recent administration', () async { final older = await repository.saveDoseEntry( makeEntry(administered: administeredAt.subtract(const Duration(days: 7))), ); await repository.saveDoseEntry(makeEntry(administered: administeredAt)); final latest = await repository.getLatestAdministeredDose(); expect(latest?.id, isNot(older.id)); expect(latest?.administeredAt, administeredAt); }); }); }