diff --git a/src/controllers/TripController.js b/src/controllers/TripController.js index 0c0bf91..7b72e08 100644 --- a/src/controllers/TripController.js +++ b/src/controllers/TripController.js @@ -4,6 +4,8 @@ import ControllerHelper from '../helpers/ControllerHelper'; import emailHelper from '../helpers/EmailHelper'; import TripService from '../services/TripService'; +const { availtripRequestsToManager } = TripService; + /** * @export * @class TripController @@ -109,6 +111,28 @@ class TripController { return Customize.errorMessage(req, res, err.message, 500); } } -} + /** + * Manager should be able to view requests for approvals + * @static + * @param {object} req request object + * @param {object} res response object + * @memberof TripController + * @returns {object} data + * @description PATCH api/v1/trips/requests + */ + static async getRequestsByManager(req, res) { + const { id } = req.user; + + try { + const result = await availtripRequestsToManager(id); + if (result.length === 0) { + return Customize.errorMessage(req, res, 'No trip requests are available for review', 404); + } + return Customize.successMessage(req, res, 'Requests fetched successfully', result, 200); + } catch (error) { + return Customize.errorMessage(req, res, 'Oops! internal server error', 500); + } + } +} export default TripController; diff --git a/src/database/migrations/20191115165558-create-user-profile.js b/src/database/migrations/20191115165558-create-user-profile.js index cad7777..e69071d 100644 --- a/src/database/migrations/20191115165558-create-user-profile.js +++ b/src/database/migrations/20191115165558-create-user-profile.js @@ -38,7 +38,7 @@ module.exports = { type: Sequelize.STRING }, managerId: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, }, bio: { type: Sequelize.STRING diff --git a/src/database/migrations/20191119091422-create-tripRequests.js b/src/database/migrations/20191119091422-create-tripRequests.js index 817ee62..6e30607 100644 --- a/src/database/migrations/20191119091422-create-tripRequests.js +++ b/src/database/migrations/20191119091422-create-tripRequests.js @@ -36,6 +36,7 @@ module.exports = { onUpdate: 'CASCADE', defaultValue: 1 , }, + createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/src/database/models/tripRequests.js b/src/database/models/tripRequests.js index 1f6e6ba..d3c62f6 100644 --- a/src/database/models/tripRequests.js +++ b/src/database/models/tripRequests.js @@ -23,7 +23,7 @@ module.exports = (sequelize, DataTypes) => { {onUpdate: 'cascade'}); tripRequests.hasMany( models.trips, - {foreignKey: 'id'}, + {targetKey: 'tripRequestId'}, { onDelete: 'cascade'}, {onUpdate: 'cascade'}); }; diff --git a/src/database/models/user.js b/src/database/models/user.js index c154614..4d10cc1 100644 --- a/src/database/models/user.js +++ b/src/database/models/user.js @@ -11,10 +11,15 @@ module.exports = (sequelize, DataTypes) => { }, {}); users.associate = function(models) { users.hasMany(models.tripRequests, - {foreignKey: 'id'}, + {targetKey: 'userId'}, { onDelete: 'cascade'}, {onUpdate: 'cascade'} ); + users.hasOne(models.userProfile, + {foreignKey: 'id'}, + { onDelete: 'cascade'}, + {onUpdate: 'cascade'} + ); }; return users; }; diff --git a/src/database/seeders/20191114145912-users.js b/src/database/seeders/20191114145912-users.js index 09b5431..2abbec3 100644 --- a/src/database/seeders/20191114145912-users.js +++ b/src/database/seeders/20191114145912-users.js @@ -8,7 +8,7 @@ module.exports = { lastName: 'Doe', email: 'demo@gmail.com', password: '$2b$10$Q9H0gYzslg.oIvqoiWBEfesJoe.HTQT0Ezg5itN/h0a5Mf9gxWWvq', - roleId: 3, + roleId: 6, isVerified: true, signupType:'default', createdAt: new Date(), @@ -21,6 +21,7 @@ module.exports = { password: '$2b$10$EVp9ow6OlwEldRIaXTdOB.sqG3zqyMUnOzNuAvaiVqzk6OvPcmSDC', signupType: 'Barefoot', isVerified: true, + roleId: 3, createdAt: new Date(), updatedAt: new Date() }, @@ -30,6 +31,18 @@ module.exports = { email: 'mytest@myemail.com', password: '$2b$10$EVp9ow6OlwEldRIaXTdOB.sqG3zqyMUnOzNuAvaiVqzk6OvPcmSDC', signupType: 'Barefoot', + roleId: 3, + isVerified: true, + createdAt: new Date(), + updatedAt: new Date() + }, + { + firstName: 'Mary', + lastName: 'Doe', + email: 'marydoe@gmail.com', + password: 'Merry@12345', + signupType: 'Barefoot', + roleId: 3, isVerified: true, createdAt: new Date(), updatedAt: new Date() diff --git a/src/database/seeders/20191114145913-user-profile.js b/src/database/seeders/20191114145913-user-profile.js index 2cb6021..3a87e12 100644 --- a/src/database/seeders/20191114145913-user-profile.js +++ b/src/database/seeders/20191114145913-user-profile.js @@ -9,7 +9,7 @@ module.exports = { address: null, imageURL:null, department: null, - managerId: null, + managerId: 5, bio: null, createdAt: new Date(), updatedAt: new Date() diff --git a/src/helpers/ControllerHelper.js b/src/helpers/ControllerHelper.js index 7d6767d..72ded3e 100644 --- a/src/helpers/ControllerHelper.js +++ b/src/helpers/ControllerHelper.js @@ -26,6 +26,7 @@ class ControllerHelper { const newTrip = await tripRequests.create({ userId, statusId: 1, tripTypeId }); + await tripRequests.findOne({ where: { userId } }); itinerary.forEach(async (item) => { await trips.create({ tripRequestId: newTrip.dataValues.id, @@ -33,7 +34,7 @@ class ControllerHelper { destinationId: item.destinationId, reason: item.reason, startDate: item.startDate, - returnDate: item.returnDate + returnDate: item.returnDate, }); }); emailHelper.approveEmailHelper(req, process.env.MANAGER_EMAIL); diff --git a/src/middlewares/Exists.js b/src/middlewares/Exists.js index 74168df..bad216c 100644 --- a/src/middlewares/Exists.js +++ b/src/middlewares/Exists.js @@ -1,6 +1,6 @@ import DataEngine from './DataEngine'; -import { tripRequests } from '../database/models'; - +import { tripRequests, userProfile } from '../database/models'; +import Customize from '../helpers/Customize'; /** * @export * @class Exists @@ -45,7 +45,27 @@ class Exists { 'The trip request doen\'t exist' ); } -} + /** + * check is the request exist + * @static + * @param {object} req request object + * @param {object} res response object + * @param {object} next next + * @memberof Exists + * @returns {object} data + */ + static async getLineManager(req, res, next) { + // const { managerId } = req.body; + const { id } = req.user; + const userIdProfile = await userProfile.findOne({ where: { userId: id } }); + if (!userIdProfile.managerId) { + return Customize.errorMessage(req, res, 'Please update your line manager', 404); + } + const { managerId } = userProfile; + req.body.managerId = managerId; + return next(); + } +} export default Exists; diff --git a/src/middlewares/TripMiddlewares.js b/src/middlewares/TripMiddlewares.js new file mode 100644 index 0000000..403f58b --- /dev/null +++ b/src/middlewares/TripMiddlewares.js @@ -0,0 +1,29 @@ +import { userProfile } from '../database/models'; +import Customize from '../helpers/Customize'; + +/** + * @export + * @class TripMiddleware + */ +class TripMiddleware { + /** + * Get line manager for trip requests + * @static + * @param {object} req request object + * @param {object} res response object + * @param {object} next next + * @memberof TripMiddleware + * @returns {object} data + */ + static async getLineManager(req, res, next) { + const { id } = req.user; + const userIdProfile = await userProfile.findOne({ where: { userId: id } }); + if (!userIdProfile.managerId) { + return Customize.errorMessage(req, res, 'Please update your line manager', 404); + } + const { managerId } = userProfile; + req.body.managerId = managerId; + return next(); + } +} +export default TripMiddleware; diff --git a/src/middlewares/Validate.js b/src/middlewares/Validate.js index 93dd066..1c6af49 100644 --- a/src/middlewares/Validate.js +++ b/src/middlewares/Validate.js @@ -108,20 +108,6 @@ class Validate { ]; } - /** - * Validate input - * @static - * @returns {object} errors - */ - static oneWayTripRules() { - return [ - check('originId', 'originId should be an integer').isNumeric(), - check('destinationId', 'destinationId should be an integer').isNumeric(), - check('reason', 'Reason should be a minimum of 2 letters').isString().isLength({ min: 2 }), - check('startDate', 'Start date should be a valid date after today(YY-MM-DD) ').isAfter().isISO8601(), - ]; - } - /** * Validate input * @static diff --git a/src/middlewares/ValidateTrip.js b/src/middlewares/ValidateTrip.js index 5fb18b9..549b27b 100644 --- a/src/middlewares/ValidateTrip.js +++ b/src/middlewares/ValidateTrip.js @@ -20,10 +20,9 @@ export default class ValidateTrip { const allCities = await cities.findAll({ attributes: ['id'], raw: true, }); const userCitiesArr = []; - - const AllCitiesArr = allCities.map((singleCity) => singleCity.id); - itinerary.forEach((singleCity) => userCitiesArr.push(singleCity.originId, singleCity.destinationId)); - + const AllCitiesArr = allCities.map(singleCity => singleCity.id); + itinerary + .forEach(singleCity => userCitiesArr.push(singleCity.originId, singleCity.destinationId)); const cityExist = userCitiesArr.every((val) => AllCitiesArr.indexOf(val) !== -1); if (!cityExist) { diff --git a/src/middlewares/isRoledifferent.js b/src/middlewares/isRoledifferent.js index dc6d109..7544ac0 100644 --- a/src/middlewares/isRoledifferent.js +++ b/src/middlewares/isRoledifferent.js @@ -7,7 +7,6 @@ const isRoledifferent = async (req, res, next) => { let status; if (existingEmail === assignEmail) { - status = 403; return Customize.errorMessage(req, res, 'you are not allowed to change your access', status); } diff --git a/src/routes/api/tripRoute.js b/src/routes/api/tripRoute.js index ef38980..66fd472 100644 --- a/src/routes/api/tripRoute.js +++ b/src/routes/api/tripRoute.js @@ -8,13 +8,32 @@ import Exists from '../../middlewares/Exists'; import Conflict from '../../middlewares/Conflict'; import isUserVerified from '../../middlewares/isUserVerified'; import { IsOwnerOfTrip, IsTripApproved } from '../../middlewares/findUsers'; +import TripMiddleware from '../../middlewares/TripMiddlewares'; +import VerifyUserRoles from '../../middlewares/VerifyUserRoles'; const tripRouter = express.Router(); const { verifyToken } = AuthenticateToken; -const { returnTripController, OneWayTripController, editTrip } = TripController; +const { + returnTripController, + OneWayTripController, + editTrip, + getRequestsByManager +} = TripController; const { isTripRequestFound } = Conflict; +const { getLineManager } = TripMiddleware; +tripRouter.post('/oneway', + verifyToken, + Validate.requestOnewayTripRules(), + checkInputDataError, + getLineManager, + ValidateTrip.checkIfOriginDestinationExists, + ValidateTrip.checkIfOriginSameAsDestination, + ValidateTrip.checkMultiCityForSimilarRequests, + ValidateTrip.checkForSimilarRequests, + ValidateTrip.checkForSimilarRequestsDateRange, + OneWayTripController); /** * @swagger @@ -70,7 +89,19 @@ tripRouter OneWayTripController ); - +tripRouter.post( + '/multicity', + AuthenticateToken.verifyToken, + Validate.requestMultiTripRules(), + checkInputDataError, + getLineManager, + ValidateTrip.checkIfOriginDestinationExists, + ValidateTrip.checkIfOriginSameAsDestination, + ValidateTrip.checkMultiCityForSimilarRequests, + ValidateTrip.checkForSimilarRequests, + ValidateTrip.checkForSimilarRequestsDateRange, + TripController.requestTrip +); /** * @swagger * @@ -178,6 +209,19 @@ tripRouter TripController.approveTrip ); +tripRouter + .post( + '/twoWay', + verifyToken, + Validate.twoWayTripRules(), + checkInputDataError, + ValidateTrip.checkIfOriginDestinationExists, + ValidateTrip.checkIfOriginSameAsDestination, + ValidateTrip.checkMultiCityForSimilarRequests, + ValidateTrip.checkForSimilarRequests, + ValidateTrip.checkForSimilarRequestsDateRange, + returnTripController + ); /** * @swagger @@ -251,6 +295,12 @@ tripRouter ValidateTrip.checkForSimilarRequestsDateRange, returnTripController ); +tripRouter.get( + '/requests', + verifyToken, + VerifyUserRoles.isManager, + getRequestsByManager +); /** * @swagger @@ -258,6 +308,9 @@ tripRouter * /trips/:id: * get: * summary: Available trip requests + * /trips/requests: + * get: + * summary: Available requests to manager for approval * tags: [Trip] * parameters: * - name: token diff --git a/src/services/TripService.js b/src/services/TripService.js index ad7e092..d18a745 100644 --- a/src/services/TripService.js +++ b/src/services/TripService.js @@ -1,4 +1,6 @@ -import { tripRequests, trips } from '../database/models'; +import { + tripRequests, trips, userProfile, users +} from '../database/models'; import CommonQueries from './CommonQueries'; /** @@ -36,7 +38,6 @@ class TripService { const getTripsIds = await CommonQueries.findAll(trips, findAllObjQuery); await CommonQueries.update(tripRequests, updateStatusQuery); - itinerary.forEach(async (item, index) => { const tripId = getTripsIds[index].dataValues.id; await trips.update( @@ -54,6 +55,39 @@ class TripService { }); return itinerary; } + + /** + * Manager should be able to view approvals + * @static + * @param {object}id object + * @memberof TripService + * @returns {object} trip requests of requesters that report to manager + */ + static async availtripRequestsToManager(id) { + return userProfile.findAll({ + where: { managerId: id }, + attributes: ['id', 'userId'], + include: [ + { + model: users, + attributes: ['id', 'firstName', 'lastName'], + as: 'user', + include: [ + { + model: tripRequests, + where: { statusId: 1 }, + attributes: ['id', 'tripTypeId', 'statusId'], + include: [ + { + model: trips + } + ] + } + ], + } + ], + }); + } } export default TripService; diff --git a/src/tests/010-userTest.js b/src/tests/010-userTest.js index 6258f8a..09330eb 100644 --- a/src/tests/010-userTest.js +++ b/src/tests/010-userTest.js @@ -27,7 +27,7 @@ describe('Authentication test', () => { }); }); it('Test verify email route', (done) => { - chai.request(app).get(`/api/v1/auth/verify-email/7/${token}`).end((err, res) => { + chai.request(app).get(`/api/v1/auth/verify-email/8/${token}`).end((err, res) => { res.should.have.status(200); res.body.should.be.an('object'); done(); @@ -223,7 +223,7 @@ describe('User profile page settings', () => { done(err); }); }); - it('it should not update user profile with invalid image', (done) => { + it('it should not update user profile with invalid filed', (done) => { chai.request(app) .put('/api/v1/users/profile-settings') .set('token', unverifiedUserToken) @@ -245,10 +245,10 @@ describe('User profile page settings', () => { done(err); }); }); - it('it should update user profile successfully', (done) => { + it('it should not update profile of unidentified user', (done) => { chai.request(app) .put('/api/v1/users/profile-settings') - .set('token', verifiedUserToken) + .set('token', token) .send(unknownUserUpdate) .end((err, res) => { expect(res.status).eql(200); @@ -309,3 +309,4 @@ describe('User profile page settings', () => { }); }); }); + diff --git a/src/tests/050-returnTripTests.js b/src/tests/050-returnTripTests.js index d8fe507..d3e9b87 100644 --- a/src/tests/050-returnTripTests.js +++ b/src/tests/050-returnTripTests.js @@ -1,35 +1,28 @@ import chai from 'chai'; import chaiHttp from 'chai-http'; +import dotenv from 'dotenv'; import app from '../index'; -import mockData from './mock/tripMockData'; -import MockData from './mock/mockData'; - +import tripMockData from './mock/tripMockData'; +import mockData from './mock/mockData'; chai.use(chaiHttp); +chai.should(); const { expect } = chai; +dotenv.config(); + let token; -describe('Return Trip Route Tests', () => { + + +describe('Return trip tests', () => { before((done) => { chai.request(app) .post('/api/v1/auth/signin') - .send(MockData.usersSignin) + .send(mockData.usersSignin) .end((err, res) => { token = res.body.data; - res.should.have.status(200); - done(); - }); - }); - it('it should create a new trip ', (done) => { - chai.request(app) - .post('/api/v1/trips/twoWay') - .send(mockData.correctTrip) - .set('token', token) - .end((err, res) => { - expect(res.status).to.equal(201); - expect(res.body).to.be.a('object'); - done(err); + done(); }); }); @@ -44,7 +37,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if destinationId does not follow the correct format', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -56,7 +48,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if reason does not follow the correct format', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -68,7 +59,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if tripTypeId does not follow the correct format', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -80,7 +70,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if startDate does not follow the correct format', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -92,7 +81,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if returnDate does not follow the correct format', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -104,7 +92,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if startDate is in the past', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -116,7 +103,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if tripTypeId does not exist', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -128,7 +114,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if originId is missing', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -140,11 +125,21 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - + it('it should create a return trip', (done) => { + chai.request(app) + .post('/api/v1/trips/twoWay') + .send(tripMockData.correctTrip) + .set('token', token) + .end((err, res) => { + expect(res.status).to.equal(201); + expect(res.body).to.be.a('object'); + done(err); + }); + }); it('it should not create a trip if trip exists', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') - .send(mockData.correctTrip) + .send(tripMockData.correctTrip) .set('token', token) .end((err, res) => { expect(res.status).to.equal(409); @@ -152,19 +147,17 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if token is invalid', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') - .send(mockData.correctTrip) - .set('token', mockData.wrongToken) + .set('token', tripMockData.wrongToken) + .send(tripMockData.correctTrip) .end((err, res) => { expect(res.status).to.equal(401); expect(res.body).to.be.a('object'); done(err); }); }); - it('it should not create a trip if token is missing', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') @@ -175,7 +168,6 @@ describe('Return Trip Route Tests', () => { done(err); }); }); - it('it should not create a trip if the return date is after the start date', (done) => { chai.request(app) .post('/api/v1/trips/twoWay') diff --git a/src/tests/060-tripTest.js b/src/tests/060-tripTest.js index 2170399..fb35478 100644 --- a/src/tests/060-tripTest.js +++ b/src/tests/060-tripTest.js @@ -11,7 +11,7 @@ chai.should(); dotenv.config(); const { expect } = chai; let token; -let unverifiedUserToken; +let unverifiedUserToken, managerToken, wrongManagerToken; describe('Request One way trip test', () => { @@ -25,6 +25,29 @@ describe('Request One way trip test', () => { done(); }); }); + before((done) => { + chai.request(app) + .post('/api/v1/auth/signin') + .send(mockData.usersSignin) + .end((err, res) => { + token = res.body.data; + + done(); + }); + chai.request(app) + .post('/api/v1/auth/signin') + .send(mockData.isManager) + .end((err, res) => { + managerToken = res.body.data; + }); + + chai.request(app) + .post('/api/v1/auth/signin') + .send(mockData.wrongManager) + .end((err, res) => { + wrongManagerToken = res.body.data; + }); + }); it('should be able to create one way trip', (done) => { chai.request(app).post('/api/v1/trips/oneway').send(tripMockData.correctOneWayTrip) .set('token', token) @@ -269,8 +292,8 @@ describe('Users should be able to edit trips', () => { before((done) => { chai.request(app) .post('/api/v1/trips/multicity') - .set('token', mockData.superAdminToken) - .send(tripMockData.multiCityData) + .set('token', token) + .send(tripMockData.newMultiCityData) .end((err, res) => { tripRequestMulticityId = res.body.data; done(); @@ -280,7 +303,7 @@ describe('Users should be able to edit trips', () => { before((done) => { chai.request(app) .post('/api/v1/trips/oneway') - .set('token', mockData.superAdminToken) + .set('token', token) .send(tripMockData.newOneWayTrip) .end((err, res) => { tripRequestOneWayId = res.body.data; @@ -291,7 +314,7 @@ describe('Users should be able to edit trips', () => { it('User should be able to re-send the same multitrip', (done) => { chai.request(app) .put(`/api/v1/trips/edit/${tripRequestMulticityId.id}`) - .set('token', mockData.superAdminToken) + .set('token', token) .send(tripMockData.multiCityData) .end((err, res) => { res.body.should.have.property('message', 'Trip edited successfuly'); @@ -305,7 +328,7 @@ describe('Users should be able to edit trips', () => { it('User should edit multi city', (done) => { chai.request(app) .put(`/api/v1/trips/edit/${tripRequestMulticityId.id}`) - .set('token', mockData.superAdminToken) + .set('token', token) .send(tripMockData.newMultiCityData) .end((err, res) => { res.body.should.have.property('message', 'Trip edited successfuly'); @@ -319,7 +342,7 @@ describe('Users should be able to edit trips', () => { it('User should edit one way', (done) => { chai.request(app) .put(`/api/v1/trips/edit/${tripRequestOneWayId.id}`) - .set('token', mockData.superAdminToken) + .set('token', token) .send(tripMockData.editNewOneWay) .end((err, res) => { res.should.have.status(200); @@ -333,7 +356,7 @@ describe('Users should be able to edit trips', () => { it('User should not edit and send the same city', (done) => { chai.request(app) .put(`/api/v1/trips/edit/${tripRequestMulticityId.id}`) - .set('token', mockData.superAdminToken) + .set('token', token) .send(tripMockData.multiCitySameCitiesData) .end((err, res) => { res.should.have.status(400); @@ -342,4 +365,38 @@ describe('Users should be able to edit trips', () => { done(); }); }); + + + it('Should not avail requests for approval if not a manager', (done) => { + chai.request(app) + .get('/api/v1/trips/requests') + .set('token', token) + .end((err, res) => { + res.should.have.status(403); + res.body.should.be.an('object'); + done(); + }); + }); + + it('Should not avail requests for empty trip requests', (done) => { + chai.request(app) + .get('/api/v1/trips/requests') + .set('token', wrongManagerToken) + .end((err, res) => { + res.should.have.status(404); + res.body.should.be.an('object'); + done(); + }); + }); + + it('Should avail requests for approval if he/she reports that specific manager', (done) => { + chai.request(app) + .get('/api/v1/trips/requests') + .set('token', managerToken) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.an('object'); + done(); + }); + }); }); diff --git a/src/tests/080-commentTest.js b/src/tests/080-commentTest.js index 693f84b..9abe651 100644 --- a/src/tests/080-commentTest.js +++ b/src/tests/080-commentTest.js @@ -5,14 +5,25 @@ import tripMockData from './mock/tripMockData'; const { expect } = chai; -let trueToken, userToken, superToken, tripId; + +let userToken, superToken, tripId, managerToken; describe('User/manager should be able to post/get comments', () => { before((done) => { chai.request(app) .post('/api/v1/auth/signin') - .send(mockData.user2) + .send(mockData.isManager) .end((err, res) => { - trueToken = res.body.data; + managerToken = res.body.data; + done(err); + }); + }); + before((done) => { + chai.request(app) + .post('/api/v1/auth/signin') + .send(mockData.testUser) + .end((err, res) => { + userToken = res.body.data; + done(err); }); }); @@ -27,27 +38,28 @@ describe('User/manager should be able to post/get comments', () => { }); before((done) => { chai.request(app) - .post('/api/v1/trips/oneway') - .set('token', superToken) - .send(tripMockData.oneWaytrip) - .end((err, res) => { - tripId = res.body.data.id; + .put('/api/v1/users/profile-settings') + .set('token', userToken) + .send(mockData.unknownUserUpdate) + .end((err) => { done(err); }); }); before((done) => { chai.request(app) - .post('/api/v1/auth/signin') - .send(mockData.user1) + .post('/api/v1/trips/oneway') + .set('token', userToken) + .send(tripMockData.oneWaytrip) .end((err, res) => { - userToken = res.body.data; + tripId = res.body.data.id; done(err); }); }); + it('It should post a comment successfully', (done) => { chai.request(app) .post('/api/v1/trips/1/comment') - .set('token', trueToken) + .set('token', managerToken) .send(mockData.userComment) .end((err, res) => { expect(res.status).eql(201); @@ -59,7 +71,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should not post empty comment', (done) => { chai.request(app) .post('/api/v1/trips/1/comment') - .set('token', trueToken) + .set('token', managerToken) .end((err, res) => { expect(res.status).eql(400); expect(res.body.message[0]).eql('Comment should be of at least two characters'); @@ -69,7 +81,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should not post empty comment unless the commenter is requester/manager', (done) => { chai.request(app) .post('/api/v1/trips/1/comment') - .set('token', userToken) + .set('token', superToken) .send(mockData.userComment) .end((err, res) => { expect(res.status).eql(403); @@ -80,7 +92,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should not post comment with invalid trip Id', (done) => { chai.request(app) .post('/api/v1/trips/d/comment') - .set('token', trueToken) + .set('token', managerToken) .send(mockData.userComment) .end((err, res) => { expect(res.status).eql(400); @@ -91,7 +103,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should get comments of a specific trip successfully', (done) => { chai.request(app) .get('/api/v1/trips/1/comments') - .set('token', trueToken) + .set('token', managerToken) .end((err, res) => { expect(res.status).eql(200); expect(res.body.message).eql('All comments about this trip request have been retrieved successfuly!'); @@ -101,7 +113,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should get 0 comments of a specific trip', (done) => { chai.request(app) .get(`/api/v1/trips/${tripId}/comments`) - .set('token', superToken) + .set('token', userToken) .end((err, res) => { expect(res.status).eql(200); expect(res.body.message).eql('No comments for this trip yet!'); @@ -111,7 +123,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should not get comment unless the commenter is requester/manager', (done) => { chai.request(app) .get(`/api/v1/trips/${tripId}/comments`) - .set('token', userToken) + .set('token', superToken) .end((err, res) => { expect(res.status).eql(403); expect(res.body.message).eql('You should be either a requester or a manager'); @@ -121,7 +133,7 @@ describe('User/manager should be able to post/get comments', () => { it('It should not get comment with invalid trip Id', (done) => { chai.request(app) .get('/api/v1/trips/d/comments') - .set('token', trueToken) + .set('token', managerToken) .send(mockData.userComment) .end((err, res) => { expect(res.status).eql(400); diff --git a/src/tests/mock/mockData.js b/src/tests/mock/mockData.js index 68b8f11..26f4e96 100644 --- a/src/tests/mock/mockData.js +++ b/src/tests/mock/mockData.js @@ -3,7 +3,7 @@ import AuthenticateToken from '../../helpers/AuthenticateToken'; dotenv.config(); -const { passwordEnv } = process.env; +const { passwordEnv, passwordEnv1 } = process.env; const mockData = { users: { @@ -42,12 +42,24 @@ const mockData = { password: passwordEnv, signupType: 'Barefoot', isVerified: false - }, usersSignin: { email: 'jamson@gmail.com', password: passwordEnv, }, + testUser: { + email: 'test@email.com', + password: 'admin1224', + }, + isManager: { + email: 'manager.email@gmail.com', + password: 'admin1234', + }, + + wrongManager: { + email: 'demo@gmail.com', + password: 'barefoot@Nomad123', + }, userCorrectInfo: { email: 'demo@demo.com', password: 'barefoot@Nomad123', @@ -171,7 +183,7 @@ const mockData = { address: 'Kigali', imageURL: '/images/avatar.jpg', department: 'IT', - managerId: 5, + managerId: 6, bio: 'I have been a christian since 2014, Christ as my savior' }, invalidManager: { @@ -200,7 +212,7 @@ const mockData = { lastName: 'admin', roleId: 1, email: 'admin@gmail.com', - password: passwordEnv + password: passwordEnv1 }), userComment: { comment: 'Everyone in the company should request for this trip' } diff --git a/src/tests/mock/tripMockData.js b/src/tests/mock/tripMockData.js index dccd98c..fa8ffc0 100644 --- a/src/tests/mock/tripMockData.js +++ b/src/tests/mock/tripMockData.js @@ -7,6 +7,10 @@ const tripMockData = { id: 1, email: 'demo@gmail.com' }, + signInAUser: { + email: 'marydoe@gmail.com', + password: 'Merry@12345' + }, wrongOriginIdFormat: { originId: 'asdfgt', destinationId: 2,