Skip to content

Commit 1116fef

Browse files
authored
Push notification re-implementation (#11214)
2 parents 8005225 + 3a65906 commit 1116fef

File tree

97 files changed

+6305
-807
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+6305
-807
lines changed

.gitignore

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
build
2-
coverage
32
Config
43
lerna-debug.log
54
node_modules
@@ -19,7 +18,23 @@ packages/**/cypress/videos/
1918
yarn.lock
2019
package-lock.json
2120
packages/*/.watchmanconfig
22-
coverage-ts/
2321
dual-publish-tmp
22+
23+
### Gradle ###
2424
.gradle/
2525
local.properties
26+
27+
### Xcode ###
28+
xcuserdata/
29+
*.xcodeproj/*
30+
!*.xcodeproj/project.pbxproj
31+
!*.xcodeproj/xcshareddata/
32+
!*.xcodeproj/project.xcworkspace/
33+
!*.xcworkspace/contents.xcworkspacedata
34+
/*.gcno
35+
**/xcshareddata/WorkspaceSettings.xcsettings
36+
37+
### Coverage ###
38+
coverage/
39+
coverage-native/
40+
coverage-ts/

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
"@types/lodash": "4.14.182",
7070
"@types/node": "^8.9.5",
7171
"@types/puppeteer": "1.3.0",
72+
"babel-jest": "^24.9.0",
7273
"babel-loader": "^8.3.0",
7374
"codecov": "^3.6.5",
7475
"compression-webpack-plugin": "^1.1.3",

packages/notifications/__mocks__/data.ts

+149-31
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3+
34
import {
45
Alignment,
56
ButtonAction,
67
DimensionType,
8+
Event,
79
FilterType,
810
InAppMessageCampaign as PinpointInAppMessage,
911
} from '@aws-sdk/client-pinpoint';
10-
import {
11-
InAppMessage,
12-
InAppMessagingEvent,
13-
UserInfo,
14-
} from '../src/InAppMessaging';
12+
import { InAppMessage, InAppMessagingEvent } from '../src/InAppMessaging';
13+
import { PushNotificationMessage } from '../src/PushNotification';
14+
import { UserInfo } from '../src';
1515
import { NotificationsConfig } from '../src';
1616

1717
export const credentials = {
@@ -27,12 +27,13 @@ export const awsPinpointConfig = {
2727
region: 'us-west-2',
2828
};
2929

30-
export const inAppMessagingConfig = {
30+
export const subcategoryConfig = {
3131
AWSPinpoint: awsPinpointConfig,
3232
};
3333

3434
export const notificationsConfig = {
35-
InAppMessaging: inAppMessagingConfig,
35+
InAppMessaging: subcategoryConfig,
36+
Push: subcategoryConfig,
3637
};
3738

3839
export const adhocConfig: NotificationsConfig = {
@@ -52,9 +53,34 @@ export const awsConfig = {
5253
Notifications: notificationsConfig,
5354
};
5455

55-
export const simpleEvent: InAppMessagingEvent = { name: 'foo' };
56+
export const imageUrl = 'http://image.fakeurl/avocado.png';
57+
58+
export const userId = 'user-id';
59+
60+
export const userInfo: UserInfo = {
61+
attributes: {
62+
hobbies: ['shuffleboard', 'jousting'],
63+
},
64+
};
5665

57-
export const simpleMessages = [{ id: 'foo' }, { id: 'bar' }];
66+
export const analyticsEvent: Event = {
67+
EventType: 'analytics-event',
68+
Timestamp: '2023-03-08T18:13:03.627Z',
69+
};
70+
71+
/**
72+
* In-App Messaging data
73+
*/
74+
export const inAppMessagingConfig = {
75+
endpointInfo: { channelType: 'IN_APP' },
76+
};
77+
78+
export const simpleInAppMessagingEvent: InAppMessagingEvent = { name: 'foo' };
79+
80+
export const simpleInAppMessages: Partial<InAppMessage>[] = [
81+
{ id: 'foo' },
82+
{ id: 'bar' },
83+
];
5884

5985
export const closestExpiryMessage: InAppMessage = {
6086
id: 'closest-expiry',
@@ -122,13 +148,13 @@ export const pinpointInAppMessage: PinpointInAppMessage = {
122148
Header: 'Header content',
123149
TextColor: '#88FF88',
124150
},
125-
ImageUrl: 'http://image.url',
151+
ImageUrl: imageUrl,
126152
PrimaryBtn: {
127153
DefaultConfig: {
128154
BackgroundColor: '#8888FF',
129155
BorderRadius: 4,
130156
ButtonAction: ButtonAction.CLOSE,
131-
Link: null,
157+
Link: undefined,
132158
Text: 'Close button',
133159
TextColor: '#FF88FF',
134160
},
@@ -138,7 +164,7 @@ export const pinpointInAppMessage: PinpointInAppMessage = {
138164
BackgroundColor: '#88FFFF',
139165
BorderRadius: 4,
140166
ButtonAction: ButtonAction.LINK,
141-
Link: 'http://link.url',
167+
Link: 'http://link.fakeurl',
142168
Text: 'Link button',
143169
TextColor: '#FFFFFF',
144170
},
@@ -163,8 +189,8 @@ export const pinpointInAppMessage: PinpointInAppMessage = {
163189
},
164190
},
165191
QuietTime: {
166-
End: null,
167-
Start: null,
192+
End: undefined,
193+
Start: undefined,
168194
},
169195
},
170196
SessionCap: 0,
@@ -184,18 +210,18 @@ export const extractedContent = [
184210
content: 'Header content',
185211
style: { color: '#88FF88', textAlign: 'center' },
186212
},
187-
image: { src: 'http://image.url' },
213+
image: { src: imageUrl },
188214
primaryButton: {
189215
action: 'CLOSE',
190216
style: { backgroundColor: '#8888FF', borderRadius: 4, color: '#FF88FF' },
191217
title: 'Close button',
192-
url: null,
218+
url: undefined,
193219
},
194220
secondaryButton: {
195221
action: 'LINK',
196222
style: { backgroundColor: '#88FFFF', borderRadius: 4, color: '#FFFFFF' },
197223
title: 'Link button',
198-
url: 'http://link.url',
224+
url: 'http://link.fakeurl',
199225
},
200226
},
201227
];
@@ -207,22 +233,114 @@ export const extractedMetadata = {
207233
treatmentId: 'T1',
208234
};
209235

210-
export const userId = 'user-id';
236+
/**
237+
* Push Notification data
238+
*/
239+
export const pushNotificationApnsConfig = {
240+
endpointInfo: { channelType: 'APNS' },
241+
};
211242

212-
export const userInfo: UserInfo = {
213-
attributes: {
214-
hobbies: ['shuffleboard', 'jousting'],
243+
export const pushNotificationFcmConfig = {
244+
endpointInfo: { channelType: 'GCM' },
245+
};
246+
247+
export const pushModuleConstants = {
248+
NativeEvent: {
249+
BACKGROUND_MESSAGE_RECEIVED: 'BackgroundMessageReceived',
250+
FOREGROUND_MESSAGE_RECEIVED: 'ForegroundMessageReceived',
251+
LAUNCH_NOTIFICATION_OPENED: 'LaunchNotificationOpened',
252+
NOTIFICATION_OPENED: 'NotificationOpened',
253+
TOKEN_RECEIVED: 'TokenReceived',
215254
},
255+
NativeHeadlessTaskKey: 'PushNotificationHeadlessTaskKey',
216256
};
217257

218-
export const pinpointEndpointPayload = {
219-
ApplicationId: awsPinpointConfig.appId,
220-
EndpointRequest: expect.objectContaining({
221-
Attributes: userInfo.attributes,
222-
ChannelType: 'IN_APP',
223-
User: {
224-
UserAttributes: userInfo.attributes,
225-
UserId: userId,
226-
},
227-
}),
258+
export const simplePushMessage: PushNotificationMessage = {
259+
title: 'foo',
260+
body: 'bar',
261+
};
262+
263+
export const pushToken = 'foo-bar';
264+
export const pushNotificationUrl = 'http://goto.fakeurl';
265+
export const pushNotificationDeeplinkUrl = 'deeplink://url';
266+
export const pushNotificationAdhocData = { foo: 'bar' };
267+
export const pinpointCampaign = {
268+
campaign_id: 'campaign-id',
269+
campaign_activity_id: 'campaign-activity-id',
270+
treatment_id: 'treatment-id',
271+
};
272+
export const pinpointJourney = {
273+
journey_activity_id: 'journey-activity-id',
274+
journey_run_id: 'journey-run-id',
275+
journey_id: 'journey-id',
276+
};
277+
278+
export const apnsMessagePayload = {
279+
alert: {
280+
title: 'apns-title',
281+
subtitle: 'apns-subtitle',
282+
body: 'apns-body',
283+
},
284+
};
285+
286+
export const apnsMessage = {
287+
aps: apnsMessagePayload,
288+
data: {
289+
'media-url': imageUrl,
290+
...pushNotificationAdhocData,
291+
},
292+
};
293+
294+
export const fcmMessageOptions = {
295+
channelId: 'channel-id',
296+
messageId: 'message-id',
297+
senderId: 'sender-id',
298+
sendTime: 1678840781599,
299+
};
300+
301+
export const fcmMessagePayload = {
302+
title: 'fcm-title',
303+
body: 'fcm-body',
304+
imageUrl: imageUrl,
305+
action: {},
306+
rawData: pushNotificationAdhocData,
307+
};
308+
309+
export const fcmMessage = {
310+
...fcmMessagePayload,
311+
...fcmMessageOptions,
312+
};
313+
314+
export const ANDROID_CAMPAIGN_ACTIVITY_ID_KEY =
315+
'pinpoint.campaign.campaign_activity_id';
316+
export const ANDROID_CAMPAIGN_ID_KEY = 'pinpoint.campaign.campaign_id';
317+
export const ANDROID_CAMPAIGN_TREATMENT_ID_KEY =
318+
'pinpoint.campaign.treatment_id';
319+
320+
export const androidCampaignData = {
321+
title: simplePushMessage.title,
322+
body: simplePushMessage.body,
323+
[ANDROID_CAMPAIGN_ACTIVITY_ID_KEY]: pinpointCampaign.campaign_activity_id,
324+
[ANDROID_CAMPAIGN_ID_KEY]: pinpointCampaign.campaign_id,
325+
[ANDROID_CAMPAIGN_TREATMENT_ID_KEY]: pinpointCampaign.treatment_id,
326+
};
327+
328+
export const androidJourneyData = {
329+
title: simplePushMessage.title,
330+
body: simplePushMessage.body,
331+
pinpoint: {
332+
journey: pinpointJourney,
333+
},
334+
};
335+
336+
export const iosCampaignData = {
337+
pinpoint: {
338+
campaign: pinpointCampaign,
339+
},
340+
};
341+
342+
export const iosJourneyData = {
343+
pinpoint: {
344+
journey: pinpointJourney,
345+
},
228346
};

packages/notifications/__mocks__/mocks.ts

+14
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,23 @@ export const mockInAppMessagingProvider = {
1414
processInAppMessages: jest.fn(),
1515
};
1616

17+
export const mockPushNotificationProvider = {
18+
configure: jest.fn(),
19+
getCategory: jest.fn(),
20+
getProviderName: jest.fn(),
21+
getSubCategory: jest.fn(),
22+
identifyUser: jest.fn(),
23+
registerDevice: jest.fn(),
24+
};
25+
1726
export const mockStorage = {
1827
getItem: jest.fn(),
1928
removeItem: jest.fn(),
2029
setItem: jest.fn(),
2130
sync: jest.fn(),
2231
};
32+
33+
export const mockLogger = {
34+
debug: jest.fn(),
35+
error: jest.fn(),
36+
};

0 commit comments

Comments
 (0)