import 'package:flutter_test/flutter_test.dart'; import 'package:zenxercise/src/database/database.dart'; import 'package:zenxercise/src/modes/mode.dart'; import 'package:zenxercise/src/plans/models/plan.dart'; import 'package:zenxercise/src/plans/plan_repository.dart'; import '../support/test_database.dart'; void main() { late AppDatabase db; late PlanRepository plans; var now = DateTime(2026, 10, 1, 8); setUp(() { db = testDatabase(); now = DateTime(2026, 10, 1, 8); plans = PlanRepository(db, clock: () => now); }); tearDown(() => db.close()); test('a created Plan is empty, belongs to its Mode and is listed newest first', () async { final morning = await plans.create(Mode.stretching, 'Morning'); now = now.add(const Duration(hours: 1)); final evening = await plans.create(Mode.stretching, 'Evening'); await plans.create(Mode.workout, 'Legs'); final listed = await plans.watchPlans(Mode.stretching).first; expect(listed.map((p) => p.name), ['Evening', 'Morning']); expect(morning.items, isEmpty); expect(evening.transitionSeconds, Plan.defaultTransitionSeconds); }); test('saving keeps the items and stamps the change time', () async { final plan = await plans.create(Mode.workout, 'Push'); now = DateTime(2026, 10, 2); await plans.save(plan.withExerciseAdded('Bench').withExerciseAdded('Dips').withSupersetWithNext(0)); final stored = (await plans.get(plan.id))!; expect(stored.items.single, isA()); expect(stored.updatedAt, DateTime(2026, 10, 2)); expect(stored.createdAt, plan.createdAt); }); test('a duplicate copies the items under a new id and name', () async { final plan = await plans.create(Mode.workout, 'Push'); await plans.save(plan.withExerciseAdded('Bench')); final copy = await plans.duplicate(plan.id, 'Push (copy)'); expect(copy.id, isNot(plan.id)); expect(copy.items, (await plans.get(plan.id))!.items); expect((await plans.watchPlans(Mode.workout).first), hasLength(2)); }); test('a deleted Plan is gone', () async { final plan = await plans.create(Mode.workout, 'Push'); await plans.delete(plan.id); expect(await plans.get(plan.id), isNull); }); }