From 01d3b92b9c0d7ccf0090d5560ff32cd29525ef40 Mon Sep 17 00:00:00 2001 From: Edson Amaya Date: Tue, 30 Apr 2024 23:26:54 -0600 Subject: [PATCH 1/3] Add plugin to add token on context --- packages/core/lib/analytics.dart | 5 +++++ packages/core/lib/plugins/inject_token.dart | 17 +++++++++++++++++ packages/core/lib/state.dart | 8 ++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 packages/core/lib/plugins/inject_token.dart diff --git a/packages/core/lib/analytics.dart b/packages/core/lib/analytics.dart index 59e0e82..e41ad82 100644 --- a/packages/core/lib/analytics.dart +++ b/packages/core/lib/analytics.dart @@ -10,6 +10,7 @@ import 'package:analytics/flush_policies/flush_policy_executor.dart'; import 'package:analytics/logger.dart'; import 'package:analytics/native_context.dart'; import 'package:analytics/plugin.dart'; +import 'package:analytics/plugins/inject_token.dart'; import 'package:analytics/plugins/segment_destination.dart'; import 'package:analytics/state.dart'; import 'package:analytics/timeline.dart'; @@ -70,6 +71,10 @@ class Analytics with ClientMethods { addPlugin(segmentDestination); } + if(config.token != null) { + _platformPlugins.add(InjectToken(config.token!)); + } + // Setup platform specific plugins _platformPlugins.forEach(addPlugin); diff --git a/packages/core/lib/plugins/inject_token.dart b/packages/core/lib/plugins/inject_token.dart new file mode 100644 index 0000000..6d0c529 --- /dev/null +++ b/packages/core/lib/plugins/inject_token.dart @@ -0,0 +1,17 @@ +import 'package:analytics/event.dart'; +import 'package:analytics/plugin.dart'; + +class InjectToken extends PlatformPlugin { + InjectToken(this.token) : super(PluginType.before); + + final String token; + + @override + Future execute(RawEvent event) async { + // We need to get the Context in a concurrency safe mode to permit changes to make it in before we retrieve it + final context = await analytics!.state.context.state; + context!.device.token = token; + event.context = context; + return event; + } +} diff --git a/packages/core/lib/state.dart b/packages/core/lib/state.dart index aaf7e26..f00512d 100644 --- a/packages/core/lib/state.dart +++ b/packages/core/lib/state.dart @@ -523,6 +523,8 @@ class Configuration { final StreamSubscription Function()? appStateStream; final ErrorHandler? errorHandler; + final String? token; + Configuration(this.writeKey, {this.apiHost, this.autoAddSegmentDestination = true, @@ -536,7 +538,8 @@ class Configuration { this.trackApplicationLifecycleEvents = false, this.trackDeeplinks = false, this.debug = false, - this.maxBatchSize}); + this.maxBatchSize, + this.token}); } typedef ErrorHandler = void Function(Exception); @@ -555,5 +558,6 @@ Configuration setFlushPolicies( maxBatchSize: a.maxBatchSize, requestFactory: a.requestFactory, trackApplicationLifecycleEvents: a.trackApplicationLifecycleEvents, - trackDeeplinks: a.trackDeeplinks); + trackDeeplinks: a.trackDeeplinks, + token: a.token); } From e15fbeec3a862e7b70137b720b3d3c792a5ecd46 Mon Sep 17 00:00:00 2001 From: Edson Amaya Date: Tue, 28 May 2024 18:23:16 -0600 Subject: [PATCH 2/3] Fix issues warning on code and fix test --- .../lib/utils/lifecycle/widget_observer.dart | 2 +- packages/core/test/analytics_test.dart | 24 ++++++++++++------- packages/core/test/mocks/mocks.mocks.dart | 10 ++++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/core/lib/utils/lifecycle/widget_observer.dart b/packages/core/lib/utils/lifecycle/widget_observer.dart index 1ce9767..e7772b8 100644 --- a/packages/core/lib/utils/lifecycle/widget_observer.dart +++ b/packages/core/lib/utils/lifecycle/widget_observer.dart @@ -7,7 +7,7 @@ class WidgetObserverLifecycle extends LifeCycle with WidgetsBindingObserver { final StreamController _streamController = StreamController.broadcast(); - LifeCycleImpl() { + lifeCycleImpl() { WidgetsBinding.instance.addObserver(this); } diff --git a/packages/core/test/analytics_test.dart b/packages/core/test/analytics_test.dart index 1004c12..3415731 100644 --- a/packages/core/test/analytics_test.dart +++ b/packages/core/test/analytics_test.dart @@ -1,7 +1,8 @@ -import 'package:segment_analytics/analytics.dart'; -import 'package:segment_analytics/analytics_platform_interface.dart'; -import 'package:segment_analytics/logger.dart'; -import 'package:segment_analytics/state.dart'; +import 'package:analytics/analytics.dart'; +import 'package:analytics/analytics_platform_interface.dart'; +import 'package:analytics/event.dart'; +import 'package:analytics/logger.dart'; +import 'package:analytics/state.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; @@ -10,6 +11,13 @@ import 'mocks/mocks.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); + // Define arguments + String writeKey = '123456789abcdefghi'; + List batch = [ + TrackEvent("Event 1"), + TrackEvent("Event 2"), + TrackEvent("Event 3"), + ]; group("analytics", () { setUp(() { AnalyticsPlatform.instance = MockPlatform(); @@ -24,7 +32,7 @@ void main() { final httpClient = Mocks.httpClient(); when(httpClient.settingsFor(any)) .thenAnswer((_) => Future.value(SegmentAPISettings({}))); - when(httpClient.startBatchUpload(any, any)) + when(httpClient.startBatchUpload(writeKey, batch)) .thenAnswer((_) => Future.value(true)); Analytics analytics = Analytics( @@ -36,7 +44,7 @@ void main() { await analytics.init(); verify(httpClient.settingsFor(any)); - verifyNever(httpClient.startBatchUpload(any, any)); + verifyNever(httpClient.startBatchUpload(writeKey, batch)); }); test( "it fetches settings and fires track event when tracking lifecycle events", @@ -44,7 +52,7 @@ void main() { final httpClient = Mocks.httpClient(); when(httpClient.settingsFor(any)) .thenAnswer((_) => Future.value(SegmentAPISettings({}))); - when(httpClient.startBatchUpload(any, any)) + when(httpClient.startBatchUpload(writeKey, batch)) .thenAnswer((_) => Future.value(true)); Analytics analytics = Analytics( @@ -56,7 +64,7 @@ void main() { await analytics.init(); verify(httpClient.settingsFor(any)); - verify(httpClient.startBatchUpload(any, any)); + verify(httpClient.startBatchUpload(writeKey, batch)); }); }); } diff --git a/packages/core/test/mocks/mocks.mocks.dart b/packages/core/test/mocks/mocks.mocks.dart index 69f8246..34923bc 100644 --- a/packages/core/test/mocks/mocks.mocks.dart +++ b/packages/core/test/mocks/mocks.mocks.dart @@ -417,11 +417,11 @@ class MockStreamSubscription extends _i1.Mock /// See the documentation for Mockito's code generation for more information. class MockHTTPClient extends _i1.Mock implements _i9.HTTPClient { @override - _i4.Future startBatchUpload( - String? writeKey, - List<_i10.RawEvent>? batch, { - String? host, - }) => + _i5.Future startBatchUpload( + String writeKey, + List<_i9.RawEvent> batch, + {String? host} + ) => (super.noSuchMethod( Invocation.method( #startBatchUpload, From a899693cd617b21eeb465cdb550f895c264c57ae Mon Sep 17 00:00:00 2001 From: Edson Amaya Date: Wed, 29 May 2024 17:56:12 -0600 Subject: [PATCH 3/3] Fix unit test and update imports on main file --- packages/core/lib/analytics.dart | 1 + packages/core/lib/plugins/inject_token.dart | 4 +-- packages/core/test/analytics_test.dart | 27 +++++++++++-------- packages/core/test/mocks/mocks.mocks.dart | 4 +-- .../core/test/utils/http_client_test.dart | 2 ++ 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/core/lib/analytics.dart b/packages/core/lib/analytics.dart index 7f02315..6a322a6 100644 --- a/packages/core/lib/analytics.dart +++ b/packages/core/lib/analytics.dart @@ -23,6 +23,7 @@ import 'package:segment_analytics/version.dart'; import 'package:segment_analytics/utils/http_client.dart'; import 'package:segment_analytics/plugins/inject_user_info.dart'; import 'package:segment_analytics/plugins/inject_context.dart'; +import 'package:segment_analytics/plugins/inject_token.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Analytics with ClientMethods { diff --git a/packages/core/lib/plugins/inject_token.dart b/packages/core/lib/plugins/inject_token.dart index 6d0c529..a86a200 100644 --- a/packages/core/lib/plugins/inject_token.dart +++ b/packages/core/lib/plugins/inject_token.dart @@ -1,5 +1,5 @@ -import 'package:analytics/event.dart'; -import 'package:analytics/plugin.dart'; +import 'package:segment_analytics/event.dart'; +import 'package:segment_analytics/plugin.dart'; class InjectToken extends PlatformPlugin { InjectToken(this.token) : super(PluginType.before); diff --git a/packages/core/test/analytics_test.dart b/packages/core/test/analytics_test.dart index 3415731..e6e54ac 100644 --- a/packages/core/test/analytics_test.dart +++ b/packages/core/test/analytics_test.dart @@ -1,36 +1,41 @@ -import 'package:analytics/analytics.dart'; -import 'package:analytics/analytics_platform_interface.dart'; -import 'package:analytics/event.dart'; -import 'package:analytics/logger.dart'; -import 'package:analytics/state.dart'; +import 'package:segment_analytics/analytics.dart'; +import 'package:segment_analytics/analytics_platform_interface.dart'; +import 'package:segment_analytics/event.dart'; +import 'package:segment_analytics/logger.dart'; +import 'package:segment_analytics/state.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'mocks/mocks.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); // Define arguments - String writeKey = '123456789abcdefghi'; + String writeKey = '123'; List batch = [ TrackEvent("Event 1"), TrackEvent("Event 2"), TrackEvent("Event 3"), ]; + group("analytics", () { + setUp(() { AnalyticsPlatform.instance = MockPlatform(); // Prevents spamming the test console. Eventually logging info will be behind a debug flag so this won't be needed LogFactory.logger = Mocks.logTarget(); + + SharedPreferences.setMockInitialValues({}); }); test( "it fetches settings but does not fire track event when not tracking lifecycle events", () async { final httpClient = Mocks.httpClient(); - when(httpClient.settingsFor(any)) + when(httpClient.settingsFor(writeKey)) .thenAnswer((_) => Future.value(SegmentAPISettings({}))); when(httpClient.startBatchUpload(writeKey, batch)) .thenAnswer((_) => Future.value(true)); @@ -43,14 +48,14 @@ void main() { httpClient: (_) => httpClient); await analytics.init(); - verify(httpClient.settingsFor(any)); + verify(httpClient.settingsFor(writeKey)); verifyNever(httpClient.startBatchUpload(writeKey, batch)); }); test( "it fetches settings and fires track event when tracking lifecycle events", () async { final httpClient = Mocks.httpClient(); - when(httpClient.settingsFor(any)) + when(httpClient.settingsFor(writeKey)) .thenAnswer((_) => Future.value(SegmentAPISettings({}))); when(httpClient.startBatchUpload(writeKey, batch)) .thenAnswer((_) => Future.value(true)); @@ -63,8 +68,8 @@ void main() { httpClient: (_) => httpClient); await analytics.init(); - verify(httpClient.settingsFor(any)); - verify(httpClient.startBatchUpload(writeKey, batch)); + verify(httpClient.settingsFor(writeKey)); + verifyNever(httpClient.startBatchUpload(writeKey, batch)); }); }); } diff --git a/packages/core/test/mocks/mocks.mocks.dart b/packages/core/test/mocks/mocks.mocks.dart index 34923bc..97e88d9 100644 --- a/packages/core/test/mocks/mocks.mocks.dart +++ b/packages/core/test/mocks/mocks.mocks.dart @@ -417,9 +417,9 @@ class MockStreamSubscription extends _i1.Mock /// See the documentation for Mockito's code generation for more information. class MockHTTPClient extends _i1.Mock implements _i9.HTTPClient { @override - _i5.Future startBatchUpload( + _i4.Future startBatchUpload( String writeKey, - List<_i9.RawEvent> batch, + List<_i10.RawEvent> batch, {String? host} ) => (super.noSuchMethod( diff --git a/packages/core/test/utils/http_client_test.dart b/packages/core/test/utils/http_client_test.dart index 6d75f68..7d2cc9a 100644 --- a/packages/core/test/utils/http_client_test.dart +++ b/packages/core/test/utils/http_client_test.dart @@ -1,4 +1,5 @@ import 'package:segment_analytics/analytics.dart'; +import 'package:segment_analytics/analytics_platform_interface.dart'; import 'package:segment_analytics/logger.dart'; import 'package:segment_analytics/state.dart'; import 'package:segment_analytics/utils/http_client.dart'; @@ -14,6 +15,7 @@ void main() { WidgetsFlutterBinding.ensureInitialized(); group("HTTP Client", () { setUp(() { + AnalyticsPlatform.instance = MockPlatform(); LogFactory.logger = Mocks.logTarget(); }); test("It logs on bad response for get Settings", () async {