etm-powersync-app/test/flux_signe_test.dart
Patrick Schurig cd202840f1 fix(flux): la production restait négative dans le DÉTAIL, et le tableau de bord ignorait la config
Deux défauts trouvés en vérifiant la correction précédente à l'écran.

1. « -1.3 kW · Solaire » dans « Production — détail ». La correction du
   2026-09-05 n'avait redressé QUE le nœud de la vue d'ensemble : la même
   grandeur est rendue à deux endroits, et le grep qui avait servi cherchait
   `pvPower.abs` — donc il montrait la ligne déjà corrigée et cachait l'autre.
   Un test couvre désormais le détail, en éprouvant l'ABSENCE du signe.

2. PAC et « Eau chaude » affichaient « non publié » alors que la box publie
   `{powerW: 0, source: "meter"}` pour les deux. `LoadConfigProvider.load()`
   n'était appelé que par l'écran des rôles : sur le tableau de bord la
   configuration est vide, aucun `domain` ne se rattache, et la carte reste sans
   valeur. Une absence CÔTÉ APP présentée comme une absence côté box — le défaut
   qu'on venait de corriger, reproduit un cran plus loin, et trompeur de la même
   façon : on en conclurait que la box ne publie rien.

Vérifié à l'écran entre les deux : « non publié » est lisible dans les cercles,
« Autres » a disparu, et le détail production ne montre plus d'onduleurs
fabriqués mais « Détail par source non publié par cette box ».

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw
2026-09-06 13:24:53 +02:00

67 lines
3.3 KiB
Dart

/// **Une production ne s'affiche pas en négatif.**
///
/// Vu sur appareil le 2026-09-05 à 16:52 : « **-8.9 kW · Solaire** » sous un soleil de
/// 9 kW. `Energy.GetPowerBalance` publiait `currentPowerProduction: -8980.4` — nymea donne
/// la production en négatif, et `NymeaService` garde les signes bruts par politique (§7.1).
/// La carte imprimait donc la valeur telle quelle.
///
/// Ce qui rend le défaut net plutôt qu'opinable : **la même carte normalisait déjà** le
/// réseau et la batterie par `.abs()`. La branche solaire était la seule oubliée — donc ce
/// n'était pas une convention d'affichage assumée, c'était un oubli.
///
/// Ce test existe parce que l'écran ne pouvait plus le montrer : à 17:03 la production du
/// banc était retombée à 0 W, et `abs(0) == 0`. Une correction qu'on ne peut pas voir
/// demande une garde qui, elle, se voit.
library;
import 'package:etm_powersync_app/features/dashboard/widgets/energy_flow_card.dart';
import 'package:etm_powersync_app/models/energy_data.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
Future<void> _poser(WidgetTester tester, EnergyData d) async {
await tester.binding.setSurfaceSize(const Size(1000, 1600));
addTearDown(() => tester.binding.setSurfaceSize(null));
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: EnergyFlowCard(data: d))));
await tester.pump(const Duration(seconds: 2));
}
void main() {
testWidgets('la production publiée NÉGATIVE s\'affiche positive', (tester) async {
// La charge utile réelle du 2026-09-05 16:52.
await _poser(tester, const EnergyData(pvPower: -8980.4, homePower: 3249.4));
// -8 980,4 W -> 8,98 kW -> « 9.0 kW » à une décimale. (Sur appareil la valeur de
// l'instant donnait « -8.9 kW » ; c'est le SIGNE qui est en cause, pas l'arrondi.)
expect(find.text('9.0 kW'), findsOneWidget);
expect(find.text('-9.0 kW'), findsNothing,
reason: 'un client lirait « mes panneaux consomment 9 kW »');
});
testWidgets('le DÉTAIL production ne montre pas non plus un signe négatif',
(tester) async {
// La correction du 2026-09-05 n'avait redressé que la vue d'ensemble. Le hub du
// détail affichait toujours « -1.3 kW », vu sur appareil le lendemain : une même
// grandeur rendue à deux endroits, corrigée à un seul.
await _poser(tester, const EnergyData(pvPower: -1349.0, homePower: 3252));
await tester.tap(find.text('Solaire'));
await tester.pump(const Duration(seconds: 2));
// Deux nœuds portent la valeur pendant la transition (vue d'ensemble et hub du
// détail) : c'est l'ABSENCE du signe qui est éprouvée ici, pas le compte.
expect(find.text('1.3 kW'), findsWidgets);
expect(find.text('-1.3 kW'), findsNothing);
// Et surtout : plus d'onduleurs fabriqués.
expect(find.textContaining('Onduleur'), findsNothing);
expect(find.textContaining('non publié par cette box'), findsOneWidget);
});
testWidgets('zéro reste zéro — et ne prouve rien', (tester) async {
// L'état du banc à 17:03, celui qui a rendu la correction invisible à l'écran.
await _poser(tester,
const EnergyData(pvPower: 0, homePower: 3250, gridPower: 3250));
expect(find.text('0.0 kW'), findsOneWidget);
});
}