diff --git a/lib/app/app.dart b/lib/app/app.dart index 8a0e82ae..2e6b16c2 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -1,7 +1,3 @@ -import 'dart:async'; - -import 'package:querya_desktop/core/actions/querya_command_registry.dart'; -import 'package:querya_desktop/core/extensions/local_extension_registry.dart'; import 'package:querya_desktop/core/layout/ui_scale.dart'; import 'package:querya_desktop/core/layout/ui_scale_controller.dart'; import 'package:querya_desktop/core/motion/querya_motion_controller.dart'; @@ -12,7 +8,6 @@ import 'package:querya_desktop/core/theme/theme_controller.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'app_lifecycle_cleanup.dart'; -import 'app_wiring.dart'; import '../features/main_screen/main_screen.dart'; class QueryaApp extends StatelessWidget { @@ -20,9 +15,6 @@ class QueryaApp extends StatelessWidget { @override Widget build(BuildContext context) { - installAppWiring(); - QueryaCommandRegistry.instance.ensureCoreDefaults(); - unawaited(LocalExtensionRegistry.instance.load()); final themeController = ThemeController.instance; final uiScaleController = UiScaleController.instance; final motionController = QueryaMotionController.instance; diff --git a/lib/main.dart b/lib/main.dart index 748a4212..c7f06b6e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,7 +6,9 @@ import 'package:flutter/material.dart'; import 'app/app.dart'; import 'app/app_wiring.dart'; +import 'core/actions/querya_command_registry.dart'; import 'core/editor/syntax_highlight_service.dart'; +import 'core/extensions/local_extension_registry.dart'; import 'core/layout/ui_scale_controller.dart'; import 'core/mcp/mcp_server_controller.dart'; import 'core/motion/display_refresh_service.dart'; @@ -38,6 +40,8 @@ void main([List args = const []]) async { await ThemeController.instance.load(); await UiScaleController.instance.load(); await QueryaMotionController.instance.load(); + QueryaCommandRegistry.instance.ensureCoreDefaults(); + unawaited(LocalExtensionRegistry.instance.load()); unawaited(UpdateController.instance.initialize()); unawaited(cleanupStaleMongoTlsTempFiles()); unawaited(McpServerController.instance.startIfEnabled()); diff --git a/test/app/querya_app_test.dart b/test/app/querya_app_test.dart new file mode 100644 index 00000000..94088e9a --- /dev/null +++ b/test/app/querya_app_test.dart @@ -0,0 +1,20 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:querya_desktop/app/app.dart'; +import 'package:querya_desktop/features/main_screen/querya_window_title_bar.dart'; + +void main() { + // Headless tests have no native bitsdojo symbols. + setUp(() => QueryaWindowTitleBar.useNativeWindowChrome = false); + tearDown(() => QueryaWindowTitleBar.useNativeWindowChrome = true); + + testWidgets('QueryaApp build is pure and does not crash or throw', (tester) async { + await tester.pumpWidget( + const QueryaApp(), + ); + // Rebuilding the root widget is idempotent and doesn't trigger side effects + await tester.pumpWidget( + const QueryaApp(), + ); + expect(find.byType(QueryaApp), findsOneWidget); + }); +}