Skip to content

Commit 5145964

Browse files
committed
Merge pull request #405 from gdeglin/master
Adding OneSignal Push Adapter
2 parents 635c1a1 + 2ff6eff commit 5145964

File tree

4 files changed

+464
-25
lines changed

4 files changed

+464
-25
lines changed

spec/OneSignalPushAdapter.spec.js

Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
2+
var OneSignalPushAdapter = require('../src/Adapters/Push/OneSignalPushAdapter');
3+
4+
describe('OneSignalPushAdapter', () => {
5+
it('can be initialized', (done) => {
6+
// Make mock config
7+
var pushConfig = {
8+
oneSignalAppId:"APP ID",
9+
oneSignalApiKey:"API KEY"
10+
};
11+
12+
var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig);
13+
14+
var senderMap = oneSignalPushAdapter.senderMap;
15+
16+
expect(senderMap.ios instanceof Function).toBe(true);
17+
expect(senderMap.android instanceof Function).toBe(true);
18+
done();
19+
});
20+
21+
it('can get valid push types', (done) => {
22+
var oneSignalPushAdapter = new OneSignalPushAdapter();
23+
24+
expect(oneSignalPushAdapter.getValidPushTypes()).toEqual(['ios', 'android']);
25+
done();
26+
});
27+
28+
it('can classify installation', (done) => {
29+
// Mock installations
30+
var validPushTypes = ['ios', 'android'];
31+
var installations = [
32+
{
33+
deviceType: 'android',
34+
deviceToken: 'androidToken'
35+
},
36+
{
37+
deviceType: 'ios',
38+
deviceToken: 'iosToken'
39+
},
40+
{
41+
deviceType: 'win',
42+
deviceToken: 'winToken'
43+
},
44+
{
45+
deviceType: 'android',
46+
deviceToken: undefined
47+
}
48+
];
49+
50+
var deviceMap = OneSignalPushAdapter.classifyInstallation(installations, validPushTypes);
51+
expect(deviceMap['android']).toEqual([makeDevice('androidToken')]);
52+
expect(deviceMap['ios']).toEqual([makeDevice('iosToken')]);
53+
expect(deviceMap['win']).toBe(undefined);
54+
done();
55+
});
56+
57+
58+
it('can send push notifications', (done) => {
59+
var oneSignalPushAdapter = new OneSignalPushAdapter();
60+
61+
// Mock android ios senders
62+
var androidSender = jasmine.createSpy('send')
63+
var iosSender = jasmine.createSpy('send')
64+
65+
var senderMap = {
66+
ios: iosSender,
67+
android: androidSender
68+
};
69+
oneSignalPushAdapter.senderMap = senderMap;
70+
71+
// Mock installations
72+
var installations = [
73+
{
74+
deviceType: 'android',
75+
deviceToken: 'androidToken'
76+
},
77+
{
78+
deviceType: 'ios',
79+
deviceToken: 'iosToken'
80+
},
81+
{
82+
deviceType: 'win',
83+
deviceToken: 'winToken'
84+
},
85+
{
86+
deviceType: 'android',
87+
deviceToken: undefined
88+
}
89+
];
90+
var data = {};
91+
92+
oneSignalPushAdapter.send(data, installations);
93+
// Check android sender
94+
expect(androidSender).toHaveBeenCalled();
95+
var args = androidSender.calls.first().args;
96+
expect(args[0]).toEqual(data);
97+
expect(args[1]).toEqual([
98+
makeDevice('androidToken')
99+
]);
100+
// Check ios sender
101+
expect(iosSender).toHaveBeenCalled();
102+
args = iosSender.calls.first().args;
103+
expect(args[0]).toEqual(data);
104+
expect(args[1]).toEqual([
105+
makeDevice('iosToken')
106+
]);
107+
done();
108+
});
109+
110+
it("can send iOS notifications", (done) => {
111+
var oneSignalPushAdapter = new OneSignalPushAdapter();
112+
var sendToOneSignal = jasmine.createSpy('sendToOneSignal');
113+
oneSignalPushAdapter.sendToOneSignal = sendToOneSignal;
114+
115+
oneSignalPushAdapter.sendToAPNS({'data':{
116+
'badge': 1,
117+
'alert': "Example content",
118+
'sound': "Example sound",
119+
'content-available': 1,
120+
'misc-data': 'Example Data'
121+
}},[{'deviceToken':'iosToken1'},{'deviceToken':'iosToken2'}])
122+
123+
expect(sendToOneSignal).toHaveBeenCalled();
124+
var args = sendToOneSignal.calls.first().args;
125+
expect(args[0]).toEqual({
126+
'ios_badgeType':'SetTo',
127+
'ios_badgeCount':1,
128+
'contents': { 'en':'Example content'},
129+
'ios_sound': 'Example sound',
130+
'content_available':true,
131+
'data':{'misc-data':'Example Data'},
132+
'include_ios_tokens':['iosToken1','iosToken2']
133+
})
134+
done();
135+
});
136+
137+
it("can send Android notifications", (done) => {
138+
var oneSignalPushAdapter = new OneSignalPushAdapter();
139+
var sendToOneSignal = jasmine.createSpy('sendToOneSignal');
140+
oneSignalPushAdapter.sendToOneSignal = sendToOneSignal;
141+
142+
oneSignalPushAdapter.sendToGCM({'data':{
143+
'title': 'Example title',
144+
'alert': 'Example content',
145+
'misc-data': 'Example Data'
146+
}},[{'deviceToken':'androidToken1'},{'deviceToken':'androidToken2'}])
147+
148+
expect(sendToOneSignal).toHaveBeenCalled();
149+
var args = sendToOneSignal.calls.first().args;
150+
expect(args[0]).toEqual({
151+
'contents': { 'en':'Example content'},
152+
'title': {'en':'Example title'},
153+
'data':{'misc-data':'Example Data'},
154+
'include_android_reg_ids': ['androidToken1','androidToken2']
155+
})
156+
done();
157+
});
158+
159+
it("can post the correct data", (done) => {
160+
var pushConfig = {
161+
oneSignalAppId:"APP ID",
162+
oneSignalApiKey:"API KEY"
163+
};
164+
var oneSignalPushAdapter = new OneSignalPushAdapter(pushConfig);
165+
166+
var write = jasmine.createSpy('write');
167+
oneSignalPushAdapter.https = {
168+
'request': function(a,b) {
169+
return {
170+
'end':function(){},
171+
'on':function(a,b){},
172+
'write':write
173+
}
174+
}
175+
};
176+
177+
var installations = [
178+
{
179+
deviceType: 'android',
180+
deviceToken: 'androidToken'
181+
},
182+
{
183+
deviceType: 'ios',
184+
deviceToken: 'iosToken'
185+
},
186+
{
187+
deviceType: 'win',
188+
deviceToken: 'winToken'
189+
},
190+
{
191+
deviceType: 'android',
192+
deviceToken: undefined
193+
}
194+
];
195+
196+
oneSignalPushAdapter.send({'data':{
197+
'title': 'Example title',
198+
'alert': 'Example content',
199+
'content-available':1,
200+
'misc-data': 'Example Data'
201+
}}, installations);
202+
203+
expect(write).toHaveBeenCalled();
204+
205+
// iOS
206+
args = write.calls.first().args;
207+
expect(args[0]).toEqual(JSON.stringify({
208+
'contents': { 'en':'Example content'},
209+
'content_available':true,
210+
'data':{'title':'Example title','misc-data':'Example Data'},
211+
'include_ios_tokens':['iosToken'],
212+
'app_id':'APP ID'
213+
}));
214+
215+
// Android
216+
args = write.calls.mostRecent().args;
217+
expect(args[0]).toEqual(JSON.stringify({
218+
'contents': { 'en':'Example content'},
219+
'title': {'en':'Example title'},
220+
'data':{"content-available":1,'misc-data':'Example Data'},
221+
'include_android_reg_ids':['androidToken'],
222+
'app_id':'APP ID'
223+
}));
224+
225+
done();
226+
});
227+
228+
function makeDevice(deviceToken, appIdentifier) {
229+
return {
230+
deviceToken: deviceToken
231+
};
232+
}
233+
234+
});

spec/ParseInstallation.spec.js

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,6 @@ describe('Installations', () => {
133133
});
134134
});
135135

136-
it('fails for android with device token', (done) => {
137-
var installId = '12345678-abcd-abcd-abcd-123456789abc';
138-
var t = '11433856eed2f1285fb3aa11136718c1198ed5647875096952c66bf8cb976306';
139-
var device = 'android';
140-
var input = {
141-
'installationId': installId,
142-
'deviceType': device,
143-
'deviceToken': t,
144-
'channels': ['foo', 'bar']
145-
};
146-
rest.create(config, auth.nobody(config), '_Installation', input)
147-
.then(() => {
148-
fail('Should not have been able to create an Installation.');
149-
done();
150-
}).catch((error) => {
151-
expect(error.code).toEqual(114);
152-
done();
153-
});
154-
});
155-
156136
it('fails for android with missing type', (done) => {
157137
var installId = '12345678-abcd-abcd-abcd-123456789abc';
158138
var input = {

0 commit comments

Comments
 (0)