bonpoint/mobile/test/score_logic_test.dart
Julien Martin aac3a729a2 Initialise l'app Flutter mobile : BDD Drift, onboarding sans compte et tableau de bord.
Phase 1 du MVP : schéma SQLite porté depuis le prototype web, seed des règles/récompenses, flux d'onboarding en 4 étapes et écran d'accueil minimal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-12 12:12:01 +02:00

61 lines
1.7 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('appliquerRegle respecte le plancher à 0', () async {
final childId = await db.insertChild(
prenom: 'Test',
couleur: '#6C63FF',
);
final rules = await db.select(db.regles).get();
final positiveRule = rules.firstWhere((r) => r.points == 1);
final negativeRule = rules.firstWhere((r) => r.points == -2);
await db.applyRule(childId, positiveRule.id);
// Score = 1, puis règle -2 → score 0, delta réel -1
await db.applyRule(childId, negativeRule.id);
// Score déjà 0, règle -2 → score 0, delta réel 0
await db.applyRule(childId, negativeRule.id);
final child = await (db.select(db.enfants)
..where((e) => e.id.equals(childId)))
.getSingle();
expect(child.score, 0);
final movements = await db.select(db.mouvements).get();
expect(movements.length, 3);
expect(movements[0].delta, 1);
expect(movements[1].delta, -1);
expect(movements[2].delta, 0);
});
test('delta enregistré est le delta réel (pas le delta théorique)', () async {
final childId = await db.insertChild(
prenom: 'Test',
couleur: '#6C63FF',
);
final rules = await db.select(db.regles).get();
final rule = rules.firstWhere((r) => r.points == -2);
await db.applyRule(childId, rule.id);
final movement = await db.select(db.mouvements).getSingle();
expect(movement.delta, 0);
});
}