diff --git a/config/passport.js b/config/passport.js index a2805bd..5d3c57e 100644 --- a/config/passport.js +++ b/config/passport.js @@ -16,11 +16,11 @@ passport.deserializeUser(async (id, done) => { }) passport.use('local', new Strategy({ - usernameField: 'username', + usernameField: 'email', passwordField: 'password' -}, async (username, password, done) => { +}, async (email, password, done) => { try { - const user = await User.findOne({ username }) + const user = await User.findOne({ email }) if (!user) { return done(null, false) } try { diff --git a/src/lib/admin.js b/src/lib/admin.js index 61bb4be..012a242 100644 --- a/src/lib/admin.js +++ b/src/lib/admin.js @@ -37,14 +37,14 @@ async function createSystemUser () { json: true, body: { user: { - username: 'system', + email: 'system@system.com', password: context.password } } } let result = await rp(options) - context.username = result.body.user.username + context.email = result.body.user.email context.id = result.body.user._id context.token = result.body.token @@ -131,7 +131,7 @@ async function loginAdmin () { resolveWithFullResponse: true, json: true, body: { - username: 'system', + email: 'system@system.com', password: existingUser.password } } diff --git a/src/models/users.js b/src/models/users.js index 175e7f7..46164ed 100644 --- a/src/models/users.js +++ b/src/models/users.js @@ -6,8 +6,21 @@ const jwt = require('jsonwebtoken') const User = new mongoose.Schema({ type: { type: String, default: 'user' }, name: { type: String }, - username: { type: String, required: true, unique: true }, - password: { type: String, required: true } + username: { type: String }, + password: { type: String, required: true }, + email: { + type: String, + required: true, + unique: true, + validate: { + validator: function (email) { + // eslint-disable-next-line no-useless-escape + return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email) + }, + message: props => `${props.value} is not a valid Email format!` + } + + } }) User.pre('save', function preSave (next) { diff --git a/test/a01-auth.spec.js b/test/a01-auth.spec.js index e5a9a8c..9c20961 100644 --- a/test/a01-auth.spec.js +++ b/test/a01-auth.spec.js @@ -16,11 +16,11 @@ describe('Auth', () => { await app.startServer() // This should be second instruction. const userObj = { - username: 'test', + email: 'test@test.com', password: 'pass' } const testUser = await utils.createUser(userObj) - + console.log(`TestUser : ${testUser}`) context.user = testUser.user context.token = testUser.token }) @@ -34,7 +34,7 @@ describe('Auth', () => { resolveWithFullResponse: true, json: true, body: { - username: 'test', + email: 'test@test.com', password: 'wrongpassword' } } @@ -57,6 +57,33 @@ describe('Auth', () => { } } }) + it('should throw 422 if email is wrong format', async () => { + try { + const options = { + method: 'POST', + uri: `${LOCALHOST}/auth`, + resolveWithFullResponse: true, + json: true, + body: { + email: 'wrongEmail', + password: 'wrongpassword' + } + } + + await rp(options) + assert(false, 'Unexpected result') + } catch (err) { + if (err.statusCode === 422) { + assert(err.statusCode === 422, 'Error code 422 expected.') + } else if (err.statusCode === 401) { + assert(err.statusCode === 401, 'Error code 401 expected.') + } else { + console.error('Error: ', err) + console.log('Error stringified: ' + JSON.stringify(err, null, 2)) + throw err + } + } + }) it('should auth user', async () => { try { @@ -66,7 +93,7 @@ describe('Auth', () => { resolveWithFullResponse: true, json: true, body: { - username: 'test', + email: 'test@test.com', password: 'pass' } } @@ -77,8 +104,8 @@ describe('Auth', () => { assert(result.statusCode === 200, 'Status Code 200 expected.') assert( - result.body.user.username === 'test', - 'Username of test expected' + result.body.user.email === 'test@test.com', + 'Email of test expected' ) assert( result.body.user.password === undefined, diff --git a/test/a02-users.spec.js b/test/a02-users.spec.js index bd22285..5c6ce9e 100644 --- a/test/a02-users.spec.js +++ b/test/a02-users.spec.js @@ -16,7 +16,7 @@ describe('Users', () => { // Create a second test user. const userObj = { - username: 'test2', + email: 'test2@test.com', password: 'pass2' } const testUser = await testUtils.createUser(userObj) @@ -47,7 +47,7 @@ describe('Users', () => { resolveWithFullResponse: true, json: true, body: { - username: 'supercoolname' + email: 'test2@test.com' } } @@ -76,7 +76,10 @@ describe('Users', () => { resolveWithFullResponse: true, json: true, body: { - user: { username: 'supercoolname', password: 'supersecretpassword' } + user: { + email: 'test3@test.com', + password: 'supersecretpassword' + } } } @@ -88,8 +91,8 @@ describe('Users', () => { assert(result.statusCode === 200, 'Status Code 200 expected.') assert( - result.body.user.username === 'supercoolname', - 'Username of test expected' + result.body.user.email === 'test3@test.com', + 'Email of test expected' ) assert( result.body.user.password === undefined, @@ -274,7 +277,7 @@ describe('Users', () => { const user = result.body.user // console.log(`user: ${util.inspect(user)}`) - assert.hasAnyKeys(user, ['type', '_id', 'username']) + assert.hasAnyKeys(user, ['type', '_id', 'email']) assert.equal(user._id, _id) assert.notProperty( user, @@ -343,7 +346,7 @@ describe('Users', () => { Authorization: `Bearer ${token}` }, body: { - user: { username: 'updatedcoolname' } + user: { email: 'testToUpdate@test.com' } } } @@ -351,14 +354,14 @@ describe('Users', () => { const user = result.body.user // console.log(`user: ${util.inspect(user)}`) - assert.hasAnyKeys(user, ['type', '_id', 'username']) + assert.hasAnyKeys(user, ['type', '_id', 'email']) assert.equal(user._id, _id) assert.notProperty( user, 'password', 'Password property should not be returned' ) - assert.equal(user.username, 'updatedcoolname') + assert.equal(user.email, 'testToUpdate@test.com') }) it('should not be able to update user type', async () => { diff --git a/test/utils.js b/test/utils.js index afce8a6..2b21add 100644 --- a/test/utils.js +++ b/test/utils.js @@ -27,7 +27,7 @@ async function createUser (userObj) { json: true, body: { user: { - username: userObj.username, + email: userObj.email, password: userObj.password } } @@ -55,7 +55,7 @@ async function loginTestUser () { resolveWithFullResponse: true, json: true, body: { - username: 'test', + email: 'test@test.com', password: 'pass' } } @@ -89,7 +89,7 @@ async function loginAdminUser () { resolveWithFullResponse: true, json: true, body: { - username: adminUserData.username, + email: adminUserData.email, password: adminUserData.password } } diff --git a/util/users/createUsers.js b/util/users/createUsers.js index 16a49bb..08a2e40 100644 --- a/util/users/createUsers.js +++ b/util/users/createUsers.js @@ -2,7 +2,7 @@ const mongoose = require('mongoose') const config = require('../../config') -const USERNAME = 'test' +const EMAIL = 'test@test.com' const PASSWORD = 'pass' async function addUser () { @@ -14,7 +14,7 @@ async function addUser () { const User = require('../../src/models/users') const userData = { - username: USERNAME, + email: EMAIL, password: PASSWORD } @@ -27,7 +27,7 @@ async function addUser () { await mongoose.connection.close() - console.log(`User ${USERNAME} created.`) + console.log(`User ${EMAIL} created.`) } addUser()