mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 14:47:53 +01:00
Ported addPushDevice. Added unit tests. Added addPushDevice route. Added integration tests
This commit is contained in:
@@ -164,5 +164,9 @@
|
||||
"cannotRevive": "Cannot revive if not dead",
|
||||
"rebirthComplete": "You have been reborn!",
|
||||
"petNotOwned": "You do not own this pet.",
|
||||
"rerollComplete": "Reroll complete!"
|
||||
"rerollComplete": "Reroll complete!",
|
||||
"resetComplete": "Reset has completed",
|
||||
"regIdRequired": "RegId is required",
|
||||
"pushDeviceAdded": "Push device added successfully",
|
||||
"pushDeviceAlreadyAdded": "The user already has the push device"
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@ import blockUser from './ops/blockUser';
|
||||
import clearPMs from './ops/clearPMs';
|
||||
import deletePM from './ops/deletePM';
|
||||
import reroll from './ops/reroll';
|
||||
import addPushDevice from './ops/addPushDevice';
|
||||
|
||||
api.ops = {
|
||||
scoreTask,
|
||||
@@ -154,6 +155,7 @@ api.ops = {
|
||||
clearPMs,
|
||||
deletePM,
|
||||
reroll,
|
||||
addPushDevice,
|
||||
};
|
||||
|
||||
import handleTwoHanded from './fns/handleTwoHanded';
|
||||
|
||||
@@ -1,20 +1,43 @@
|
||||
import _ from 'lodash';
|
||||
import i18n from '../i18n';
|
||||
import splitWhitespace from '../libs/splitWhitespace';
|
||||
import {
|
||||
BadRequest,
|
||||
NotAuthorized,
|
||||
} from '../libs/errors';
|
||||
|
||||
module.exports = function addPushDevice (user, req = {}) {
|
||||
let regId = _.get(req, 'body.regId');
|
||||
if (!regId) throw new BadRequest(i18n.t('regIdRequired', req.language));
|
||||
|
||||
let type = _.get(req, 'body.type');
|
||||
if (!type) throw new BadRequest(i18n.t('typeRequired', req.language));
|
||||
|
||||
module.exports = function(user, req, cb) {
|
||||
var i, item, pd;
|
||||
if (!user.pushDevices) {
|
||||
user.pushDevices = [];
|
||||
}
|
||||
pd = user.pushDevices;
|
||||
item = {
|
||||
regId: req.body.regId,
|
||||
type: req.body.type
|
||||
|
||||
let pushDevices = user.pushDevices;
|
||||
|
||||
let item = {
|
||||
regId,
|
||||
type,
|
||||
};
|
||||
i = _.findIndex(pd, {
|
||||
regId: item.regId
|
||||
|
||||
let indexOfPushDevice = _.findIndex(pushDevices, {
|
||||
regId: item.regId,
|
||||
});
|
||||
if (i === -1) {
|
||||
pd.push(item);
|
||||
|
||||
if (indexOfPushDevice !== -1) {
|
||||
throw new NotAuthorized(i18n.t('pushDeviceAlreadyAdded', req.language));
|
||||
}
|
||||
return typeof cb === "function" ? cb(null, user.pushDevices) : void 0;
|
||||
|
||||
pushDevices.push(item);
|
||||
|
||||
let response = {
|
||||
data: _.pick(user, splitWhitespace('pushDevices')),
|
||||
message: i18n.t('pushDeviceAdded', req.language),
|
||||
};
|
||||
|
||||
return response;
|
||||
};
|
||||
|
||||
@@ -10,7 +10,6 @@ const COMMON_FILES = [
|
||||
'./common/script/**/*.js',
|
||||
// @TODO remove these negations as the files are converted over.
|
||||
'!./common/script/content/index.js',
|
||||
'!./common/script/ops/addPushDevice.js',
|
||||
'!./common/script/ops/reset.js',
|
||||
'!./common/script/fns/crit.js',
|
||||
'!./common/script/fns/randomDrop.js',
|
||||
|
||||
35
test/api/v3/integration/user/POST-user_addPushDevice.test.js
Normal file
35
test/api/v3/integration/user/POST-user_addPushDevice.test.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import {
|
||||
generateUser,
|
||||
translate as t,
|
||||
} from '../../../../helpers/api-integration/v3';
|
||||
|
||||
describe('POST /user/addPushDevice', () => {
|
||||
let user;
|
||||
let regId = '10';
|
||||
let type = 'someRandomType';
|
||||
|
||||
beforeEach(async () => {
|
||||
user = await generateUser();
|
||||
});
|
||||
|
||||
it('returns an error if user already has the push device', async () => {
|
||||
await user.post('/user/addPushDevice', {type, regId});
|
||||
await expect(user.post('/user/addPushDevice', {type, regId}))
|
||||
.to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('pushDeviceAlreadyAdded'),
|
||||
});
|
||||
});
|
||||
|
||||
// More tests in common code unit tests
|
||||
|
||||
it('adds a push device to the user', async () => {
|
||||
let response = await user.post('/user/addPushDevice', {type, regId});
|
||||
await user.sync();
|
||||
|
||||
expect(response.message).to.equal(t('pushDeviceAdded'));
|
||||
expect(user.pushDevices[0].type).to.equal(type);
|
||||
expect(user.pushDevices[0].regId).to.equal(regId);
|
||||
});
|
||||
});
|
||||
59
test/common/ops/addPushDevice.js
Normal file
59
test/common/ops/addPushDevice.js
Normal file
@@ -0,0 +1,59 @@
|
||||
import addPushDevice from '../../../common/script/ops/addPushDevice';
|
||||
import i18n from '../../../common/script/i18n';
|
||||
import {
|
||||
generateUser,
|
||||
} from '../../helpers/common.helper';
|
||||
import {
|
||||
NotAuthorized,
|
||||
BadRequest,
|
||||
} from '../../../common/script/libs/errors';
|
||||
|
||||
describe('shared.ops.addPushDevice', () => {
|
||||
let user;
|
||||
let regId = '10';
|
||||
let type = 'someRandomType';
|
||||
|
||||
beforeEach(() => {
|
||||
user = generateUser();
|
||||
user.stats.hp = 0;
|
||||
});
|
||||
|
||||
it('returns an error when regId is not provided', (done) => {
|
||||
try {
|
||||
addPushDevice(user);
|
||||
} catch (err) {
|
||||
expect(err).to.be.an.instanceof(BadRequest);
|
||||
expect(err.message).to.equal(i18n.t('regIdRequired'));
|
||||
done();
|
||||
}
|
||||
});
|
||||
|
||||
it('returns an error when type is not provided', (done) => {
|
||||
try {
|
||||
addPushDevice(user, {body: {regId}});
|
||||
} catch (err) {
|
||||
expect(err).to.be.an.instanceof(BadRequest);
|
||||
expect(err.message).to.equal(i18n.t('typeRequired'));
|
||||
done();
|
||||
}
|
||||
});
|
||||
|
||||
it('adds a push device', () => {
|
||||
let response = addPushDevice(user, {body: {regId, type}});
|
||||
|
||||
expect(response.message).to.equal(i18n.t('pushDeviceAdded'));
|
||||
expect(user.pushDevices[0].type).to.equal(type);
|
||||
expect(user.pushDevices[0].regId).to.equal(regId);
|
||||
});
|
||||
|
||||
it('does not a push device twice', (done) => {
|
||||
try {
|
||||
addPushDevice(user, {body: {regId, type}});
|
||||
addPushDevice(user, {body: {regId, type}});
|
||||
} catch (err) {
|
||||
expect(err).to.be.an.instanceof(NotAuthorized);
|
||||
expect(err.message).to.equal(i18n.t('pushDeviceAlreadyAdded'));
|
||||
done();
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -1061,4 +1061,26 @@ api.userReroll = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* @api {post} /user/addPushDevice Adds a push device to a user.
|
||||
* @apiVersion 3.0.0
|
||||
* @apiName UserAddPushDevice
|
||||
* @apiGroup User
|
||||
*
|
||||
* @apiSuccess {Object} data `pushDevices`
|
||||
*/
|
||||
api.userAddPushDevice = {
|
||||
method: 'POST',
|
||||
middlewares: [authWithHeaders(), cron],
|
||||
url: '/user/addPushDevice',
|
||||
async handler (req, res) {
|
||||
let user = res.locals.user;
|
||||
|
||||
let addPushDeviceResponse = common.ops.addPushDevice(user, req);
|
||||
await user.save();
|
||||
|
||||
res.respond(200, addPushDeviceResponse);
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = api;
|
||||
|
||||
Reference in New Issue
Block a user