Statistiques — refonte complète, aucun changement backend statistics_screen.dart réécrit (+1832) : barres horizontales monochromes à la place des barres verticales tronquées et des deux anneaux, barre de filtres unique avec les volumes par canal, règle mono-canal, 4 KPI portant chacun leur variation, bandeau « à retenir », courbe en aire avec bandes de week-end. La période précédente s'obtient en rappelant le même endpoint. statistics_report.dart : export PDF généré côté client (paquet pdf Dart), il partage les valeurs calculées de l'écran — un chiffre ne peut pas diverger entre l'écran et le document envoyé à la commune. Deux puces du sommaire promettaient des données inexistantes (parcours terminés, questions au guide IA), retirées. ⚠️ Jamais ouvert dans un navigateur. Cases de test : test-plan.md §8bis / §8ter. Guide IA Screens/GuideIa/guide_ia_screen.dart — onglet Configuration. Menu conditionné à isAssistant, le même drapeau que la garde d'AiController. L'onglet « Ce que demandent vos visiteurs » n'est pas dans ce commit : le schéma backend est prêt, l'UI non. Onboarding self-service Screens/Auth/ (mot de passe oublié, définition du mot de passe), Screens/Billing/subscription_screen.dart, ai_quota_hint.dart. ⚠️ Aucun parcours joué de bout en bout — test-plan.md §18. Parcours guidés progression_mode.dart : 9 booléens sur 3 niveaux remplacés par 3 questions. Popups GuidedPath / GuidedStep / QuizQuestion mises à jour en conséquence. Client API (manager_api_new) — édité À LA MAIN, ne pas relancer la génération onboarding_api.dart, authentication_api.dart (+80), instance_dto (champs Guide*), guided_step / quiz_question_guided_step (flags morts retirés). Le // @dart=2.18 manquant dans onboarding_api.dart cassait les 3 apps Flutter d'un coup — corrigé ici. i18n : ~180 clés par langue (FR/EN/NL) + fichiers générés. Tests : progression_mode_test, statistics_report_test (le second a attrapé deux plantages qui seraient sortis au premier clic). flutter build web ✅. flutter analyze : 68 erreurs, toutes dans les fichiers modèle orphelins de manager_api_new — dette connue, pas une régression, ces fichiers ne sont pas dans le graphe de compilation.
101 lines
3.2 KiB
Dart
101 lines
3.2 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:manager_app/Screens/Statistics/statistics_report.dart';
|
|
|
|
StatisticsReportData _data({
|
|
List<ReportDayPoint> series = const [],
|
|
List<ReportBarGroup> barGroups = const [],
|
|
List<ReportTable> tables = const [],
|
|
List<int> axisLabels = const [],
|
|
}) {
|
|
return StatisticsReportData(
|
|
instanceName: 'Fort Saint Héribert',
|
|
title: 'Votre rapport de fréquentation',
|
|
periodLabel: 'Du 1 août au 31 août 2026',
|
|
takeaways: const [
|
|
'La fréquentation progresse de 18 % par rapport à la période précédente.',
|
|
'Le guide vocal représente 12 % des visites.',
|
|
],
|
|
kpis: const [
|
|
ReportKpi('Visites', '3 847', '18 % vs période précédente'),
|
|
ReportKpi('Durée moyenne', '14 min 20 s', '2 min 10 s'),
|
|
ReportKpi('Contenus par visite', '5,2', null),
|
|
ReportKpi('Part du guide vocal', '12 %', 'stable'),
|
|
],
|
|
chartTitle: 'Visites par jour',
|
|
chartSubtitle: 'Nombre de consultations sur la période',
|
|
series: series,
|
|
axisLabels: axisLabels,
|
|
peakLabel: 'Pic le 22 août — 288 visites',
|
|
barGroups: barGroups,
|
|
tables: tables,
|
|
generatedLabel: 'Rapport généré le 7 août avec MyInfoMate',
|
|
brandArgb: 0xFF264863,
|
|
logo: null,
|
|
);
|
|
}
|
|
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
test('le rapport complet produit un PDF', () async {
|
|
final series = [
|
|
for (var day = 1; day <= 31; day++)
|
|
ReportDayPoint('$day août', day % 7 == 0 ? 288 : 80 + day * 3),
|
|
];
|
|
|
|
final bytes = await buildStatisticsReport(_data(
|
|
series: series,
|
|
axisLabels: const [0, 6, 12, 18, 24, 30],
|
|
barGroups: const [
|
|
ReportBarGroup('Contenus les plus consultés', 'Nombre de consultations', [
|
|
ReportBar('Histoire du fort', '1 284', 1),
|
|
ReportBar('La vie quotidienne des soldats', '731', 0.569),
|
|
ReportBar('Quiz « Connais-tu le fort ? »', '337', 0.262),
|
|
]),
|
|
ReportBarGroup('Canaux', 'Visites par canal', [
|
|
ReportBar('Site web', '1 642', 1),
|
|
ReportBar('Guide vocal', '463', 0.282),
|
|
]),
|
|
],
|
|
tables: const [
|
|
ReportTable('Top POI', ['POI', 'Taps'], [
|
|
['Casemate nord', '212'],
|
|
['Poudrière', '96'],
|
|
]),
|
|
],
|
|
));
|
|
|
|
expect(bytes.length, greaterThan(1000));
|
|
expect(String.fromCharCodes(bytes.take(5)), '%PDF-');
|
|
});
|
|
|
|
test('le rapport tient sans courbe, sans barres et sans tableaux', () async {
|
|
final bytes = await buildStatisticsReport(_data());
|
|
|
|
expect(bytes.length, greaterThan(1000));
|
|
expect(String.fromCharCodes(bytes.take(5)), '%PDF-');
|
|
});
|
|
|
|
test('une série d\'un seul point sort le rapport sans courbe', () async {
|
|
final bytes = await buildStatisticsReport(_data(
|
|
series: const [ReportDayPoint('7 août', 3)],
|
|
axisLabels: const [0],
|
|
));
|
|
|
|
expect(bytes.length, greaterThan(1000));
|
|
});
|
|
|
|
test('une série entièrement à zéro reste traçable', () async {
|
|
final bytes = await buildStatisticsReport(_data(
|
|
series: const [
|
|
ReportDayPoint('1 août', 0),
|
|
ReportDayPoint('2 août', 0),
|
|
ReportDayPoint('3 août', 0),
|
|
],
|
|
axisLabels: const [0, 2],
|
|
));
|
|
|
|
expect(bytes.length, greaterThan(1000));
|
|
});
|
|
}
|