From d0cde892220b6fe961797192632505bfffff1875 Mon Sep 17 00:00:00 2001 From: Hamzah Abdulfattah Date: Sat, 13 Jul 2019 22:09:48 +0100 Subject: [PATCH] 166816218-feature(users, users.spec) get all users - Implement get all users feature - Add test for feature - Document feature [Delivers #166816218] --- controllers/users/index.js | 23 ++++++++++++++++++++ db/faker.js | 34 +++++++++++++++++++++++------- db/seeders/20190701143128-users.js | 4 ++-- routes/v1/users.js | 7 ++++++ swagger.yaml | 16 ++++++++++++++ tests/helpers.js | 12 ++++++++++- tests/routes/users.spec.js | 32 +++++++++++++++++++++++++++- 7 files changed, 116 insertions(+), 12 deletions(-) diff --git a/controllers/users/index.js b/controllers/users/index.js index 0861f09..26bd58d 100644 --- a/controllers/users/index.js +++ b/controllers/users/index.js @@ -251,5 +251,28 @@ export default { return res.status(404).send({ error: 'Notification not Found' }); + }, + + getUsers: async (req, res) => { + try { + const { query } = req; + const limit = query.limit || 20; + const offset = query.offset ? (query.offset * limit) : 0; + + const users = await db.User.findAndCountAll({ + offset, + limit, + attributes: ['username', 'firstName', 'lastName', 'image'] + }); + return res.status(200).json({ + users: users.rows, + usersCount: users.count + }); + } catch (e) { + return res.status(500).json({ + message: 'Something went wrong', + error: e.message, + }); + } } }; diff --git a/db/faker.js b/db/faker.js index acd23ba..7ca872b 100644 --- a/db/faker.js +++ b/db/faker.js @@ -1,3 +1,4 @@ +const readingTime = require('read-time'); const faker = require('faker'); const getFakeArticle = id => ({ @@ -7,6 +8,7 @@ const getFakeArticle = id => ({ authorId: id, createdAt: new Date(), updatedAt: new Date(), + readTime: readingTime(faker.random.word('string')).text }); const createFakeArticles = (id) => { @@ -19,26 +21,42 @@ const createFakeArticles = (id) => { }; const getFakeUser = () => ({ - email: 'sampoli@gmail.com', + email: faker.internet.email(), bio: faker.random.word('string'), - firstName: faker.random.words(4), - lastName: faker.random.words(4), + firstName: faker.name.firstName(), + lastName: faker.name.lastName(), username: faker.random.words(4), password: faker.random.words(10), + image: faker.image.imageUrl(), + role: 'author' }); -const createFakeUser = () => { - const Articles = []; +const getFakeAdmin = () => ({ + email: 'admin@haven.com', + bio: faker.random.word('string'), + firstName: faker.name.firstName(), + lastName: faker.name.lastName(), + username: faker.random.words(4), + password: 'password', + image: faker.image.imageUrl(), + role: 'admin', +}); + +const createFakeUsers = () => { + const Users = []; + Users.push({ ...getFakeUser(), email: 'sampoli@gmail.com' }, getFakeAdmin()); + // eslint-disable-next-line no-plusplus for (let i = 0; i < 40; i++) { - Articles.push(getFakeUser()); + Users.push(getFakeUser()); } - return Articles; + return Users; }; module.exports = { getFakeArticle, createFakeArticles, getFakeUser, - createFakeUser, + createFakeUsers, + getFakeAdmin }; diff --git a/db/seeders/20190701143128-users.js b/db/seeders/20190701143128-users.js index 66f59ef..2489400 100644 --- a/db/seeders/20190701143128-users.js +++ b/db/seeders/20190701143128-users.js @@ -1,4 +1,4 @@ -const { getFakeUser } = require('../faker'); +const { createFakeUsers } = require('../faker'); module.exports = { up: async (queryInterface) => { @@ -7,7 +7,7 @@ module.exports = { email: 'sampoli@gmail.com', }, }, ['email']); - if (!user) queryInterface.bulkInsert('Users', [getFakeUser()], {}); + if (!user) queryInterface.bulkInsert('Users', createFakeUsers(), {}); }, down: queryInterface => queryInterface.bulkDelete('Users', null, {}) diff --git a/routes/v1/users.js b/routes/v1/users.js index c4761d3..60cf455 100644 --- a/routes/v1/users.js +++ b/routes/v1/users.js @@ -13,5 +13,12 @@ router.post('/reset-password', Validation.resetPassword, User.resetPassword); router.put('/change-password', Validation.changePassword, User.changePassword); router.put('/activate/:token', User.activate); router.get('/home', User.home); +router.get( + '/', + Middleware.authenticate, + Middleware.isblackListedToken, + Middleware.isAdmin, + User.getUsers +); export default router; diff --git a/swagger.yaml b/swagger.yaml index f8be69d..81a4cfb 100644 --- a/swagger.yaml +++ b/swagger.yaml @@ -34,6 +34,22 @@ paths: description: User Successfully Updated '400': description: Error message + get: + tags: + - Users + summary: Get all users + operationId: getAllUsers + produces: + - application/json + parameters: + - name: x-access-token + in: header + description: Authorization token + required: true + type: string + responses: + '200': + description: Successfully got all users data /users/signup: post: tags: diff --git a/tests/helpers.js b/tests/helpers.js index 9453b6b..5c53876 100644 --- a/tests/helpers.js +++ b/tests/helpers.js @@ -1,6 +1,7 @@ /* eslint-disable require-jsdoc */ import readingTime from 'read-time'; import { db } from '../server'; +import { createFakeUsers } from '../db/faker'; /** @@ -32,7 +33,7 @@ export class Response { export const createUser = async (user) => { const { - firstName, lastName, username, email, password + firstName, lastName, username, email, password, image, role } = user; const newUser = await db.User.create({ @@ -41,6 +42,8 @@ export const createUser = async (user) => { username, email, password, + role, + image }); return newUser; @@ -54,3 +57,10 @@ export const createArticle = async article => db.Article.create({ export const createRate = async rating => db.Ratings.create(rating); export const createArticleVote = async vote => db.ArticleVote.create(vote); + +export const createTestFakeUsers = () => { + const users = createFakeUsers(); + users.forEach(async (user) => { + await createUser(user); + }); +}; diff --git a/tests/routes/users.spec.js b/tests/routes/users.spec.js index 0fdbd02..1960783 100644 --- a/tests/routes/users.spec.js +++ b/tests/routes/users.spec.js @@ -3,7 +3,7 @@ import chaiHttp from 'chai-http'; import sinon from 'sinon'; import { transporter } from '../../utils/mailer'; import { app, db } from '../../server'; -import { createUser } from '../helpers'; +import { createUser, createTestFakeUsers } from '../helpers'; import * as utils from '../../utils'; let mockUploadImage; @@ -23,6 +23,7 @@ describe('USER AUTHENTICATION', () => { username: 'kev', password: '12345678', email: 'frank@gmail.com', + role: 'admin' }; user = await createUser(register); @@ -373,4 +374,33 @@ describe('USER AUTHENTICATION', () => { expect(res).to.have.status(200); }); }); + + describe('Get all Users', () => { + before(async () => { + await createTestFakeUsers(); + }); + it('should get all first 20 users', async () => { + const { token } = user.response(); + const res = await chai + .request(app) + .get('/api/v1/users') + .set('x-access-token', token); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.users).to.be.an('array'); + expect(res.body.users).to.have.length(20); + }); + + it('should get all second 10 users', async () => { + const { token } = user.response(); + const res = await chai + .request(app) + .get('/api/v1/users?limit=10&offset=1') + .set('x-access-token', token); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.users).to.be.an('array'); + expect(res.body.users).to.have.length(10); + }); + }); });