112 lines
3.9 KiB
Dart
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);
|
|
});
|
|
});
|
|
} |