From e73b5fad335953e411f4f746ed84b08d6321a26d Mon Sep 17 00:00:00 2001 From: Gwynn DP Date: Sat, 5 Feb 2022 10:50:52 -0800 Subject: [PATCH] fix: incomplete test fixes --- __tests__/api-tests/seed-data-creation.js | 1 + __tests__/api-tests/stakeholder-api.spec.js | 92 ++++++++++----------- server/app.js | 5 +- server/models/Stakeholder.spec.js | 53 ++++++++---- server/routes.js | 57 ++++++++++--- server/utils/utils.js | 4 +- 6 files changed, 127 insertions(+), 85 deletions(-) diff --git a/__tests__/api-tests/seed-data-creation.js b/__tests__/api-tests/seed-data-creation.js index b271e90..9b92ce6 100644 --- a/__tests__/api-tests/seed-data-creation.js +++ b/__tests__/api-tests/seed-data-creation.js @@ -22,6 +22,7 @@ const stakeholderOne = Object.freeze({ owner_id: uuid(), organization_id: 5000000, }); + const stakeholderTwo = Object.freeze({ id: uuid(), type: 'type', diff --git a/__tests__/api-tests/stakeholder-api.spec.js b/__tests__/api-tests/stakeholder-api.spec.js index 25ba9b0..2bf2112 100644 --- a/__tests__/api-tests/stakeholder-api.spec.js +++ b/__tests__/api-tests/stakeholder-api.spec.js @@ -4,17 +4,18 @@ const { expect } = require('chai'); const server = require('../../server/app'); const { stakeholderOne, stakeholderTwo } = require('./seed-data-creation'); -describe.skip('Stakeholder API tests.', () => { +describe('Stakeholder API tests.', () => { describe('Stakeholder GET', () => { it(`Should raise validation error with error code 422 -- 'limit' query parameter should be an integer `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ limit: 8.965, }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { + console.log('res.body.message ----------> ', res.body, err); expect(res.body.message).to.eql('"limit" must be an integer'); if (err) return done(err); return done(); @@ -23,13 +24,14 @@ describe.skip('Stakeholder API tests.', () => { it(`Should raise validation error with error code 422 -- 'limit' query parameter should be greater than 0 `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ limit: 0, }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { + console.log('res.body.message ----------> ', res.body); expect(res.body.message).to.eql('"limit" must be greater than 0'); if (err) return done(err); return done(); @@ -38,13 +40,14 @@ describe.skip('Stakeholder API tests.', () => { it(`Should raise validation error with error code 422 -- 'limit' query parameter should be less than 101 `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ limit: 101, }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { + console.log('res.body.message ----------> ', res.body); expect(res.body.message).to.eql('"limit" must be less than 101'); if (err) return done(err); return done(); @@ -53,13 +56,14 @@ describe.skip('Stakeholder API tests.', () => { it(`Should raise validation error with error code 422 -- 'offset' query parameter should be an integer `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ offset: 4.45, }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { + console.log('res.body.message ----------> ', res.body); expect(res.body.message).to.eql('"offset" must be an integer'); if (err) return done(err); return done(); @@ -68,46 +72,49 @@ describe.skip('Stakeholder API tests.', () => { it(`Should raise validation error with error code 422 -- 'offset' query parameter should be at least 0 `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ offset: -1, }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { + console.log('res.body.message ----------> ', res.body); expect(res.body.message).to.eql('"offset" must be greater than -1'); if (err) return done(err); return done(); }); }); - it(`Should raise validation error with error code 422 -- 'stakeholder_uuid' should be a uuid `, function (done) { + it(`Should raise validation error with error code 422 -- 'id' should be a uuid `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ - stakeholder_uuid: 'stakeholder_uuid', + id: 'stakeholder_uuid', }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { + console.log('res.body.message ----------> ', res.body); expect(res.body.message).to.eql( - '"stakeholder_uuid" must be a valid GUID', + '"id" must be a valid GUID', ); if (err) return done(err); return done(); }); }); - it(`Should raise validation error with error code 422 -- 'id' query parameter should be an integer `, function (done) { + it(`Should raise validation error with error code 422 -- 'owner_id' query parameter should be a valid uuid `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ - id: 8.965, + owner_id: 8.965, }) .set('Accept', 'application/json') .expect(422) .end(function (err, res) { - expect(res.body.message).to.eql('"id" must be an integer'); + console.log('res.body.message ----------> ', res.body); + expect(res.body.message).to.eql('"owner_id" must be a valid GUID'); if (err) return done(err); return done(); }); @@ -115,7 +122,7 @@ describe.skip('Stakeholder API tests.', () => { it(`Should raise validation error with error code 422 -- 'organization_id' query parameter should be an integer `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ organization_id: 8.965, }) @@ -132,8 +139,8 @@ describe.skip('Stakeholder API tests.', () => { it(`Should get stakeholder successfully -- with limit `, function (done) { request(server) - .get(`/`) - .query({ limit: 2 }) + .get(`/stakeholders`) + .query({ limit: 2, first_name: 'first_name' }) .set('Accept', 'application/json') .expect(200) .end(function (err, res) { @@ -156,17 +163,20 @@ describe.skip('Stakeholder API tests.', () => { 'last_name', 'email', 'phone', - // 'pwd_reset_required', + 'pwd_reset_required', 'website', - // 'wallet', - // 'password', - // 'salt', - // 'active_contract_id', - // 'offering_pay_to_plant', - // 'tree_validation_contract_id', + 'wallet', + 'password', + 'salt', + 'active_contract_id', + 'offering_pay_to_plant', + 'tree_validation_contract_id', 'logo_url', 'map', - 'stakeholder_uuid', + 'organization_id', + 'owner_id', + 'children', + 'parents' ]); } @@ -174,31 +184,9 @@ describe.skip('Stakeholder API tests.', () => { }); }); - it(`Should get stakeholder successfully -- with query stakeholder_uuid `, function (done) { - request(server) - .get(`/`) - .query({ stakeholder_uuid: stakeholderTwo.stakeholder_uuid }) - .set('Accept', 'application/json') - .expect(200) - .end(function (err, res) { - if (err) return done(err); - expect(res.body).to.have.keys([ - 'stakeholders', - 'links', - 'totalCount', - ]); - expect(res.body.links).to.have.keys(['prev', 'next']); - expect(res.body.links.prev).to.eq(null); - expect(res.body.totalCount).to.eq(1); - expect(res.body.stakeholders[0]).to.eql({ ...stakeholderTwo }); - expect(res.body.stakeholders).to.have.lengthOf(1); - return done(); - }); - }); - it(`Should get stakeholder successfully -- with query id `, function (done) { request(server) - .get(`/`) + .get(`/stakeholders`) .query({ id: stakeholderOne.id }) .set('Accept', 'application/json') .expect(200) @@ -212,8 +200,12 @@ describe.skip('Stakeholder API tests.', () => { expect(res.body.links).to.have.keys(['prev', 'next']); expect(res.body.links.prev).to.eq(null); expect(res.body.totalCount).to.eq(1); - expect(res.body.stakeholders[0]).to.eql({ ...stakeholderOne }); - expect(res.body.stakeholders).to.have.lengthOf(1); + expect(res.body.stakeholders[0]).to.eql({ + ...stakeholderOne, + children: [], + parents: [], + }); + expect(res.body.stakeholders).to.have.length(1); return done(); }); }); diff --git a/server/app.js b/server/app.js index 88d6443..b44d57b 100644 --- a/server/app.js +++ b/server/app.js @@ -4,8 +4,7 @@ const cors = require('cors'); const log = require('loglevel'); const HttpError = require('./utils/HttpError'); const { sentryDSN } = require('../config/config'); -const { errorHandler } = require('./utils/utils'); -const helper = require('./utils/utils'); +const { handlerWrapper, errorHandler } = require('./utils/utils'); const router = require('./routes'); const app = express(); @@ -21,7 +20,7 @@ Sentry.init({ dsn: sentryDSN }); * Check request */ app.use( - helper.handlerWrapper(async (req, _res, next) => { + handlerWrapper(async (req, _res, next) => { if ( req.method === 'POST' || req.method === 'PATCH' || diff --git a/server/models/Stakeholder.spec.js b/server/models/Stakeholder.spec.js index 984bf39..7ec3103 100644 --- a/server/models/Stakeholder.spec.js +++ b/server/models/Stakeholder.spec.js @@ -61,24 +61,33 @@ describe('Stakeholder Model', () => { describe('getAllStakeholders', () => { it('should get stakeholders with filter --id', async () => { - const getFilterById = sinon.mock(); + const getFilter = sinon.mock(); + const getParents = sinon.mock(); + const getChildren = sinon.mock(); const getStakeholderByOrganizationId = sinon.mock(); const executeGetStakeholders = getAllStakeholders({ - getFilterById, - getStakeholderByOrganizationId, + getFilter, + getParents, + getChildren, }); - getFilterById.resolves({ count: 1, stakeholders: [{ id: 1 }] }); - const result = await executeGetStakeholders({ - filter: { - where: { id: 1 }, + getFilter.resolves({ count: 1, stakeholders: [{ id: 1 }] }); + getParents.resolves([]); + getChildren.resolves([]); + const result = await executeGetStakeholders( + { + filter: { + where: { id: 1 }, + }, }, - }); + '/stakeholder', + ); expect( - getFilterById.calledWith(1, { + getFilter.calledWith(1, { filter: 100, offset: 0, }), ); + sinon.assert.notCalled(getStakeholderByOrganizationId); expect(result.stakeholders).to.have.length(1); expect(result.totalCount).to.eql(1); @@ -87,25 +96,33 @@ describe('Stakeholder Model', () => { it('should get stakeholders with filter --organization_id', async () => { const getStakeholderByOrganizationId = sinon.mock(); - const getFilterById = sinon.mock(); + const getFilter = sinon.mock(); + const getParents = sinon.mock(); + const getChildren = sinon.mock(); const executeGetStakeholders = getAllStakeholders({ + getFilter, + getParents, + getChildren, getStakeholderByOrganizationId, - getFilterById, }); + getFilter.resolves({ count: 1, stakeholders: [{ id: 1 }] }); + getParents.resolves([]); + getChildren.resolves([]); getStakeholderByOrganizationId.resolves({ totalCount: 1, stakeholders: [{ id: 1 }], links: {}, }); - getFilterById.resolves({ count: 1, stakeholders: [{ id: 1 }] }); - - const result = await executeGetStakeholders({ - filter: { - where: { organization_id: 1 }, + const result = await executeGetStakeholders( + { + filter: { + where: { organization_id: 1 }, + }, }, - }); + '/stakeholder', + ); expect( getStakeholderByOrganizationId.calledWith(1, { @@ -114,7 +131,7 @@ describe('Stakeholder Model', () => { }), ); expect( - getFilterById.calledWith(1, { + getFilter.calledWith(1, { filter: 100, offset: 0, }), diff --git a/server/routes.js b/server/routes.js index c482a9a..27869a7 100644 --- a/server/routes.js +++ b/server/routes.js @@ -1,8 +1,39 @@ const router = require('express').Router(); -// const log = require('loglevel'); -// const validateRequest = (req, res, next) => { -// next(); -// }; +const uuid = require('uuid'); +const log = require('loglevel'); + +const validateRequest = (req, res, next) => { + console.log('QUERY -------> ', req.query); + + if(req.query.limit && !Number.isInteger(+req.query.limit)) { + // throw new Error('"limit" must be an integer'); + next({ status: 422, message: '"limit" must be an integer' }); + } + if (req.query.limit && +req.query.limit < 1) { + next({ status: 422, message: '"limit" must be greater than 0' }); + } + if (req.query.limit && +req.query.limit > 100) { + next({ status: 422, message: '"limit" must be less than 101' }); + } + if (req.query.offset && !Number.isInteger(+req.query.offset)) { + next({ status: 422, message: '"offset" must be an integer' }); + } + if (req.query.offset && +req.query.offset < 0) { + next({ status: 422, message: '"offset" must be greater than -1' }); + } + if (req.query.id && !uuid.validate(req.query.id)) { + next({ status: 422, message: '"id" must be a valid GUID' }); + } + if (req.query.owner_id && !uuid.validate(req.query.owner_id)) { + next({ status: 422, message: '"id" must be a valid GUID' }); + } + if(req.query.organization_id && !Number.isInteger(+req.query.organization_id)) { + next({ status: 422, message: '"organization_id" must be an integer' }); + } + + next(); +}; + const { stakeholderGetAllById, stakeholderGetAll, @@ -16,20 +47,20 @@ const { handlerWrapper } = require('./utils/utils'); router .route('/stakeholders/relations/:id') - .get(handlerWrapper(stakeholderGetRelations)) - .post(handlerWrapper(stakeholderCreateRelation)) - .delete(handlerWrapper(stakeholderDeleteRelation)); + .get(validateRequest, handlerWrapper(stakeholderGetRelations)) + .post(validateRequest, handlerWrapper(stakeholderCreateRelation)) + .delete(validateRequest, handlerWrapper(stakeholderDeleteRelation)); router .route('/stakeholders/:id') - .get(handlerWrapper(stakeholderGetAllById)) - .post(handlerWrapper(stakeholderCreate)) - .patch(handlerWrapper(stakeholderUpdate)); + .get(validateRequest, handlerWrapper(stakeholderGetAllById)) + .post(validateRequest, handlerWrapper(stakeholderCreate)) + .patch(validateRequest, handlerWrapper(stakeholderUpdate)); router .route('/stakeholders') - .get(handlerWrapper(stakeholderGetAll)) - .post(handlerWrapper(stakeholderCreate)) - .patch(handlerWrapper(stakeholderUpdate)); + .get(validateRequest, handlerWrapper(stakeholderGetAll)) + .post(validateRequest, handlerWrapper(stakeholderCreate)) + .patch(validateRequest, handlerWrapper(stakeholderUpdate)); module.exports = router; diff --git a/server/utils/utils.js b/server/utils/utils.js index bb19a27..912851b 100644 --- a/server/utils/utils.js +++ b/server/utils/utils.js @@ -27,13 +27,15 @@ exports.handlerWrapper = (fn) => function wrap(...args) { const fnReturn = fn(...args); const next = args[args.length - 1]; + log.debug('handlerWrapper args:', args); return Promise.resolve(fnReturn).catch((e) => { + log.debug('handlerWrapper error:', e); next(e); }); }; exports.errorHandler = (err, req, res) => { - log.debug('catch error:', err); + log.debug('errorHandler error:', err); if (err instanceof HttpError) { res.status(err.code).send({ code: err.code,