Lot Connexions multi-HEMS : - modèle Installation + InstallationStore (persistance par UUID ; métadonnées SharedPreferences, token via flutter_secure_storage) - ConnectionManager au-dessus de nymea_service : mono-connexion, switchTo, connectNew, enterDemo (démo = active factice), contrôle d'identité DHCP - nymea_service : connect() réveillé (ws://4444, token par UUID), capture Hello (uuid/name/initialSetupRequired), authenticate/createUser, resetState - écran Installations (3 états) + déverrouillage installateur depuis la racine - écran Connexion : auth 2 branches (JSONRPC.Authenticate / CreateUser), détection auto via initialSetupRequired, segmenteur de repli - gate de routage (redirect + refreshListenable merge[cm,svc]) ; hasActiveConnection = isSimulation || (connected && authenticated) - en-tête drawer cliquable → Installations - invalidation des caches au switch (service.resetState + clearForSwitch rôles/scheduler/tariff), sans persist() Lot Rôles & appareils : - EnergySetupProvider refondu en tri-état (present/absent/non-configuré) - écran roles_devices_screen (3 zones, drag-priorité, inférence solaire/batterie) - LoadDescriptor (etmvariableload, rév.2 : PAC exclue → SG-Ready) ; Energy.SetRootMeter réel, Get/SetLoadConfig en stub loggé Correctifs : - bug signe énergie : production +, consommation NÉGATIVE sur nymea 1.15.2 → consumptionW/home en .abs() (autoconso n'est plus clouée à 0) - UUID Hello brace-wrapped normalisé Tests : flutter analyze 0 erreur ; gate + zéro-fuite au switch (5/5 verts). Validé en vrai : login auth .120, .75 ouvert, switch, déverrouillage installateur. Note : embarque aussi le WIP dashboard/thème déjà présent dans l'arbre. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
72 lines
2.7 KiB
Dart
72 lines
2.7 KiB
Dart
import 'package:etm_powersync_app/providers/energy_setup_provider.dart';
|
|
import 'package:etm_powersync_app/providers/scheduler_provider.dart';
|
|
import 'package:etm_powersync_app/providers/tariff_provider.dart';
|
|
import 'package:etm_powersync_app/services/connection_manager.dart';
|
|
import 'package:etm_powersync_app/services/installation_store.dart';
|
|
import 'package:etm_powersync_app/services/nymea_service.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
/// Régression « zéro fuite au switch » (Étape 8). Vérifie en machine ce que le
|
|
/// click-through Android valide à l'œil : aucune donnée d'une box ne survit à
|
|
/// une bascule.
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
setUp(() => SharedPreferences.setMockInitialValues({}));
|
|
|
|
test('NymeaService.resetState vide les caches par-box (things/history/energy)',
|
|
() {
|
|
final s = NymeaService();
|
|
s.startSimulation(); // peuple things + history + energyData
|
|
expect(s.things, isNotEmpty, reason: 'la démo doit peupler des things');
|
|
|
|
s.resetState();
|
|
|
|
expect(s.things, isEmpty);
|
|
expect(s.thingClasses, isEmpty);
|
|
expect(s.historyPoints, isEmpty);
|
|
expect(s.thingsLoaded, isFalse);
|
|
|
|
s.disconnect(); // stoppe le timer de simulation
|
|
});
|
|
|
|
test('EnergySetupProvider.clearForSwitch réinitialise le tri-état', () {
|
|
final p = EnergySetupProvider();
|
|
p.assignThing(EmsRole.evCharger, 'thing-ev-A');
|
|
p.assignThing(EmsRole.dhw, 'thing-ecs-A');
|
|
expect(p.isPresent(EmsRole.evCharger), isTrue);
|
|
expect(p.controllableRoles, isNotEmpty);
|
|
|
|
p.clearForSwitch();
|
|
|
|
expect(p.isUnconfigured(EmsRole.evCharger), isTrue);
|
|
expect(p.isUnconfigured(EmsRole.dhw), isTrue);
|
|
expect(p.controllableRoles, isEmpty);
|
|
expect(p.priorityOf(EmsRole.evCharger), isNull);
|
|
});
|
|
|
|
test('Scheduler & Tariff clearForSwitch reviennent aux défauts', () {
|
|
final sc = SchedulerProvider()..clearForSwitch();
|
|
expect(sc.loading, isFalse);
|
|
expect(sc.strategy, SchedulerStrategy.rulesBased);
|
|
|
|
final t = TariffProvider()..clearForSwitch();
|
|
expect(t.loading, isFalse);
|
|
expect(t.mode, TariffMode.fixed);
|
|
expect(t.manualPrice, 0.25);
|
|
});
|
|
|
|
test('ConnectionManager invoque tous les clearers enregistrés au switch', () {
|
|
final s = NymeaService();
|
|
final m = ConnectionManager(s, InstallationStore());
|
|
var cleared = 0;
|
|
m.registerCacheClear(() => cleared++);
|
|
m.registerCacheClear(() => cleared++);
|
|
|
|
m.enterDemo(); // _clearCaches() → resetState + clearers, puis startSimulation
|
|
|
|
expect(cleared, 2, reason: 'chaque provider enregistré doit être vidé');
|
|
s.disconnect(); // stoppe le timer de simulation
|
|
});
|
|
}
|