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>
61 lines
1.7 KiB
Dart
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);
|
|
});
|
|
}
|