From 6d9617e345d699f383ae023228fde48c8187c006 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Fri, 1 Apr 2016 09:17:40 -0500 Subject: [PATCH] Ported read card, added unit tests, added read card route and integration tests --- common/locales/en/api-v3.json | 5 +- common/script/index.js | 2 + common/script/ops/readCard.js | 32 ++++++++++--- .../user/POST-user_read_card.test.js | 38 +++++++++++++++ test/common/ops/readCard.js | 48 +++++++++++++++++++ website/src/controllers/api-v3/user.js | 22 +++++++++ 6 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 test/api/v3/integration/user/POST-user_read_card.test.js create mode 100644 test/common/ops/readCard.js diff --git a/common/locales/en/api-v3.json b/common/locales/en/api-v3.json index a9c0a0fb2d..eb412dd1ed 100644 --- a/common/locales/en/api-v3.json +++ b/common/locales/en/api-v3.json @@ -128,5 +128,8 @@ "privateMessageGiftSubscriptionMessage": "<%= numberOfMonths %> months of subscription! ", "cannotSendGemsToYourself": "Cannot send gems to yourself. Try a subscription instead.", "notEnoughGemsToSend": "Amount must be within 0 and your current number of gems.", - "mustPurchaseToSet": "Must purchase <%= val %> to set it on <%= key %>." + "mustPurchaseToSet": "Must purchase <%= val %> to set it on <%= key %>.", + "readCard": "<%= cardType %> has been read", + "cardTypeRequired": "Card type required", + "cardTypeNotAllowed": "Unkown card type." } diff --git a/common/script/index.js b/common/script/index.js index 7f9736044d..f2aeecea0a 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -114,6 +114,7 @@ import feed from './ops/feed'; import equip from './ops/equip'; import changeClass from './ops/changeClass'; import disableClasses from './ops/disableClasses'; +import readCard from './ops/readCard'; api.ops = { scoreTask, @@ -129,6 +130,7 @@ api.ops = { equip, changeClass, disableClasses, + readCard, }; import handleTwoHanded from './fns/handleTwoHanded'; diff --git a/common/script/ops/readCard.js b/common/script/ops/readCard.js index a6eb5c05f1..b6d34dcd7d 100644 --- a/common/script/ops/readCard.js +++ b/common/script/ops/readCard.js @@ -1,10 +1,28 @@ -module.exports = function(user, req, cb) { - var cardType; - cardType = req.params.cardType; - user.items.special[cardType + "Received"].shift(); - if (typeof user.markModified === "function") { - user.markModified("items.special." + cardType + "Received"); +import splitWhitespace from '../libs/splitWhitespace'; +import _ from 'lodash'; +import i18n from '../i18n'; +import { + BadRequest, + NotAuthorized, +} from '../libs/errors'; +import content from '../content/index'; + +module.exports = function readCard (user, req = {}) { + let cardType = _.get(req.params, 'cardType'); + + if (!cardType) { + throw new BadRequest(i18n.t('cardTypeRequired', req.language)); } + + if (_.keys(content.cardTypes).indexOf(cardType) === -1) { + throw new NotAuthorized(i18n.t('cardTypeNotAllowed', req.language)); + } + + user.items.special[`${cardType}Received`].shift(); user.flags.cardReceived = false; - return typeof cb === "function" ? cb(null, 'items.special flags.cardReceived') : void 0; + + return { + message: i18n.t('readCard', {cardType}, req.language), + data: _.pick(user, splitWhitespace('items.special flags.cardReceived')), + }; }; diff --git a/test/api/v3/integration/user/POST-user_read_card.test.js b/test/api/v3/integration/user/POST-user_read_card.test.js new file mode 100644 index 0000000000..3b3573b6cc --- /dev/null +++ b/test/api/v3/integration/user/POST-user_read_card.test.js @@ -0,0 +1,38 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('POST /user/read-card/:cardType', () => { + let user; + let cardType = 'greeting'; + + beforeEach(async () => { + user = await generateUser(); + }); + + it('returns an error when unknown cardType is provded', async () => { + await expect(user.post('/user/read-card/randomCardType')) + .to.eventually.be.rejected.and.to.eql({ + code: 401, + error: 'NotAuthorized', + message: t('cardTypeNotAllowed'), + }); + }); + + // More tests in common code unit tests + + it('reads a card', async () => { + await user.update({ + 'items.special.greetingReceived': [true], + 'flags.cardReceived': true, + }); + + let response = await user.post(`/user/read-card/${cardType}`); + await user.sync(); + + expect(response.message).to.equal(t('readCard', {cardType})); + expect(user.items.special[`${cardType}Received`]).to.be.empty; + expect(user.flags.cardReceived).to.be.false; + }); +}); diff --git a/test/common/ops/readCard.js b/test/common/ops/readCard.js new file mode 100644 index 0000000000..27f78ea5cd --- /dev/null +++ b/test/common/ops/readCard.js @@ -0,0 +1,48 @@ +import readCard from '../../../common/script/ops/readCard'; +import i18n from '../../../common/script/i18n'; +import { + generateUser, +} from '../../helpers/common.helper'; +import { + BadRequest, + NotAuthorized, +} from '../../../common/script/libs/errors'; + +describe('shared.ops.readCard', () => { + let user; + let cardType = 'greeting'; + + beforeEach(() => { + user = generateUser(); + user.items.special[`${cardType}Received`] = [true]; + user.flags.cardReceived = true; + }); + + it('returns an error when cardType is not provided', (done) => { + try { + readCard(user); + } catch (err) { + expect(err).to.be.an.instanceof(BadRequest); + expect(err.message).to.equal(i18n.t('cardTypeRequired')); + done(); + } + }); + + it('returns an error when unknown cardType is provided', (done) => { + try { + readCard(user, {params: {cardType: 'randomCardType'}}); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('cardTypeNotAllowed')); + done(); + } + }); + + it('reads a card', () => { + let response = readCard(user, {params: {cardType: 'greeting'}}); + + expect(response.message).to.equal(i18n.t('readCard', {cardType})); + expect(user.items.special[`${cardType}Received`]).to.be.empty; + expect(user.flags.cardReceived).to.be.false; + }); +}); diff --git a/website/src/controllers/api-v3/user.js b/website/src/controllers/api-v3/user.js index 147f1552c9..dc68bbf5bc 100644 --- a/website/src/controllers/api-v3/user.js +++ b/website/src/controllers/api-v3/user.js @@ -676,4 +676,26 @@ api.disableClasses = { }, }; +/** +* @api {post} /user/read-card/:cardType Reads a card. +* @apiVersion 3.0.0 +* @apiName UserReadCard +* @apiGroup User +* +* @apiParam {string} cardType Type of card to read +* +* @apiSuccess {Object} data `items.special flags.cardReceived` +*/ +api.readCard = { + method: 'POST', + middlewares: [authWithHeaders(), cron], + url: '/user/read-card/:cardType', + async handler (req, res) { + let user = res.locals.user; + let readCardResponse = common.ops.readCard(user, req); + await user.save(); + res.respond(200, readCardResponse); + }, +}; + module.exports = api;