Skip to content

Commit 76d9871

Browse files
committed
Add support for push
1 parent 29d70a6 commit 76d9871

10 files changed

+530
-64
lines changed

spec/APNS.spec.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,18 @@ describe('APNS', () => {
4343
'alert': 'alert'
4444
}
4545
}
46-
// Mock registrationTokens
47-
var deviceTokens = ['token'];
46+
// Mock devices
47+
var devices = [
48+
{ deviceToken: 'token' }
49+
];
4850

49-
var promise = apns.send(data, deviceTokens);
51+
var promise = apns.send(data, devices);
5052
expect(sender.pushNotification).toHaveBeenCalled();
5153
var args = sender.pushNotification.calls.first().args;
5254
var notification = args[0];
5355
expect(notification.alert).toEqual(data.data.alert);
5456
expect(notification.expiry).toEqual(data['expiration_time']);
55-
expect(args[1]).toEqual(deviceTokens);
57+
expect(args[1]).toEqual(['token']);
5658
done();
5759
});
5860
});

spec/GCM.spec.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,18 @@ describe('GCM', () => {
104104
'alert': 'alert'
105105
}
106106
}
107-
// Mock registrationTokens
108-
var registrationTokens = ['token'];
107+
// Mock devices
108+
var devices = [
109+
{
110+
deviceToken: 'token'
111+
}
112+
];
109113

110-
var promise = gcm.send(data, registrationTokens);
114+
var promise = gcm.send(data, devices);
111115
expect(sender.send).toHaveBeenCalled();
112116
var args = sender.send.calls.first().args;
113117
// It is too hard to verify message of gcm library, we just verify tokens and retry times
114-
expect(args[1].registrationTokens).toEqual(registrationTokens);
118+
expect(args[1].registrationTokens).toEqual(['token']);
115119
expect(args[2]).toEqual(5);
116120
done();
117121
});
@@ -123,14 +127,16 @@ describe('GCM', () => {
123127
send: jasmine.createSpy('send')
124128
};
125129
gcm.sender = sender;
126-
// Mock registrationTokens
127-
var registrationTokens = [];
130+
// Mock devices
131+
var devices = [];
128132
for (var i = 0; i <= 2000; i++) {
129-
registrationTokens.push(i.toString());
133+
devices.push({
134+
deviceToken: i.toString()
135+
});
130136
}
131137

132138
expect(function() {
133-
gcm.send({}, registrationTokens);
139+
gcm.send({}, devices);
134140
}).toThrow();
135141
done();
136142
});

spec/ParsePushAdapter.spec.js

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
var ParsePushAdapter = require('../src/Adapters/Push/ParsePushAdapter');
2+
3+
describe('ParsePushAdapter', () => {
4+
it('can be initialized', (done) => {
5+
var parsePushAdapter = new ParsePushAdapter();
6+
7+
expect(parsePushAdapter.validPushTypes).toEqual(['ios', 'android']);
8+
done();
9+
});
10+
11+
it('can initialize', (done) => {
12+
var parsePushAdapter = new ParsePushAdapter();
13+
// Make mock config
14+
var pushConfig = {
15+
android: {
16+
senderId: 'senderId',
17+
apiKey: 'apiKey'
18+
},
19+
ios: [
20+
{
21+
cert: 'prodCert.pem',
22+
key: 'prodKey.pem',
23+
production: true
24+
},
25+
{
26+
cert: 'devCert.pem',
27+
key: 'devKey.pem',
28+
production: false
29+
}
30+
]
31+
};
32+
33+
parsePushAdapter.initialize(pushConfig);
34+
// Check ios
35+
var iosSenders = parsePushAdapter.senders['ios'];
36+
expect(iosSenders.length).toBe(2);
37+
// TODO: Remove this checking onec we inject APNS
38+
var prodApnsOptions = iosSenders[0].sender.options;
39+
expect(prodApnsOptions.cert).toBe(pushConfig.ios[0].cert);
40+
expect(prodApnsOptions.key).toBe(pushConfig.ios[0].key);
41+
expect(prodApnsOptions.production).toBe(pushConfig.ios[0].production);
42+
var devApnsOptions = iosSenders[1].sender.options;
43+
expect(devApnsOptions.cert).toBe(pushConfig.ios[1].cert);
44+
expect(devApnsOptions.key).toBe(pushConfig.ios[1].key);
45+
expect(devApnsOptions.production).toBe(pushConfig.ios[1].production);
46+
// Check android
47+
var androidSenders = parsePushAdapter.senders['android'];
48+
expect(androidSenders.length).toBe(1);
49+
var androidSender = androidSenders[0];
50+
// TODO: Remove this checking onec we inject GCM
51+
expect(androidSender.sender.key).toBe(pushConfig.android.apiKey);
52+
done();
53+
});
54+
55+
it('can throw on initializing with unsupported push type', (done) => {
56+
var parsePushAdapter = new ParsePushAdapter();
57+
// Make mock config
58+
var pushConfig = {
59+
win: {
60+
senderId: 'senderId',
61+
apiKey: 'apiKey'
62+
}
63+
};
64+
65+
expect(function() {
66+
parsePushAdapter.initialize(pushConfig)
67+
}).toThrow();
68+
done();
69+
});
70+
71+
it('can throw on initializing with invalid pushConfig', (done) => {
72+
var parsePushAdapter = new ParsePushAdapter();
73+
// Make mock config
74+
var pushConfig = {
75+
android: 123
76+
};
77+
78+
expect(function() {
79+
parsePushAdapter.initialize(pushConfig)
80+
}).toThrow();
81+
done();
82+
});
83+
84+
it('can get push senders', (done) => {
85+
var parsePushAdapter = new ParsePushAdapter();
86+
// Mock push senders
87+
var androidSender = {};
88+
var iosSender = {};
89+
var iosSenderAgain = {};
90+
parsePushAdapter.senders = {
91+
android: [
92+
androidSender
93+
],
94+
ios: [
95+
iosSender,
96+
iosSenderAgain
97+
]
98+
};
99+
100+
expect(parsePushAdapter.getPushSenders('android')).toEqual([androidSender]);
101+
expect(parsePushAdapter.getPushSenders('ios')).toEqual([iosSender, iosSenderAgain]);
102+
done();
103+
});
104+
105+
it('can get empty push senders', (done) => {
106+
var parsePushAdapter = new ParsePushAdapter();
107+
108+
expect(parsePushAdapter.getPushSenders('android')).toEqual([]);
109+
done();
110+
});
111+
112+
it('can get valid push types', (done) => {
113+
var parsePushAdapter = new ParsePushAdapter();
114+
115+
expect(parsePushAdapter.getValidPushTypes()).toEqual(['ios', 'android']);
116+
done();
117+
});
118+
119+
it('can classify installation', (done) => {
120+
// Mock installations
121+
var validPushTypes = ['ios', 'android'];
122+
var installations = [
123+
{
124+
deviceType: 'android',
125+
deviceToken: 'androidToken'
126+
},
127+
{
128+
deviceType: 'ios',
129+
deviceToken: 'iosToken'
130+
},
131+
{
132+
deviceType: 'win',
133+
deviceToken: 'winToken'
134+
},
135+
{
136+
deviceType: 'android',
137+
deviceToken: undefined
138+
}
139+
];
140+
141+
var deviceTokenMap = ParsePushAdapter.classifyInstallation(installations, validPushTypes);
142+
expect(deviceTokenMap['android']).toEqual([makeDevice('androidToken')]);
143+
expect(deviceTokenMap['ios']).toEqual([makeDevice('iosToken')]);
144+
expect(deviceTokenMap['win']).toBe(undefined);
145+
done();
146+
});
147+
148+
it('can slice ios devices', (done) => {
149+
// Mock devices
150+
var devices = [makeDevice(1), makeDevice(2), makeDevice(3), makeDevice(4)];
151+
152+
var chunkDevices = ParsePushAdapter.sliceDevices('ios', devices, 2);
153+
expect(chunkDevices).toEqual([devices]);
154+
done();
155+
});
156+
157+
it('can slice android devices', (done) => {
158+
// Mock devices
159+
var devices = [makeDevice(1), makeDevice(2), makeDevice(3), makeDevice(4)];
160+
161+
var chunkDevices = ParsePushAdapter.sliceDevices('android', devices, 3);
162+
expect(chunkDevices).toEqual([
163+
[makeDevice(1), makeDevice(2), makeDevice(3)],
164+
[makeDevice(4)]
165+
]);
166+
done();
167+
});
168+
169+
170+
it('can send push notifications', (done) => {
171+
var parsePushAdapter = new ParsePushAdapter();
172+
// Mock android ios senders
173+
var androidSender = {
174+
send: jasmine.createSpy('send')
175+
};
176+
var iosSender = {
177+
send: jasmine.createSpy('send')
178+
};
179+
var iosSenderAgain = {
180+
send: jasmine.createSpy('send')
181+
};
182+
var senders = {
183+
ios: [iosSender, iosSenderAgain],
184+
android: [androidSender]
185+
};
186+
parsePushAdapter.senders = senders;
187+
// Mock installations
188+
var installations = [
189+
{
190+
deviceType: 'android',
191+
deviceToken: 'androidToken'
192+
},
193+
{
194+
deviceType: 'ios',
195+
deviceToken: 'iosToken'
196+
},
197+
{
198+
deviceType: 'win',
199+
deviceToken: 'winToken'
200+
},
201+
{
202+
deviceType: 'android',
203+
deviceToken: undefined
204+
}
205+
];
206+
var data = {};
207+
208+
parsePushAdapter.send(data, installations);
209+
// Check android sender
210+
expect(androidSender.send).toHaveBeenCalled();
211+
var args = androidSender.send.calls.first().args;
212+
expect(args[0]).toEqual(data);
213+
expect(args[1]).toEqual([
214+
makeDevice('androidToken')
215+
]);
216+
// Check ios sender
217+
expect(iosSender.send).toHaveBeenCalled();
218+
args = iosSender.send.calls.first().args;
219+
expect(args[0]).toEqual(data);
220+
expect(args[1]).toEqual([
221+
makeDevice('iosToken')
222+
]);
223+
expect(iosSenderAgain.send).toHaveBeenCalled();
224+
args = iosSenderAgain.send.calls.first().args;
225+
expect(args[0]).toEqual(data);
226+
expect(args[1]).toEqual([
227+
makeDevice('iosToken')
228+
]);
229+
done();
230+
});
231+
232+
function makeDevice(deviceToken) {
233+
return {
234+
deviceToken: deviceToken
235+
};
236+
}
237+
});

spec/push.spec.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,11 @@ describe('push', () => {
104104
it('can validate device type when no device type is set', (done) => {
105105
// Make query condition
106106
var where = {
107-
}
107+
};
108+
var validPushTypes = ['ios', 'android'];
108109

109110
expect(function(){
110-
push.validateDeviceType(where);
111+
push.validatePushType(where, validPushTypes);
111112
}).not.toThrow();
112113
done();
113114
});
@@ -116,10 +117,11 @@ describe('push', () => {
116117
// Make query condition
117118
var where = {
118119
'deviceType': 'ios'
119-
}
120+
};
121+
var validPushTypes = ['ios', 'android'];
120122

121123
expect(function(){
122-
push.validateDeviceType(where);
124+
push.validatePushType(where, validPushTypes);
123125
}).not.toThrow();
124126
done();
125127
});
@@ -130,10 +132,11 @@ describe('push', () => {
130132
'deviceType': {
131133
'$in': ['android', 'ios']
132134
}
133-
}
135+
};
136+
var validPushTypes = ['ios', 'android'];
134137

135138
expect(function(){
136-
push.validateDeviceType(where);
139+
push.validatePushType(where, validPushTypes);
137140
}).not.toThrow();
138141
done();
139142
});
@@ -142,10 +145,11 @@ describe('push', () => {
142145
// Make query condition
143146
var where = {
144147
'deviceType': 'osx'
145-
}
148+
};
149+
var validPushTypes = ['ios', 'android'];
146150

147151
expect(function(){
148-
push.validateDeviceType(where);
152+
push.validatePushType(where, validPushTypes);
149153
}).toThrow();
150154
done();
151155
});
@@ -154,10 +158,11 @@ describe('push', () => {
154158
// Make query condition
155159
var where = {
156160
'deviceType': 'osx'
157-
}
161+
};
162+
var validPushTypes = ['ios', 'android'];
158163

159164
expect(function(){
160-
push.validateDeviceType(where)
165+
push.validatePushType(where, validPushTypes);
161166
}).toThrow();
162167
done();
163168
});

0 commit comments

Comments
 (0)