Skip to content

Commit

Permalink
ft(validation):signup validation
Browse files Browse the repository at this point in the history
[finishes #167727453]
  • Loading branch information
danndav committed Sep 4, 2019
1 parent e0e33f4 commit 7ab08bf
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 3 deletions.
12 changes: 11 additions & 1 deletion src/controllers/user.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,19 @@ export default class UserController {
* @returns {object} A signed up user
*/
static async signup(req, res) {
const userData = UserUtils.getUserSignupData(req.body);

try {
const isEmailExist = await User.findOne({ where: { email: userData.email } });

if (isEmailExist) {
return res.status(409).json({
status: 'error',
message: 'user already registered'
});
}

const hash = await bcrypt.hash(req.body.password, 10);
const userData = UserUtils.getUserSignupData(req.body);
const user = await User.create({
...userData,
password: hash
Expand Down
Empty file removed src/middlewares/index.js
Empty file.
3 changes: 2 additions & 1 deletion src/routes/api/auth.router.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import passport from 'passport';
import UserController from '../../controllers/user.controller';
import UserMiddleware from '../../middlewares/user.middleware';
import socialMockMiddleWare from '../../middlewares/social-mock.middleware';
import signupValidator from '../../validation/user.validation';

const router = express.Router();

const authBase = '/auth';

/* Users Routes Here */
router.post(`${authBase}/signup`, UserController.signup);
router.post(`${authBase}/signup`, signupValidator, UserController.signup);
router.post('/auth/signin', ...UserMiddleware.validateSigninFields(),
UserController.signin);

Expand Down
111 changes: 110 additions & 1 deletion src/test/signup.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import app from '../index';

chai.use(chaiHttp);
chai.should();
const { expect } = chai;

const user = {
email: 'chiomadans@gmail.com',
Expand Down Expand Up @@ -50,5 +51,113 @@ describe('Users', () => {
done();
})
});
it('should not register a new user with an already existing email', (done) => {
chai.request(app)
.post('/api/v1/auth/signup')
.send(user)
.end((err, res) => {
expect(res).to.have.status(409);
expect(res.body).to.be.an('object');
expect(res.body.message).to.equal('user already registered');
done();
});
});
});
it('it should not signup invalid lastname', (done) => {
chai
.request(app)
.post('/api/v1/auth/signup')
.send( {
email: 'chiomadans@gmail.com',
first_name: 'Ejike',
last_name: '',
password: 'secret123',
role: 'requester',
gender: 'female',
birth_date: '02-02-2019',
preferred_language: 'english',
preferred_currency: 'USD',
location: 'lagos',
})
.end((err, res) => {
res.should.have.status(422);
res.body.should.have.property('status').to.equals('error');

done();
});
});



it('it should not signup invalid firstname', (done) => {
chai
.request(app)
.post('/api/v1/auth/signup')
.send( {
email: 'chiomadans@gmail.com',
first_name: '',
last_name: 'Ejike',
password: 'secret123',
role: 'requester',
gender: 'female',
birth_date: '02-02-2019',
preferred_language: 'english',
preferred_currency: 'USD',
location: 'lagos',
})
.end((err, res) => {
res.should.have.status(422);
res.body.should.have.property('status').to.equals('error');
done();
});
});

it('it should not signup invalid password', (done) => {
chai
.request(app)
.post('/api/v1/auth/signup')
.send( {
email: 'chiomadans@gmail.com',
first_name: 'Ejike',
last_name: 'ddd',
password: 'secre t123',
role: 'requester',
gender: 'female',
birth_date: '02-02-2019',
preferred_language: 'english',
preferred_currency: 'USD',
location: 'lagos',
})
.end((err, res) => {
res.should.have.status(422);
res.body.should.have.property('status').to.equals('error');
done();
});
});
it('it should not signup invalid email', (done) => {
chai
.request(app)
.post('/api/v1/auth/signup')
.send( {
email: 'chiomadansgmail.com',
first_name: 'Ejike',
last_name: 'ddd',
password: 'secret123',
role: 'requester',
gender: 'female',
birth_date: '02-02-2019',
preferred_language: 'english',
preferred_currency: 'USD',
location: 'lagos',
})
.end((err, res) => {
res.should.have.status(422);
res.body.should.have.property('status').to.equals('error');
done();
});
});
});
});




57 changes: 57 additions & 0 deletions src/validation/user.validation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { check, validationResult } from 'express-validator';

const customMessage = validationResult.withDefaults({
formatter: (error) => ({
field: error.param,
message: error.msg
})
});

const signupValidator = [
check('first_name', 'Invalid first name.')
.not().isEmpty().withMessage('First name is required')
.isAlpha()
.withMessage('Special characters and digits are not allowed')
.isLength({
min: 2,
max: 20
})
.withMessage('Too short: Enter a miximum of 20 and a minimum of 2 characters.'),

check('last_name', 'Invalid last name.')
.not().isEmpty().withMessage('Last name is required')
.isAlpha()
.withMessage('Special characters and digits are not allowed')
.isLength({
min: 2,
max: 20
})
.withMessage('Too short: Enter a miximum of 20 and a minimum of 2 characters.'),

check('email', 'Invalid Email')
.not().isEmpty().withMessage('Email is required')
.isEmail()
.normalizeEmail(),

check('password', 'Invalid password')
.not().isEmpty().withMessage('Password is required')
.isLength({ min: 6, max: 20 })
.withMessage('password must be at least 6 characters')
.not()
.matches(/\s/, 'g')
.withMessage('password cannot contain whitespace'),

(req, res, next) => {
const errors = validationResult(req);
return errors.isEmpty()
? next()
: res.status(422).json({
status: 'error',
error: customMessage(req).array()
});
}


];

export default signupValidator;

0 comments on commit 7ab08bf

Please sign in to comment.