From 0f085b4e25adec97283d857ae697c20f528482e5 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Mon, 29 Jun 2026 15:56:11 +0530 Subject: [PATCH 1/4] test(app): sync env_test EnvFields fake to current interface (posthog, drop mixpanel/growthbook) --- app/test/unit/env_test.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/test/unit/env_test.dart b/app/test/unit/env_test.dart index 875c19e6d39..d2f180c5af6 100644 --- a/app/test/unit/env_test.dart +++ b/app/test/unit/env_test.dart @@ -11,12 +11,10 @@ class _TestEnvFields implements EnvFields { @override String? get openAIAPIKey => null; @override - String? get mixpanelProjectToken => null; + String? get posthogApiKey => null; @override String? get apiBaseUrl => 'https://api.prod.example.com/'; @override - String? get growthbookApiKey => null; - @override String? get googleMapsApiKey => null; @override String? get intercomAppId => null; From ea0615932d7761107e51e3a7c47ef1d6da49b881 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Mon, 29 Jun 2026 15:56:11 +0530 Subject: [PATCH 2/4] test(app): sync env_staging_test EnvFields fake to current interface --- app/test/unit/env_staging_test.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/test/unit/env_staging_test.dart b/app/test/unit/env_staging_test.dart index 68b7effddde..7950eb3533e 100644 --- a/app/test/unit/env_staging_test.dart +++ b/app/test/unit/env_staging_test.dart @@ -10,12 +10,10 @@ class _StagingEnvFields implements EnvFields { @override String? get openAIAPIKey => null; @override - String? get mixpanelProjectToken => null; + String? get posthogApiKey => null; @override String? get apiBaseUrl => 'https://api.prod.example.com/'; @override - String? get growthbookApiKey => null; - @override String? get googleMapsApiKey => null; @override String? get intercomAppId => null; From 82c35cd284a242892cde49b90c2dd8583f9936d3 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Mon, 29 Jun 2026 15:56:12 +0530 Subject: [PATCH 3/4] test(app): sync env_empty_staging_test EnvFields fake to current interface --- app/test/unit/env_empty_staging_test.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/test/unit/env_empty_staging_test.dart b/app/test/unit/env_empty_staging_test.dart index 6d610c7bca3..50ff5dcb906 100644 --- a/app/test/unit/env_empty_staging_test.dart +++ b/app/test/unit/env_empty_staging_test.dart @@ -10,12 +10,10 @@ class _EmptyStagingEnvFields implements EnvFields { @override String? get openAIAPIKey => null; @override - String? get mixpanelProjectToken => null; + String? get posthogApiKey => null; @override String? get apiBaseUrl => 'https://api.prod.example.com/'; @override - String? get growthbookApiKey => null; - @override String? get googleMapsApiKey => null; @override String? get intercomAppId => null; From 08d998bd150ba16ce7b3ce1df46b3d1bd957d51f Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin Date: Mon, 29 Jun 2026 15:56:12 +0530 Subject: [PATCH 4/4] =?UTF-8?q?test(app):=20fix=20capture=5Fprovider=5Ftes?= =?UTF-8?q?t=20=E2=80=94=20drop=20removed=20DeviceType.frame,=20init=20Env?= =?UTF-8?q?,=20correct=20cleared-config=20assertions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace removed DeviceType.frame: drop 2 redundant no-route cases (covered by bee/fieldy/limitless/plaud), switch the unique 'gains route' case to fieldy. - Init Env in setUpAll so omi-route paths reading Env.apiBaseUrl don't throw LateInitializationError. - getString returns '' (non-nullable) for missing keys, so assert isEmpty not isNull on cleared nativeBleStreamConfig. These ran for the first time after the DeviceType.frame compile error was fixed. --- app/test/providers/capture_provider_test.dart | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/app/test/providers/capture_provider_test.dart b/app/test/providers/capture_provider_test.dart index 0d3dc1dd556..bf377494278 100644 --- a/app/test/providers/capture_provider_test.dart +++ b/app/test/providers/capture_provider_test.dart @@ -13,6 +13,7 @@ import 'package:omi/backend/schema/bt_device/bt_device.dart'; import 'package:omi/backend/schema/conversation.dart'; import 'package:omi/backend/schema/message_event.dart'; import 'package:omi/backend/schema/transcript_segment.dart'; +import 'package:omi/env/env.dart'; import 'package:omi/l10n/app_localizations.dart'; import 'package:omi/app_globals.dart'; import 'package:omi/providers/capture_provider.dart'; @@ -66,6 +67,35 @@ TranscriptSegment _segment(String id, String text) { BtDevice _device({required String id, required DeviceType type, String name = 'TestDevice'}) => BtDevice(id: id, name: name, type: type, rssi: -50); +/// Minimal EnvFields stub so Env-backed code paths (e.g. native BLE stream +/// config reading Env.apiBaseUrl) don't hit a LateInitializationError. +class _TestEnvFields implements EnvFields { + @override + String? get openAIAPIKey => null; + @override + String? get posthogApiKey => null; + @override + String? get apiBaseUrl => null; + @override + String? get googleMapsApiKey => null; + @override + String? get intercomAppId => null; + @override + String? get intercomIOSApiKey => null; + @override + String? get intercomAndroidApiKey => null; + @override + String? get googleClientId => null; + @override + String? get googleClientSecret => null; + @override + bool? get useWebAuth => false; + @override + bool? get useAuthCustomToken => false; + @override + String? get stagingApiUrl => null; +} + void main() { setUpAll(() async { TestWidgetsFlutterBinding.ensureInitialized(); @@ -79,6 +109,11 @@ void main() { }, ); ConnectivityPlatform.instance = _TestConnectivityPlatform(); + try { + Env.init(_TestEnvFields()); + } catch (_) { + // Env._instance is late final — ignore if already initialized in this isolate. + } try { await ServiceManager.init(); } catch (_) { @@ -638,13 +673,6 @@ void main() { provider.dispose(); }); - test('returns false for Frame', () { - final provider = CaptureProvider(); - provider.updateRecordingDevice(_device(id: 'AA:BB:CC:DD:EE:FF', type: DeviceType.frame)); - expect(provider.hasNativeBleAudioRoute, isFalse); - provider.dispose(); - }); - test('returns false for Limitless', () { final provider = CaptureProvider(); provider.updateRecordingDevice(_device(id: 'AA:BB:CC:DD:EE:FF', type: DeviceType.limitless)); @@ -685,7 +713,7 @@ void main() { expect(SharedPreferencesUtil().backgroundModeEnabled, isFalse); expect(SharedPreferencesUtil().getBool('nativeBleStreamingEnabled'), isFalse); expect(SharedPreferencesUtil().getBool('nativeBleForegroundReady'), isFalse); - expect(SharedPreferencesUtil().getString('nativeBleStreamConfig'), isNull); + expect(SharedPreferencesUtil().getString('nativeBleStreamConfig'), isEmpty); provider.dispose(); }); @@ -751,17 +779,6 @@ void main() { provider.dispose(); }); - test('enable rejects for device with no native route (Frame)', () async { - final provider = CaptureProvider(); - provider.updateRecordingDevice(_device(id: 'AA:BB:CC:DD:EE:FF', type: DeviceType.frame)); - - final result = await provider.setBackgroundModeEnabled(true); - - expect(result, isFalse); - expect(SharedPreferencesUtil().backgroundModeEnabled, isFalse); - provider.dispose(); - }); - test('enable rejects for device with no native route (Limitless)', () async { final provider = CaptureProvider(); provider.updateRecordingDevice(_device(id: 'AA:BB:CC:DD:EE:FF', type: DeviceType.limitless)); @@ -874,7 +891,7 @@ void main() { expect(SharedPreferencesUtil().backgroundModeEnabled, isFalse); expect(SharedPreferencesUtil().getBool('nativeBleStreamingEnabled'), isFalse); expect(SharedPreferencesUtil().getBool('nativeBleForegroundReady'), isFalse); - expect(SharedPreferencesUtil().getString('nativeBleStreamConfig'), isNull); + expect(SharedPreferencesUtil().getString('nativeBleStreamConfig'), isEmpty); provider.dispose(); }); @@ -917,7 +934,7 @@ void main() { test('switching from no-route device to Omi gains route', () { final provider = CaptureProvider(); - provider.updateRecordingDevice(_device(id: 'AA:BB:CC:DD:EE:FF', type: DeviceType.frame)); + provider.updateRecordingDevice(_device(id: 'AA:BB:CC:DD:EE:FF', type: DeviceType.fieldy)); expect(provider.hasNativeBleAudioRoute, isFalse); provider.updateRecordingDevice(_device(id: '11:22:33:44:55:66', type: DeviceType.omi));