diff --git a/test/api/v3/integration/debug/POST-debug_addHourglass.test.js b/test/api/v3/integration/debug/POST-debug_addHourglass.test.js new file mode 100644 index 0000000000..767fa840f2 --- /dev/null +++ b/test/api/v3/integration/debug/POST-debug_addHourglass.test.js @@ -0,0 +1,35 @@ +import nconf from 'nconf'; +import { + generateUser, +} from '../../../../helpers/api-v3-integration.helper'; + +describe('POST /debug/add-hourglass', () => { + let userToGetHourGlass; + + before(async () => { + userToGetHourGlass = await generateUser(); + }); + + after(() => { + nconf.set('IS_PROD', false); + }); + + it('adds Hourglass to the current user', async () => { + await userToGetHourGlass.post('/debug/add-hourglass'); + + let userWithHourGlass = await userToGetHourGlass.get('/user'); + + expect(userWithHourGlass.purchased.plan.consecutive.trinkets).to.equal(1); + }); + + it('returns error when not in production mode', async () => { + nconf.set('IS_PROD', true); + + await expect(userToGetHourGlass.post('/debug/add-hourglass')) + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); + }); +}); diff --git a/test/api/v3/integration/debug/POST-debug_addTenGems.test.js b/test/api/v3/integration/debug/POST-debug_addTenGems.test.js new file mode 100644 index 0000000000..fd01aea5d3 --- /dev/null +++ b/test/api/v3/integration/debug/POST-debug_addTenGems.test.js @@ -0,0 +1,35 @@ +import nconf from 'nconf'; +import { + generateUser, +} from '../../../../helpers/api-v3-integration.helper'; + +describe('POST /debug/add-ten-gems', () => { + let userToGainTenGems; + + before(async () => { + userToGainTenGems = await generateUser(); + }); + + after(() => { + nconf.set('IS_PROD', false); + }); + + it('adds ten gems to the current user', async () => { + await userToGainTenGems.post('/debug/add-ten-gems'); + + let userWithTenGems = await userToGainTenGems.get('/user'); + + expect(userWithTenGems.balance).to.equal(2.5); + }); + + it('returns error when not in production mode', async () => { + nconf.set('IS_PROD', true); + + await expect(userToGainTenGems.post('/debug/add-ten-gems')) + .eventually.be.rejected.and.to.deep.equal({ + code: 404, + error: 'NotFound', + message: 'Not found.', + }); + }); +}); diff --git a/test/api/v3/unit/middlewares/ensureDevelpmentMode.js b/test/api/v3/unit/middlewares/ensureDevelpmentMode.js new file mode 100644 index 0000000000..8d0f8efbab --- /dev/null +++ b/test/api/v3/unit/middlewares/ensureDevelpmentMode.js @@ -0,0 +1,36 @@ +/* eslint-disable global-require */ +import { + generateRes, + generateReq, + generateNext, +} from '../../../../helpers/api-unit.helper'; +import ensureDevelpmentMode from '../../../../../website/src/middlewares/api-v3/ensureDevelpmentMode'; +import { NotFound } from '../../../../../website/src/libs/api-v3/errors'; +import nconf from 'nconf'; + +describe('developmentMode middleware', () => { + let res, req, next; + + beforeEach(() => { + res = generateRes(); + req = generateReq(); + next = generateNext(); + }); + + it('returns not found when in production mode', () => { + sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(true); + + ensureDevelpmentMode(req, res, next); + + expect(next).to.be.calledWith(new NotFound()); + }); + + it('passes when not in production', () => { + sandbox.stub(nconf, 'get').withArgs('IS_PROD').returns(false); + + ensureDevelpmentMode(req, res, next); + + expect(next).to.be.calledOnce; + expect(next.args[0]).to.be.empty; + }); +}); diff --git a/website/src/controllers/api-v3/debug.js b/website/src/controllers/api-v3/debug.js new file mode 100644 index 0000000000..1aa5b08ffb --- /dev/null +++ b/website/src/controllers/api-v3/debug.js @@ -0,0 +1,57 @@ +import { authWithHeaders } from '../../middlewares/api-v3/auth'; +import cron from '../../middlewares/api-v3/cron'; +import ensureDevelpmentMode from '../../middlewares/api-v3/ensureDevelpmentMode'; + +let api = {}; + +api.debug = { + method: 'all', + url: '/debug/*', + middlewares: [ensureDevelpmentMode, authWithHeaders(), cron], +}; + +/** + * @api {post} /debug/add-ten-gems Add ten gems to the current user + * @apiVersion 3.0.0 + * @apiName AddTenGems + * @apiGroup Development + * + * @apiSuccess {} An empty Object + */ +api.addTenGems = { + method: 'POST', + url: '/debug/add-ten-gems', + async handler (req, res) { + let user = res.locals.user; + + user.balance += 2.5; + + await user.save(); + + res.respond(200, {}); + }, +}; + +/** + * @api {post} /debug/add-hourglass Add Hourglass to the current user + * @apiVersion 3.0.0 + * @apiName AddHourglass + * @apiGroup Development + * + * @apiSuccess {} An empty Object + */ +api.addHourglass = { + method: 'POST', + url: '/debug/add-hourglass', + async handler (req, res) { + let user = res.locals.user; + + user.purchased.plan.consecutive.trinkets += 1; + + await user.save(); + + res.respond(200, {}); + }, +}; + +module.exports = api; diff --git a/website/src/libs/api-v3/setupRoutes.js b/website/src/libs/api-v3/setupRoutes.js index 99dca871a9..3b91b81f25 100644 --- a/website/src/libs/api-v3/setupRoutes.js +++ b/website/src/libs/api-v3/setupRoutes.js @@ -9,6 +9,7 @@ let router = express.Router(); // eslint-disable-line babel/new-cap // Wrapper function to handler `async` route handlers that return promises // It takes the async function, execute it and pass any error to next (args[2]) let _wrapAsyncFn = fn => (...args) => fn(...args).catch(args[2]); +let noop = (req, res, next) => next(); function walkControllers (filePath) { fs @@ -23,7 +24,9 @@ function walkControllers (filePath) { let {method, url, middlewares = [], handler} = action; method = method.toLowerCase(); - router[method](url, ...middlewares, _wrapAsyncFn(handler)); + let fn = handler ? _wrapAsyncFn(handler) : noop; + + router[method](url, ...middlewares, fn); }); } }); diff --git a/website/src/middlewares/api-v3/ensureDevelpmentMode.js b/website/src/middlewares/api-v3/ensureDevelpmentMode.js new file mode 100644 index 0000000000..98f70d33f5 --- /dev/null +++ b/website/src/middlewares/api-v3/ensureDevelpmentMode.js @@ -0,0 +1,12 @@ +import nconf from 'nconf'; +import { + NotFound, +} from '../../libs/api-v3/errors'; + +module.exports = function ensureDevelpmentMode (req, res, next) { + if (nconf.get('IS_PROD')) { + next(new NotFound()); + } else { + next(); + } +};