glp-companion/test/features/medication/data/medication_repository_test....

112 lines
3.9 KiB
Dart

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);
});
});
}