Adds support for localized push notification in push payload (#4129)

* Adds support for localized push data keys

- passign alert-[lang|locale] or title-[lang|locale] will inject the
  proper locale on the push body based on the installation

* Better handling of the default cases

* Updates changelog

* nits

* nits
This commit is contained in:
Florent Vilmart
2017-09-01 15:22:02 -04:00
committed by GitHub
parent 540daa4c4a
commit 6df944704c
6 changed files with 267 additions and 2 deletions

View File

@@ -847,7 +847,7 @@ describe('PushController', () => {
});
});
it('should mark the _PushStatus as succeeded when audience has no deviceToken', (done) => {
it('should mark the _PushStatus as failed when audience has no deviceToken', (done) => {
var auth = {
isMaster: true
}
@@ -913,4 +913,70 @@ describe('PushController', () => {
done();
});
});
it('should support localized payload data', (done) => {
var payload = {data: {
alert: 'Hello!',
'alert-fr': 'Bonjour',
'alert-es': 'Ola'
}}
var pushAdapter = {
send: function(body, installations) {
return successfulTransmissions(body, installations);
},
getValidPushTypes: function() {
return ["ios"];
}
}
var config = new Config(Parse.applicationId);
var auth = {
isMaster: true
}
const where = {
'deviceType': 'ios'
}
spyOn(pushAdapter, 'send').and.callThrough();
var pushController = new PushController();
reconfigureServer({
push: { adapter: pushAdapter }
}).then(() => {
var installations = [];
while (installations.length != 5) {
const installation = new Parse.Object("_Installation");
installation.set("installationId", "installation_" + installations.length);
installation.set("deviceToken", "device_token_" + installations.length)
installation.set("badge", installations.length);
installation.set("originalBadge", installations.length);
installation.set("deviceType", "ios");
installations.push(installation);
}
installations[0].set('localeIdentifier', 'fr-CA');
installations[1].set('localeIdentifier', 'fr-FR');
installations[2].set('localeIdentifier', 'en-US');
return Parse.Object.saveAll(installations);
}).then(() => {
return pushController.sendPush(payload, where, config, auth)
}).then(() => {
// Wait so the push is completed.
return new Promise((resolve) => { setTimeout(() => { resolve(); }, 1000); });
}).then(() => {
expect(pushAdapter.send.calls.count()).toBe(2);
const firstCall = pushAdapter.send.calls.first();
expect(firstCall.args[0].data).toEqual({
alert: 'Hello!'
});
expect(firstCall.args[1].length).toBe(3); // 3 installations
const lastCall = pushAdapter.send.calls.mostRecent();
expect(lastCall.args[0].data).toEqual({
alert: 'Bonjour'
});
expect(lastCall.args[1].length).toBe(2); // 2 installations
// No installation is in es so only 1 call for fr, and another for default
done();
}).catch(done.fail);
});
});