From 83d9b14e10a6188e08da9c0a3e4feddc928558e1 Mon Sep 17 00:00:00 2001 From: Benny Ogidan Date: Wed, 3 Jan 2018 12:54:19 +0100 Subject: [PATCH] fix(tests): Implement test in a more streamlined manner - describe block for implemented for all tests - extra tests implemented for new authenticated routes - Coverage for client side back up to 95 % - Naming conventions changed to correct case - Test cases refactored to improve test - TestHook introduced to implement better seeding of token --- .eslintrc | 4 + server/src/app.js | 9 +- server/src/controllers/user.js | 10 +- server/src/routes/.hound.yml | 4 - .../seeders/{seedbooks.js => seedBooks.js} | 0 .../{seedcategories.js => seedCategories.js} | 0 .../seeders/{seedlevels.js => seedLevels.js} | 0 .../seeders/{seedusers.js => seedUsers.js} | 4 +- server/src/test/authenticate.spec.js | 463 +++++++++++- server/src/test/books.spec.js | 323 +++++---- server/src/test/categories.spec.js | 400 ++++++----- server/src/test/helpers/testHooks.js | 40 ++ server/src/test/index.spec.js | 2 +- server/src/test/notifications.spec.js | 31 +- server/src/test/user.spec.js | 662 ++++++------------ server/src/test/userBooks.spec.js | 351 +++++----- 16 files changed, 1303 insertions(+), 1000 deletions(-) delete mode 100644 server/src/routes/.hound.yml rename server/src/seeders/{seedbooks.js => seedBooks.js} (100%) rename server/src/seeders/{seedcategories.js => seedCategories.js} (100%) rename server/src/seeders/{seedlevels.js => seedLevels.js} (100%) rename server/src/seeders/{seedusers.js => seedUsers.js} (89%) create mode 100644 server/src/test/helpers/testHooks.js diff --git a/.eslintrc b/.eslintrc index 690dfca..0c335cf 100644 --- a/.eslintrc +++ b/.eslintrc @@ -44,6 +44,10 @@ 80, 2 ], + "max-nested-callbacks": [2, 7], + "max-depth": [2, { + "max": 2 + }], "import/no-unresolved": [ 2, { diff --git a/server/src/app.js b/server/src/app.js index 3ec635e..d27e278 100644 --- a/server/src/app.js +++ b/server/src/app.js @@ -19,21 +19,22 @@ app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); -app.use('/api-docs', express.static(path.join(__dirname, '../../apiDocs/'))); +app.use('/apiDocs', express.static(path.join(__dirname, '../../apiDocs/'))); app.use(express.static(path.join(__dirname, '../../client/dist/app'))); app.use((req, res, next) => { res.header( 'Access-Control-Allow-Headers', 'Authorization, X-PINGOTHER, Origin, X-Requested-With,' + - 'Content-Type, Accept, x-ac' + - 'cess-token' + 'Content-Type, Accept, x-access-token' ); next(); }); app.use('/api/v1', authenticateRoutes, routes); -app.get('*', (req, res) => res.sendFile(path.join(__dirname, '../../client/dist/app/index.html'))); +app + .get('*', (req, res) => + res.sendFile(path.join(__dirname, '../../client/dist/app/index.html'))); export default(app); diff --git a/server/src/controllers/user.js b/server/src/controllers/user.js index 2f905b4..440d25d 100644 --- a/server/src/controllers/user.js +++ b/server/src/controllers/user.js @@ -52,9 +52,9 @@ const userController = { }).then((user) => { if (user) { res.status(201).send({ - message: `${user.username} has - been added to the library, ` + - 'Please Login, you will be only required to do this once' + message: `${user.username} has been added to + the library, 'Please Login, you will be only ` + + 'required to do this once' }); } }); @@ -179,8 +179,8 @@ const userController = { return res.status(409) .send({ message: - 'Your current password does not match our records,' - + 'Please Re-enter' + 'Your current password does not match our records, ' + + 'Please Re-enter' }); } const compareNewPasswords = diff --git a/server/src/routes/.hound.yml b/server/src/routes/.hound.yml deleted file mode 100644 index 9ad3511..0000000 --- a/server/src/routes/.hound.yml +++ /dev/null @@ -1,4 +0,0 @@ -eslint: - enabled: true - config_file: .eslintrc - ignore_file: .eslintignore \ No newline at end of file diff --git a/server/src/seeders/seedbooks.js b/server/src/seeders/seedBooks.js similarity index 100% rename from server/src/seeders/seedbooks.js rename to server/src/seeders/seedBooks.js diff --git a/server/src/seeders/seedcategories.js b/server/src/seeders/seedCategories.js similarity index 100% rename from server/src/seeders/seedcategories.js rename to server/src/seeders/seedCategories.js diff --git a/server/src/seeders/seedlevels.js b/server/src/seeders/seedLevels.js similarity index 100% rename from server/src/seeders/seedlevels.js rename to server/src/seeders/seedLevels.js diff --git a/server/src/seeders/seedusers.js b/server/src/seeders/seedUsers.js similarity index 89% rename from server/src/seeders/seedusers.js rename to server/src/seeders/seedUsers.js index fc0f9a6..e33e404 100644 --- a/server/src/seeders/seedusers.js +++ b/server/src/seeders/seedUsers.js @@ -1,5 +1,7 @@ import faker from 'faker'; +require('dotenv').config(); + const bcrypt = require('bcrypt'); @@ -18,7 +20,7 @@ module.exports = { }, { username: 'bennyogidan', - password: bcrypt.hashSync('bennyogidan', bcrypt.genSaltSync(10)), + password: bcrypt.hashSync(process.env.ADMIN_PASSWORD, bcrypt.genSaltSync(10)), email: 'benfluleck@gmail.com', firstname: 'Administrator', isAdmin: true, diff --git a/server/src/test/authenticate.spec.js b/server/src/test/authenticate.spec.js index ebf05a6..a9ae0ca 100644 --- a/server/src/test/authenticate.spec.js +++ b/server/src/test/authenticate.spec.js @@ -8,11 +8,11 @@ const { expect } = chai; chai.use(chaiHttp); -let token = ''; +let userToken = ''; const errorToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'; describe('Authentication', () => { - it('should return 401 if token is not a token', (done) => { + it('should return a 401 status code if token is not a token', (done) => { chai .request(app) .put('/api/v1/users/changepassword') @@ -22,70 +22,493 @@ describe('Authentication', () => { expect(res.status) .to .equal(401); + expect(res.body.token) + .to.equal(null); + expect(res.body.message) + .to.equal("Unauthorised access"); done(); }); }); - it('should return 201 when a regular user is created', (done) => { + it( + 'should return a 201 status code when a regular user is created', + (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: 'benogidan', + password: 'boooboo', + passwordConfirmation: 'boooboo', + firstname: 'Benny', + email: faker + .internet + .email(), + lastname: faker + .name + .lastName() + }) + .end((err, res) => { + expect(res.status) + .to + .equal(201); + expect(res.body).to.be.a('object'); + done(); + }); + } + ); + it('should return 200 when a regular user signs in', (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ username: 'benogidan', password: 'boooboo' }) + .end((err, res) => { + expect(res.status) + .to + .equal(200); + expect(res.body.username).to.equal('benogidan'); + expect(res.body).to.be.a('object'); + userToken = res.body.token; + done(); + }); + }); + it('should return a 401 stus code if token is not an admin token', (done) => { chai .request(app) + .post('/api/v1/admin/category') + .set('x-access-token', userToken) + .send({ categoryName: 'EDUCATIONAL' }) + .end((err, res) => { + expect(res.status) + .to + .equal(403); + expect(res.body.token) + .to.equal(undefined); + done(); + }); + }); + it('should return 401 if there is an error with token', (done) => { + chai + .request(app) + .post('/api/v1/admin/category') + .set('x-access-token', errorToken) + .send({ categoryName: 'EDUCATIONAL' }) + .end((err, res) => { + expect(res.status) + .to + .equal(401); + expect(res.body.token) + .to.equal(null); + expect(res.body.message) + .to.equal("Unauthorised access"); + done(); + }); + }); + it('should return 201 when a regular administrator is created', (done) => { + chai.request(app) .post('/api/v1/auth/users/signup') .set('Accept', 'application/x-www-form-urlencoded') .send({ - username: 'benogidan', + username: 'testadmin', password: 'boooboo', passwordConfirmation: 'boooboo', firstname: 'Benny', + isAdmin: true, + email: faker.internet.email(), + lastname: faker.name.lastName() + }) + .end((err, res) => { + expect(res.status).to.equal(201); + done(); + }); + }); + it('should return 200 when a administrator signs in', (done) => { + chai.request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: 'testadmin', + password: 'boooboo' + }) + .end((err, res) => { + expect(res.status).to.equal(200); + done(); + }); + }); + + it( + 'should not log a user in with a wrong googleID', + (done) => { + const newUser = { + googleId: '345678976543' + }; + chai.request(app) + .post('/api/v1/auth/users/signin') + .send(newUser) + .end((err, res) => { + expect(res.status).to.equal(500); + done(); + }); + } + ); + + it( + 'should not log a user in with a wrong googleID with user details', + (done) => { + const newUser = { + googleId: '345678976543', + username: faker + .internet + .userName(), email: faker .internet .email(), + password: 'testpassword', + passwordConfirmation: 'testpassword' + }; + chai.request(app) + .post('/api/v1/auth/users/signin') + .send(newUser) + .end((err, res) => { + expect(res.status).to.equal(400); + done(); + }); + } + ); + it( + 'should sign up users who fill the correct ' + + 'parameters for the signup form', + (done) => { + const email = 'bo345@kent.ac.uk'; + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + firstname: faker + .name + .firstName(), + lastname: faker + .name + .lastName(), + username: 'samplename', + password: 'password', + passwordConfirmation: 'password', + email + }) + .end((err, res) => { + expect(res.status) + .to + .equal(201); + done(); + }); + } + ); + it('should throw a validation error for invalid user data', (done) => { + const email = faker + .internet + .email(); + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + firstname: faker + .name + .firstName(), lastname: faker .name - .lastName() + .lastName(), + password: 'password', + passwordConfirmation: 'password', + email }) .end((err, res) => { expect(res.status) .to - .equal(201); + .equal(400); done(); }); }); - it('should return 200 when a regular user signs in', (done) => { + it('should throw a validation error for invalid user data', (done) => { + const email = 'nenemail.com'; + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + firstname: faker + .name + .firstName(), + lastname: faker + .name + .lastName(), + username: faker + .internet + .userName(), + password: 'password', + passwordConfirmation: 'password', + email + }) + .end((err, res) => { + expect(res.status) + .to + .equal(422); + done(); + }); + }); + it( + 'should reject authorization for users due to no token being defined', + (done) => { + chai + .request(app) + .post('/api/v1/users/books') + .end((err, res) => { + expect(res.status) + .to + .be + .equal(401); + done(); + }); + } + ); + it( + 'should respond with 404 status code if bad username or password', + (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: faker + .internet + .userName(), + password: faker + .internet + .password() + }) + .end((err, res) => { + expect(res.status) + .to + .equal(404); + done(); + }); + } + ); + it('should ensure all signup fields are required on sign up', (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: faker + .internet + .userName(), + email: faker + .internet + .email(), + password: 'testpassword', + passwordConfirmation: 'testpassword' + }) + .end((err, res) => { + expect(res.body.message) + .to + .equal('Firstname is invalid'); + expect(res.status) + .to + .equal(400); + done(); + }); + }); + it('should throw a 404 error for Users that do not exist', (done) => { chai .request(app) .post('/api/v1/auth/users/signin') .set('Accept', 'application/x-www-form-urlencoded') - .send({ username: 'benogidan', password: 'boooboo' }) + .send({ username: 'UnknownUser', password: 'error' }) .end((err, res) => { + expect(res.body.message) + .to + .equal('UnknownUser does not exist, Make sure you are signed up'); expect(res.status) .to - .equal(200); - token = res.body.token; + .equal(404); done(); }); }); - it('should return 403 if token is not an admin token', (done) => { + it('should return a 400 error for an invalid password ', (done) => { chai .request(app) - .post('/api/v1/admin/category') - .set('x-access-token', token) - .send({ categoryName: 'EDUCATIONAL' }) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ username: 'Benny', password: '' }) .end((err, res) => { + expect(res.body.message) + .to + .equal('Password is too short'); expect(res.status) .to - .equal(403); + .equal(400); done(); }); }); - it('should return 401 if error with token', (done) => { + it( + 'should return a 404 error for an Invalid user', + (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ username: 'Benny', password: 'nnnnnnn' }) + .end((err, res) => { + expect(res.body.message) + .to + .equal('Benny does not exist, Make sure you are signed up'); + expect(res.status) + .to + .equal(404); + done(); + }); + } + ); + it('should validate that a newly signed up user is unique', (done) => { chai .request(app) - .post('/api/v1/admin/category') - .set('x-access-token', errorToken) - .send({ categoryName: 'EDUCATIONAL' }) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: 'testuser', + firstname: 'Benn', + lastname: 'Nyotu', + email: 'ben@gmail.com', + password: 'benny', + passwordConfirmation: 'benny' + }) .end((err, res) => { expect(res.status) .to - .equal(401); + .be + .equal(409); + expect(res.body.message).to.equal('This username is already in use'); + done(); + }); + }); + it('should validate that the new user\'s email as unique', (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: 'Homer', + firstname: 'Homer', + lastname: 'Simpson', + email: 'sample@email.com', + password: 'benny', + passwordConfirmation: 'benny' + }) + .end((err, res) => { + expect(res.status) + .to + .be + .equal(409); + expect(res.body.message).to.equal('This email is already in use'); + done(); + }); + }); + it('should not create a user if the password does not match', (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + username: 'Homer', + firstname: 'Homer', + lastname: 'Simpson', + email: 'ben@gmail.com', + password: 'benny', + passwordConfirmation: 'benny23' + }) + .end((err, res) => { + expect(res.status) + .to + .be + .equal(422); + done(); + }); + }); + it( + 'should return a successful login message ' + + 'if user name and password are valid', + (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ username: 'testuser', password: 'testuser' }) + .end((err, res) => { + expect('Content-Type', /json/); + expect(res.body) + .have + .property('message'); + expect(res.body.message) + .to + .equal(' You are now logged in as testuser'); + done(); + }); + } + ); + it('should require the username field when signing up', (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ username: '', password: 'benny' }) + .end((err, res) => { + expect('Content-Type', /json/); + expect(res.status) + .to + .be + .equal(400); + expect(res.body.message) + .to + .equal('Username is invalid'); + done(); + }); + }); + it( + 'should require the password field when a new user\'s signs up', + (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signin') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ username: 'Benny', password: '' }) + .end((err, res) => { + expect('Content-Type', /json/); + expect(res.status) + .to + .be + .equal(400); + expect(res.body.message) + .to + .equal('Password is too short'); + done(); + }); + } + ); + it('should ensure all signup fields are defined when signing up', (done) => { + chai + .request(app) + .post('/api/v1/auth/users/signup') + .set('Accept', 'application/x-www-form-urlencoded') + .send({ + usename: '', email: '', password: '', passwordConfirmation: '' + }) + .end((err, res) => { + expect(res.body.message) + .to + .equal('This email address you have provided is invalid'); done(); }); }); diff --git a/server/src/test/books.spec.js b/server/src/test/books.spec.js index a3f111a..867d553 100644 --- a/server/src/test/books.spec.js +++ b/server/src/test/books.spec.js @@ -1,16 +1,9 @@ -/* -eslint-disable no-console -*/ - -import faker from 'faker'; import chai from 'chai'; import chaiHttp from 'chai-http'; -import dotenv from 'dotenv'; import app from '../app'; import db from '../models'; - -dotenv.config(); +import usrToken from './helpers/testHooks'; const { Books } = db; const { expect } = chai; @@ -18,12 +11,18 @@ const { expect } = chai; chai.use(chaiHttp); let bookId; -let token = ''; +let userToken = ''; +let adminToken = ''; const testdate = new Date('2018-01-04'); let limit; -describe('HelloBooks', () => { +describe('Books', () => { before((done) => { + usrToken().then((response) => { + userToken = response.userToken; + adminToken = response.adminToken; + done(); + }); Books .create({ title: 'Shola comes home', @@ -35,63 +34,24 @@ describe('HelloBooks', () => { }) .then((book) => { bookId = book.id; - done(); }) .catch(() => {}); }); - - describe('Authentication', () => { - it('should return 201 when a regular administrator is created', (done) => { - chai - .request(app) - .post('/api/v1/auth/users/signup') - .set('Accept', 'application/x-www-form-urlencoded') - .send({ - username: 'ogidan', - password: 'boooboo', - passwordConfirmation: 'boooboo', - firstname: 'Benny', - isAdmin: true, - email: faker - .internet - .email(), - lastname: faker - .name - .lastName() - }) - .end((err, res) => { - expect(res.status) - .to - .equal(201); - done(); - }); - }); - it('should return 200 when a administrator signs in', (done) => { - chai - .request(app) - .post('/api/v1/auth/users/signin') - .set('Accept', 'application/x-www-form-urlencoded') - .send({ username: 'ogidan', password: 'boooboo' }) - .end((err, res) => { - expect(res.status) - .to - .equal(200); - token = res.body.token; - done(); - }); - }); - }); - describe('Books', () => { + describe(' { it('should display all books from the data', (done) => { chai .request(app) .get('/api/v1/books') .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) + .set('x-access-token', userToken) .end((err, res) => { expect(res.status) .to .equal(200); + expect(res.body) + .to + .be + .a('object'); done(); }); }); @@ -99,7 +59,7 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books') - .set({ 'x-access-token': token }) + .set({ 'x-access-token': userToken }) .query({ limit: 2 }) .end((err, res) => { expect(res.status) @@ -111,6 +71,10 @@ describe('HelloBooks', () => { .to .be .equal(2); + expect(res.body) + .to + .be + .a('object'); done(); }); }); @@ -118,7 +82,7 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books') - .set({ 'x-access-token': token }) + .set({ 'x-access-token': userToken }) .query({ limit: 1 }) .end((err, res) => { expect(res.status) @@ -137,7 +101,7 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books') - .set({ 'x-access-token': token }) + .set({ 'x-access-token': userToken }) .query({ limit: 1, offset: 1 }) .end((err, res) => { expect(res.status) @@ -156,7 +120,7 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books') - .set({ 'x-access-token': token }) + .set({ 'x-access-token': userToken }) .query({ limit, offset: 1 }) .end((err, res) => { expect(res.status) @@ -172,13 +136,13 @@ describe('HelloBooks', () => { }); }); }); - describe('Edit books', () => { + describe(' { it('should edit a selected book from the database', (done) => { chai .request(app) .put(`/api/v1/admin/books/${bookId}`) .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) + .set('x-access-token', adminToken) .send({ title: 'The Chronicles of Andela', author: 'C.S. Lewis', @@ -191,6 +155,10 @@ describe('HelloBooks', () => { expect(res.status) .to .equal(200); + expect('Content-Type', /json/); + expect(res.body.message) + .to + .equal('The Chronicles of Andela has been updated'); done(); }); }); @@ -199,7 +167,7 @@ describe('HelloBooks', () => { .request(app) .put(`/api/v1/admin/books/${bookId}`) .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) + .set('x-access-token', adminToken) .send({ title: 'The Chronicles of Andela', author: '', @@ -212,31 +180,44 @@ describe('HelloBooks', () => { expect(res.status) .to .equal(400); - done(); - }); - }); - it('should throw an error if category Id is not defined', (done) => { - chai - .request(app) - .put('/api/v1/admin/books') - .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) - .send({ - title: 'The Chronicles of Andela', author: 'C.S. Lewis', quantity: '23', description: 'This is a test', bookImage: 'Image' - }) - .end((err, res) => { - expect(res.status) + expect(res.body.message) .to - .equal(404); + .equal('This author\'s name is invalid'); done(); }); }); + it( + 'should throw a 404 errror if book to be edited is not defined', + (done) => { + chai + .request(app) + .put('/api/v1/admin/books/') + .set('Accept', 'application/x-www-form-urlencoded') + .set('x-access-token', adminToken) + .send({ + title: 'The Chronicles of Andela', + author: 'C.S. Lewis', + quantity: '23', + categoryId: '2', + description: 'This is a test', + bookImage: 'Image' + }) + .end((err, res) => { + expect(res.status) + .to + .equal(404); + done(); + }); + } + ); + }); + describe(' { it('should allow administrators to create books', (done) => { chai .request(app) .post('/api/v1/admin/books') .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) + .set('x-access-token', adminToken) .send({ title: 'Learn Java', author: 'Sleeping Master', @@ -251,7 +232,8 @@ describe('HelloBooks', () => { .equal(201); expect(res.body.message) .to - .equal('Learn Java has been added to the library, Category: Drama'); + .equal('Learn Java has been added to the library,' + + ' Category: Drama'); done(); }); }); @@ -260,7 +242,7 @@ describe('HelloBooks', () => { .request(app) .post('/api/v1/admin/books') .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) + .set('x-access-token', adminToken) .send({ title: 'Learn Java', author: 'Sleeping Master', @@ -275,35 +257,35 @@ describe('HelloBooks', () => { .equal(409); expect(res.body.message) .to - .equal('A book with the same title and author already exists in the library'); + .equal('A book with the same title and ' + + 'author already exists in the library'); done(); }); }); - it( - 'should return a 400 response for a book with an incomplete description', - (done) => { - chai - .request(app) - .post('/api/v1/admin/books') - .set('Accept', 'application/x-www-form-urlencoded') - .set('x-access-token', token) - .send({ - title: 'Benedict goes to school', - author: 'Benny O', - categoryId: '3', - quantity: '20', - description: 'This ', - bookimage: 'Test Image' - }) - .end((err, res) => { - expect(res.status) - .to - .equal(400); - done(); - }); - } - ); - it('should allow only authenticated users allowed to create books', (done) => { + it('should return a 400 response for ' + + 'a book with an incomplete description', (done) => { + chai + .request(app) + .post('/api/v1/admin/books') + .set('Accept', 'application/x-www-form-urlencoded') + .set('x-access-token', adminToken) + .send({ + title: 'Benedict goes to school', + author: 'Benny O', + categoryId: '3', + quantity: '20', + description: 'This ', + bookimage: 'Test Image' + }) + .end((err, res) => { + expect(res.status) + .to + .equal(400); + done(); + }); + }); + it('should allow only authenticated ' + + 'users allowed to create books', (done) => { chai .request(app) .post('/api/v1/admin/books/') @@ -312,18 +294,26 @@ describe('HelloBooks', () => { expect(res.status) .to .equal(401); + expect(res.body.token) + .to.equal(null); + expect(res.body.message) + .to.equal("Unauthorised access"); done(); }); }); + }); + describe(' { it('should return 200 when searching all books', (done) => { chai .request(app) .get('/api/v1/books/search?searchTerm=Sta') - .set('x-access-token', token) + .set('x-access-token', userToken) .end((err, res) => { expect(res.status) .to .equal(200); + expect(res.body.success) + .to.equal(true); done(); }); }); @@ -331,11 +321,13 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books/search?searchTerm=Sta&categoryId=1') - .set('x-access-token', token) + .set('x-access-token', userToken) .end((err, res) => { expect(res.status) .to .equal(200); + expect(res.body.success) + .to.equal(true); done(); }); }); @@ -343,11 +335,14 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books/search?searchTerm=') - .set('x-access-token', token) + .set('x-access-token', userToken) .end((err, res) => { expect(res.status) .to .equal(400); + expect(res.body.message) + .to + .equal('Please enter your search criteria'); done(); }); }); @@ -355,73 +350,64 @@ describe('HelloBooks', () => { chai .request(app) .get('/api/v1/books/search?searchTerm=999999') - .set('x-access-token', token) + .set('x-access-token', userToken) .end((err, res) => { expect(res.status) .to .equal(404); - done(); - }); - }); - it('should return 200 when getting a single book', (done) => { - chai - .request(app) - .get('/api/v1/auth/books/1') - .set('x-access-token', token) - .end((err, res) => { - expect(res.status) + expect(res.body.message) .to - .equal(200); + .equal('Sorry no books match your search criteria'); done(); }); }); + }); + it('should return 200 when getting a single book', (done) => { + chai + .request(app) + .get('/api/v1/auth/books/1') + .set('x-access-token', userToken) + .end((err, res) => { + expect(res.status) + .to + .equal(200); + done(); + }); + }); + describe('