Skip to content

Commit

Permalink
chore(improve test coverage): improves the test coverage [Finishes 16…
Browse files Browse the repository at this point in the history
…7815352]
  • Loading branch information
habinezadalvan committed Aug 10, 2019
1 parent dc1dba9 commit feafe4c
Show file tree
Hide file tree
Showing 8 changed files with 242 additions and 45 deletions.
13 changes: 10 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
"undoseeds": "babel-node node_modules/.bin/sequelize db:seed:undo",
"migration": "babel-node node_modules/.bin/sequelize db:migrate",
"undomigration": "export NODE_ENV=test && npm run undoseeds && babel-node node_modules/.bin/sequelize db:migrate:undo:all",
"dev": "npm run migration && npm run seeds && nodemon --exec babel-node ./src/app.js",
"test": "export NODE_ENV=test && npm run undomigration && npm run migration && npm run seeds && nyc mocha ./test --recurssive --no-timeout --exit --require @babel/register",
"coveralls": "nyc report --reporter=text-lcov | coveralls"
"coveralls": "nyc report --reporter=text-lcov | coveralls",
"test": "export NODE_ENV=test && npm run undomigration && npm run migration && npm run seeds && nyc --reporter=html --reporter=text mocha ./test --no-timeout --exit --require @babel/register",
"dev": "npm run undoseeds && npm run seeds && nodemon --exec babel-node ./src/app.js"

},
"author": "Andela Simulations Programme",
"license": "MIT",
Expand Down Expand Up @@ -68,5 +69,11 @@
"chai": "^4.2.0",
"chai-http": "^4.3.0",
"mocha": "^6.2.0"
},
"nyc": {
"exclude": [
"src/middlewares/error.middleware.js ",
"src/models/index.js"
]
}
}
73 changes: 44 additions & 29 deletions src/controllers/user.controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import UserService from '../services/user.service';
import Helper from '../helpers/helper';
import verifyUser from '../helpers/verification-email';
import sendEmail from '../helpers/verification-email';

/**
*
Expand Down Expand Up @@ -75,15 +75,21 @@ class UserController {
* @memberof UserController
*/
static async createAdmin(req, res) {
const newUser = req.body;
newUser.email = req.body.email.toLowerCase();
try {
const theUser = await UserService.findOne(req.body.email, '');
const theUserName = await UserService.findOne('', req.body.username);
if (theUser || theUserName) {
return res.status(404).send({
if (theUser) {
return res.status(409).send({
status: 409,
message: `Cannot register admin with an email ${req.body.email} which is already in use.`
});
}
if (theUserName) {
return res.status(409).send({
status: 409,
message: `Cannot register admin with the ${req.body.email} which is already in use`
message: `Cannot register admin with the username ${
req.body.username
} which is already in use.`
});
}
const hashPassword = await Helper.hashPassword(req.body.password);
Expand All @@ -93,32 +99,41 @@ class UserController {
message: 'occur error while hashing'
});
}
req.body.password = hashPassword;
const createdUser = await UserService.addUser(newUser);
const {
firstname, lastname, username, email
} = createdUser;
firstname, lastname, email, role, username
} = req.body;
const newUser = {
firstname,
lastname,
email: email.toLowerCase(),
password: hashPassword,
role,
username
};
const createdUser = await UserService.addUser(newUser);
const payload = {
email: newUser.email,
role: newUser.role,
verified: newUser.verified
email: createdUser.email,
role: createdUser.role,
verified: createdUser.verified
};
const token = await Helper.generateToken(payload);
const verifyUrl = `${process.env.BACKEND_URL}/api/${
process.env.API_VERSION
}/users/verify?token=${token}`;
verifyUser(payload.email, username, verifyUrl);
return res.status(201).json({
status: 201,
message: 'successfully created account ',
data: {
firstname,
lastname,
username,
email
},
token
});
const verifyUrl = `${process.env.BACKEND_URL}/api/${process.env.API_VERSION}/users/verify?
token=${token}`;
const verify = sendEmail(payload.email, username, verifyUrl);

return verify
? res.status(201).json({
status: 201,
message: 'successfully created account ',
data: {
firstname,
lastname,
username,
email
},
token
})
: 'No verified';
} catch (error) {
const { errors } = error;
return res.status(404).send({
Expand Down Expand Up @@ -167,7 +182,7 @@ class UserController {
const verifyUrl = `${process.env.BACKEND_URL}/api/${
process.env.API_VERSION
}/users/verify?token=${token}`;
verifyUser(payload.email, newUser.username, verifyUrl);
sendEmail(payload.email, newUser.username, verifyUrl);
return res.status(201).json({
status: 201,
message:
Expand Down
1 change: 1 addition & 0 deletions src/helpers/verification-email.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const sendEmail = (email, username, url) => {
</div>`,
};
sgMail.send(msg);
return true;
};

export default sendEmail;
5 changes: 0 additions & 5 deletions src/routes/api/user/user.route.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@ import verifyEmail from '../../../controllers/verify-controller';
import confirmEmaiAuth from '../../../middlewares/emailVarification.middleware';

const router = express.Router();

router.post('/signin', (req, res) => {
const { firstname, lastname } = req.body;
return res.status(200).json({ status: 200, data: { firstname, lastname } });
});
router.get('/verify', verifyEmail);
router.get('/allusers', [validateToken, admin, confirmEmaiAuth], UserController.getAllUsers);
router.post('/signup', validateUser, UserController.signup);
Expand Down
53 changes: 53 additions & 0 deletions test/test-validation.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { chai, server, expect } from './test-setup';


describe('test register user validations', () => {
it('test for valid inputs', (done) => {
chai.request(server)
Expand Down Expand Up @@ -266,4 +267,56 @@ describe('test register user validations', () => {
done();
});
});
it('No password specified', (done) => {
chai.request(server)
.post('/api/v1/users/signup')
.send({
firstname: 'Noah',
lastname: 'name',
email: 'noah.kalyesubula@andela.com',
username: 'knoah',
password: ''
})
.end((error, res) => {
expect(res.status).to.equal(400);
expect(res.body).to.be.an('object');
expect(res.body).to.have.property('message');
expect(res.body).to.have.deep.property('message');
done();
});
});
it('No password specified', (done) => {
chai.request(server)
.post('/api/v1/users/signup')
.send({
firstname: 'Noah',
lastname: 'name',
email: 'noah.kalyesubula@andela.com',
username: 'knoah',
})
.end((error, res) => {
expect(res.status).to.equal(400);
expect(res.body).to.be.an('object');
expect(res.body).to.have.property('message');
expect(res.body).to.have.deep.property('message');
done();
});
});
it('username is required', (done) => {
chai.request(server)
.post('/api/v1/users/signup')
.send({
firstname: 'Noah',
lastname: 'name',
email: 'noah.kalyesubula@andela.com',
password: 'ASqw123456'
})
.end((error, res) => {
expect(res.status).to.equal(400);
expect(res.body).to.be.an('object');
expect(res.body).to.have.property('message');
expect(res.body).to.have.deep.property('message');
done();
});
});
});
75 changes: 67 additions & 8 deletions test/users.test.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
import { chai, server, expect } from './test-setup';
import { verify } from 'crypto';

let adminToken;
// const adminToken = Helper.generateToken({
// email: 'admin@gmail.com',
// username: 'admin',
// verified: true
// });
let usertoken;

describe('Users', () => {
it("should return welcome to author's heaven", (done) => {
Expand Down Expand Up @@ -38,9 +33,11 @@ describe('Users', () => {
lastname: 'jonath',
email: 'maurice@gmmail.com',
username: 'maurice',
password: 'ASqw12345',
password: 'ASqw12345'
})
.set('Accept', 'Application/JSON')
.end((error, res) => {
usertoken = `Bearer ${res.body.token}`;
expect(res.status).to.be.equal(201);
expect(res.body).to.have.deep.property('message');
done();
Expand Down Expand Up @@ -100,7 +97,7 @@ describe('Users', () => {
done();
});
});
it('should not sign in the user when username is incorrect', (done) => {
it('should not sign in the user when email is incorrect', (done) => {
chai
.request(server)
.post('/api/v1/users/login')
Expand Down Expand Up @@ -138,6 +135,46 @@ describe('Users', () => {
done();
});
});
it('Admin should create users', (done) => {
chai
.request(server)
.post('/api/v1/users/signup')
.set('Authorization', adminToken)
.send({
firstname: 'chris',
lastname: 'habineza',
email: 'habineza@gmail.com',
username: 'habninezachris',
password: 'ASqw12345'
})
.end((error, res) => {
expect(res.status).to.be.equal(201);
expect(res.body).to.have.deep.property('status');
expect(res.body).to.have.deep.property('message');
expect(res.body).to.have.deep.property('data');
expect(res.body).to.have.deep.property('token');
done();
});
});
it('should throw an error when username or email already exists', (done) => {
chai
.request(server)
.post('/api/v1/users/signup')
.set('Authorization', adminToken)
.send({
firstname: 'chris',
lastname: 'habineza',
email: 'habineza@gmail.com',
username: 'habninezachris',
password: 'ASqw12345'
})
.end((error, res) => {
expect(res.status).to.be.equal(409);
expect(res.body).to.have.deep.property('status');
expect(res.body).to.have.deep.property('message');
done();
});
});
it('should retrieve single user', (done) => {
chai
.request(server)
Expand Down Expand Up @@ -185,5 +222,27 @@ describe('Users', () => {
done();
});
});
it('should throw an error when the role is not the admin', (done) => {
chai
.request(server)
.get('/api/v1/users/allusers')
.set('x-access-token', usertoken)
.end((error, res) => {
expect(res.status).to.be.equal(403);
expect(res.body).to.have.deep.property('message');
done();
});
});
it('should throw an error when token is not verified', (done) => {
chai
.request(server)
.get('/api/v1/users/allusers')
.set('x-access-token', `21${usertoken}`)
.end((error, res) => {
expect(res.status).to.be.equal(401);
expect(res.body).to.have.deep.property('message');
done();
});
});
});
});
17 changes: 17 additions & 0 deletions test/util.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { expect } from './test-setup';
import Util from '../src/helpers/util';

const util = new Util();
describe('util', () => {
it('should return success json object', () => {
util.setSuccess(200, 'success', { data: 'success' });
const res = {
status: 200,
message: 'hahaha',
data: 'hahah'
};
expect(res).to.have.deep.property('status');
expect(res).to.have.deep.property('message');
expect(res).to.have.deep.property('data');
});
});
50 changes: 50 additions & 0 deletions test/verify.email.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'dotenv/config';
import { chai, server, expect } from './test-setup';
import Helper from '../src/helpers/helper';
import createUser from '../src/services/user.service';
import sendEmail from '../src/helpers/verification-email';
import db from '../src/models';

const user = {
firstname: 'habineza',
lastname: 'christian',
email: 'habinezadalvan@gmail.com',
password: 'ASqw12345',
username: 'habinezadalvan'
};
describe('Users', () => {
before(async () => {
await createUser.addUser(user);
});
after(async () => {
await db.user.destroy({
where: { email: 'habinezadalvan@gmail.com' }
});
});
const token = Helper.generateToken({
email: 'habinezadalvan@gmail.com',
role: 'normal',
verified: 'false'
});

it('should verify email', (done) => {
chai
.request(server)
.get(`/api/v1/users/verify?token=${token}`)
.end((error, res) => {
expect(res.status).to.be.equal(200);
expect(res.body).to.have.deep.property('message');
done();
});
});
it('should send email from controller', (done) => {
const url = `/api/v1/users/verify?token=${token}`;
sendEmail(user.email, user.username, url);
done();
});
it('should catch an error when token is not verified', (done) => {
const results = Helper.verifyToken();
expect(results).to.equal('jwt must be provided');
done();
});
});

0 comments on commit feafe4c

Please sign in to comment.