Phase 2 du MVP Flutter : vérification PIN locale, application des règles par famille, suivi des mouvements et correction avec plancher à 0. Co-authored-by: Cursor <cursoragent@cursor.com>
52 lines
1.5 KiB
Dart
52 lines
1.5 KiB
Dart
import 'package:bonpoint/data/database/app_database.dart';
|
|
import 'package:drift/native.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
late AppDatabase db;
|
|
|
|
setUp(() async {
|
|
db = AppDatabase.forTesting(NativeDatabase.memory());
|
|
await db.importDefaultPack();
|
|
});
|
|
|
|
tearDown(() async {
|
|
await db.close();
|
|
});
|
|
|
|
test('annulerMouvement inverse le delta avec plancher à 0', () async {
|
|
final childId = await db.insertChild(
|
|
prenom: 'Léa',
|
|
couleur: '#6C63FF',
|
|
);
|
|
|
|
final rules = await db.listActiveRules();
|
|
final positiveRule = rules.firstWhere((r) => r.points == 1);
|
|
final negativeRule = rules.firstWhere((r) => r.points == -2);
|
|
|
|
await db.applyRule(childId, positiveRule.id);
|
|
await db.applyRule(childId, negativeRule.id);
|
|
|
|
final movements = await db.select(db.mouvements).get();
|
|
expect(movements.length, 2);
|
|
|
|
final childBefore = await (db.select(db.enfants)
|
|
..where((e) => e.id.equals(childId)))
|
|
.getSingle();
|
|
expect(childBefore.score, 0);
|
|
|
|
// Annuler le mouvement négatif (delta réel -1) → score remonte à 1
|
|
final negativeMovement =
|
|
movements.firstWhere((m) => m.delta < 0);
|
|
await db.cancelMovement(negativeMovement.id);
|
|
|
|
final childAfter = await (db.select(db.enfants)
|
|
..where((e) => e.id.equals(childId)))
|
|
.getSingle();
|
|
expect(childAfter.score, 1);
|
|
|
|
final remaining = await db.listRecentMovements();
|
|
expect(remaining.length, 1);
|
|
});
|
|
}
|