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>
34 lines
1.3 KiB
Dart
34 lines
1.3 KiB
Dart
import 'package:etm_powersync_app/main.dart';
|
|
import 'package:etm_powersync_app/providers/app_settings_provider.dart';
|
|
import 'package:etm_powersync_app/providers/installer_mode_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:provider/provider.dart';
|
|
|
|
void main() {
|
|
testWidgets('App smoke test — gate vers Installations sans connexion active',
|
|
(WidgetTester tester) async {
|
|
final service = NymeaService();
|
|
final manager = ConnectionManager(service, InstallationStore());
|
|
|
|
await tester.pumpWidget(
|
|
MultiProvider(
|
|
providers: [
|
|
ChangeNotifierProvider.value(value: service),
|
|
ChangeNotifierProvider.value(value: manager),
|
|
ChangeNotifierProvider(create: (_) => AppSettingsProvider()),
|
|
ChangeNotifierProvider(create: (_) => InstallerModeProvider()),
|
|
],
|
|
child: NymeaEnergyApp(router: buildAppRouter(manager, service)),
|
|
),
|
|
);
|
|
await tester.pump();
|
|
|
|
// Sans session active, le gate doit router vers Installations.
|
|
expect(find.byType(NymeaEnergyApp), findsOneWidget);
|
|
expect(find.text('Installations'), findsWidgets);
|
|
});
|
|
}
|