Skip to content

Commit c35f4bb

Browse files
authored
chore(analytics): mockable httpClient (#2875)
1 parent 44ccb5e commit c35f4bb

File tree

4 files changed

+122
-59
lines changed

4 files changed

+122
-59
lines changed

packages/analytics/amplify_analytics_pinpoint_dart/lib/src/impl/analytics_client/analytics_client.dart

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/endpoint_client/endpoint_client.dart';
55
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/endpoint_client/endpoint_info_store_manager.dart';
66
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/event_client.dart';
7-
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/queued_item_store/dart_queued_item_store.dart';
87
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/queued_item_store/queued_item_store.dart';
98
import 'package:amplify_analytics_pinpoint_dart/src/impl/flutter_provider_interfaces/device_context_info_provider.dart';
109
import 'package:amplify_analytics_pinpoint_dart/src/impl/flutter_provider_interfaces/legacy_native_data_provider.dart';
11-
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/pinpoint_client.dart';
10+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/sdk_bridge.dart';
1211
import 'package:amplify_core/amplify_core.dart';
1312
import 'package:amplify_secure_storage_dart/amplify_secure_storage_dart.dart';
14-
import 'package:meta/meta.dart';
1513

1614
/// {@template amplify_analytics_pinpoint_dart.analytics_client}
1715
/// A builder class that constructs and exposes the [eventClient] and [endpointClient] for interacting with Pinpoint.
@@ -41,13 +39,19 @@ class AnalyticsClient {
4139
final DeviceContextInfoProvider? _deviceContextInfoProvider;
4240
final EndpointInfoStoreManager _endpointInfoStoreManager;
4341

44-
/// Allows mocking of [PinpointClient] for unit tests
45-
@visibleForTesting
46-
Future<void> initWithClient({
42+
/// Async initialize the [eventClient] and [endpointClient].
43+
/// Requires missing values typically provided in plugin configure.
44+
Future<void> init({
4745
required String pinpointAppId,
48-
required PinpointClient pinpointClient,
46+
required String region,
47+
required AWSCredentialsProvider authProvider,
4948
QueuedItemStore? eventStore,
5049
}) async {
50+
final pinpointClient = WrappedPinpointClient(
51+
region: region,
52+
credentialsProvider: authProvider,
53+
);
54+
5155
final deviceContextInfo =
5256
await _deviceContextInfoProvider?.getDeviceInfoDetails();
5357

@@ -69,25 +73,6 @@ class AnalyticsClient {
6973
);
7074
}
7175

72-
/// Async initialize the [eventClient] and [endpointClient].
73-
/// Requires missing values typically provided in plugin configure.
74-
Future<void> init({
75-
required String pinpointAppId,
76-
required String region,
77-
required AWSCredentialsProvider authProvider,
78-
DartQueuedItemStore? eventStore,
79-
}) async {
80-
final pinpointClient = PinpointClient(
81-
region: region,
82-
credentialsProvider: authProvider,
83-
);
84-
await initWithClient(
85-
pinpointAppId: pinpointAppId,
86-
pinpointClient: pinpointClient,
87-
eventStore: eventStore,
88-
);
89-
}
90-
9176
/// Client for interacting with Pinpoint Endpoint
9277
late final EndpointClient endpointClient;
9378

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/get_endpoint_request.dart';
5+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/get_endpoint_response.dart';
6+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/get_in_app_messages_request.dart';
7+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/get_in_app_messages_response.dart';
8+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/put_events_request.dart';
9+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/put_events_response.dart';
10+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/update_endpoint_request.dart';
11+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/update_endpoint_response.dart';
12+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/update_endpoints_batch_request.dart';
13+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/model/update_endpoints_batch_response.dart';
14+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/pinpoint_client.dart';
15+
import 'package:amplify_core/amplify_core.dart';
16+
import 'package:smithy/smithy.dart';
17+
18+
/// {@template amplify_analytics_pinpoint.sdk.wrapped_pinpoint_client}
19+
/// A wrapped [PinpointClient] which allows mockable HttpClient
20+
/// {@endtemplate}
21+
class WrappedPinpointClient implements PinpointClient {
22+
/// {@macro amplify_auth_cognito_dart.sdk.wrapped_cognito_identity_provider_client}
23+
WrappedPinpointClient({
24+
required String region,
25+
Uri? baseUri,
26+
required AWSCredentialsProvider credentialsProvider,
27+
}) : _base = PinpointClient(
28+
region: region,
29+
baseUri: baseUri,
30+
credentialsProvider: credentialsProvider,
31+
);
32+
33+
final PinpointClient _base;
34+
35+
// ignore: invalid_use_of_protected_member, invalid_use_of_visible_for_testing_member
36+
final DependencyManager _dependencyManager = Amplify.dependencies;
37+
38+
@override
39+
SmithyOperation<GetEndpointResponse> getEndpoint(
40+
GetEndpointRequest input, {
41+
AWSHttpClient? client,
42+
AWSCredentialsProvider? credentialsProvider,
43+
}) {
44+
return _base.getEndpoint(
45+
input,
46+
client: client ?? _dependencyManager.getOrCreate<AmplifyHttpClient>(),
47+
credentialsProvider: credentialsProvider,
48+
);
49+
}
50+
51+
@override
52+
SmithyOperation<GetInAppMessagesResponse> getInAppMessages(
53+
GetInAppMessagesRequest input, {
54+
AWSHttpClient? client,
55+
AWSCredentialsProvider? credentialsProvider,
56+
}) {
57+
return _base.getInAppMessages(
58+
input,
59+
client: client ?? _dependencyManager.getOrCreate<AmplifyHttpClient>(),
60+
credentialsProvider: credentialsProvider,
61+
);
62+
}
63+
64+
@override
65+
SmithyOperation<PutEventsResponse> putEvents(
66+
PutEventsRequest input, {
67+
AWSHttpClient? client,
68+
AWSCredentialsProvider? credentialsProvider,
69+
}) {
70+
return _base.putEvents(
71+
input,
72+
client: client ?? _dependencyManager.getOrCreate<AmplifyHttpClient>(),
73+
credentialsProvider: credentialsProvider,
74+
);
75+
}
76+
77+
@override
78+
SmithyOperation<UpdateEndpointResponse> updateEndpoint(
79+
UpdateEndpointRequest input, {
80+
AWSHttpClient? client,
81+
AWSCredentialsProvider? credentialsProvider,
82+
}) {
83+
return _base.updateEndpoint(
84+
input,
85+
client: client ?? _dependencyManager.getOrCreate<AmplifyHttpClient>(),
86+
credentialsProvider: credentialsProvider,
87+
);
88+
}
89+
90+
@override
91+
SmithyOperation<UpdateEndpointsBatchResponse> updateEndpointsBatch(
92+
UpdateEndpointsBatchRequest input, {
93+
AWSHttpClient? client,
94+
AWSCredentialsProvider? credentialsProvider,
95+
}) {
96+
return _base.updateEndpointsBatch(
97+
input,
98+
client: client ?? _dependencyManager.getOrCreate<AmplifyHttpClient>(),
99+
credentialsProvider: credentialsProvider,
100+
);
101+
}
102+
}

packages/analytics/amplify_analytics_pinpoint_dart/test/analytics_client_test.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'common/mocktail_mocks.dart';
1414
void main() {
1515
group('Multiple AnalyticsClients ', () {
1616
const analyticsPinpointAppId = 'analyticsPinpointAppId';
17+
const analyticsRegion = 'region';
1718
const notificationsPinpointAppId = 'notificationsPinpointAppId';
1819

1920
late final MockSecureStorage store;
@@ -27,27 +28,25 @@ void main() {
2728
setUpAll(() async {
2829
store = MockSecureStorage();
2930

30-
final analyticsPinpointClient = MockPinpointClient();
3131
analyticsEventStore = InMemoryQueuedItemStore();
32-
3332
analyticsClient = AnalyticsClient(
3433
endpointStorage: store,
3534
);
36-
await analyticsClient.initWithClient(
35+
await analyticsClient.init(
3736
pinpointAppId: analyticsPinpointAppId,
38-
pinpointClient: analyticsPinpointClient,
37+
region: analyticsRegion,
38+
authProvider: MockIamAuthProvider(),
3939
eventStore: analyticsEventStore,
4040
);
4141

42-
final notificationsPinpointClient = MockPinpointClient();
4342
notificationsEventStore = InMemoryQueuedItemStore();
44-
4543
notificationsClient = AnalyticsClient(
4644
endpointStorage: store,
4745
);
48-
await notificationsClient.initWithClient(
46+
await notificationsClient.init(
4947
pinpointAppId: notificationsPinpointAppId,
50-
pinpointClient: notificationsPinpointClient,
48+
region: analyticsRegion,
49+
authProvider: MockIamAuthProvider(),
5150
eventStore: notificationsEventStore,
5251
);
5352
});

packages/notifications/push/amplify_push_notifications_pinpoint/test/pinpoint_provider_test.mocks.dart

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,9 @@ import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/endpoi
1111
as _i4;
1212
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/event_client.dart'
1313
as _i5;
14-
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/queued_item_store/dart_queued_item_store.dart'
15-
as _i11;
1614
import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/queued_item_store/queued_item_store.dart'
17-
as _i10;
18-
import 'package:amplify_analytics_pinpoint_dart/src/sdk/pinpoint.dart' as _i6;
19-
import 'package:amplify_analytics_pinpoint_dart/src/sdk/src/pinpoint/pinpoint_client.dart'
2015
as _i9;
16+
import 'package:amplify_analytics_pinpoint_dart/src/sdk/pinpoint.dart' as _i6;
2117
import 'package:amplify_core/amplify_core.dart' as _i3;
2218
import 'package:aws_signature_v4/aws_signature_v4.dart' as _i2;
2319
import 'package:mockito/mockito.dart' as _i1;
@@ -216,30 +212,11 @@ class MockAnalyticsClient extends _i1.Mock implements _i8.AnalyticsClient {
216212
returnValueForMissingStub: null,
217213
);
218214
@override
219-
_i7.Future<void> initWithClient({
220-
required String? pinpointAppId,
221-
required _i9.PinpointClient? pinpointClient,
222-
_i10.QueuedItemStore? eventStore,
223-
}) =>
224-
(super.noSuchMethod(
225-
Invocation.method(
226-
#initWithClient,
227-
[],
228-
{
229-
#pinpointAppId: pinpointAppId,
230-
#pinpointClient: pinpointClient,
231-
#eventStore: eventStore,
232-
},
233-
),
234-
returnValue: _i7.Future<void>.value(),
235-
returnValueForMissingStub: _i7.Future<void>.value(),
236-
) as _i7.Future<void>);
237-
@override
238215
_i7.Future<void> init({
239216
required String? pinpointAppId,
240217
required String? region,
241218
required _i3.AWSCredentialsProvider? authProvider,
242-
_i11.DartQueuedItemStore? eventStore,
219+
_i9.QueuedItemStore? eventStore,
243220
}) =>
244221
(super.noSuchMethod(
245222
Invocation.method(

0 commit comments

Comments
 (0)