Skip to content
This repository was archived by the owner on Jan 20, 2020. It is now read-only.

Commit ee8098f

Browse files
author
Luciano Nooijen
committed
Added Users controller
1 parent 470e7e1 commit ee8098f

File tree

3 files changed

+179
-1
lines changed

3 files changed

+179
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ POST routes are protected
1212

1313
* For testing add SQLite support
1414
* Fix Travis testing script, Postgres integration
15-
* Add authentication
15+
* Add authentication, password hashing -> also improve seed scripts
1616
* Set all Knex stuff to ./db folder
1717
* Create documentation, API documentation using Swagger
1818
* Add performance testing script, maybe using https://k6.io/

controllers/users.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
const knex = require('../helpers/database');
2+
3+
const listUsers = async () => {
4+
const Users = await knex.select('*').from('users');
5+
return Users;
6+
};
7+
8+
const getUser = async id => {
9+
const user = await knex
10+
.select('*')
11+
.from('users')
12+
.where({ id });
13+
return user[0];
14+
};
15+
16+
const addUser = async user => {
17+
const newUserData = {
18+
username: user.username,
19+
email: user.email,
20+
first_name: user.first_name,
21+
last_name: user.last_name,
22+
password: `${user.password}NONHASHED!`, // TODO: Add hashing
23+
author_id: user.author_id,
24+
};
25+
const returning = [
26+
'id',
27+
'username',
28+
'email',
29+
'first_name',
30+
'last_name',
31+
'password',
32+
'author_id',
33+
];
34+
const newUser = await knex('users')
35+
.insert([newUserData])
36+
.returning(returning);
37+
return newUser[0];
38+
};
39+
40+
const modifyUser = async (id, user) => {
41+
const {
42+
/* eslint-disable camelcase */
43+
username,
44+
email,
45+
first_name,
46+
last_name,
47+
password,
48+
author_id,
49+
} = user;
50+
const newUserData = {
51+
username,
52+
email,
53+
first_name,
54+
last_name,
55+
password,
56+
author_id,
57+
}; /* eslint-enable */
58+
const returning = [
59+
'id',
60+
'username',
61+
'email',
62+
'first_name',
63+
'last_name',
64+
'password',
65+
'author_id',
66+
];
67+
const oldUserData = getUser(id);
68+
const newUser = Object.assign({}, { ...oldUserData, ...newUserData });
69+
const modifiedUser = await knex('users')
70+
.returning(returning)
71+
.where('id', '=', id)
72+
.update(newUser);
73+
return modifiedUser[0];
74+
};
75+
76+
const deleteUser = async id =>
77+
knex('users')
78+
.returning(['id'])
79+
.where({ id })
80+
.delete();
81+
82+
module.exports = {
83+
listUsers,
84+
getUser,
85+
addUser,
86+
modifyUser,
87+
deleteUser,
88+
};

tests/database/users.test.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
const databaseSetup = require('../config/database-setup');
2+
const {
3+
listUsers,
4+
getUser,
5+
addUser,
6+
modifyUser,
7+
deleteUser,
8+
} = require('../../controllers/users');
9+
10+
beforeEach(done => databaseSetup(done));
11+
12+
const newUser = {
13+
username: 'anewuser',
14+
email: 'anewuser@domain.com',
15+
first_name: 'Jane',
16+
last_name: 'Doe',
17+
password: 'theplainpasswordgoeshere',
18+
author_id: 2,
19+
};
20+
21+
describe('Test if Users CRUD operations are working correctly', () => {
22+
test('Listing all Users should return rows', async () => {
23+
expect.assertions(1);
24+
const Users = await listUsers();
25+
expect(Users.length).toBeGreaterThan(0);
26+
});
27+
28+
test('Fetching a single User should return an User', async () => {
29+
expect.assertions(7);
30+
const user = await getUser(1);
31+
expect(user.id).toBe(1);
32+
expect(typeof user.username).toBe('string');
33+
expect(typeof user.email).toBe('string');
34+
expect(typeof user.first_name).toBe('string');
35+
expect(typeof user.last_name).toBe('string');
36+
expect(typeof user.password).toBe('string');
37+
expect(typeof user.author_id).toBe('number');
38+
});
39+
40+
test('Adding a new User should add a single row', async () => {
41+
expect.assertions(1);
42+
const UsersBefore = await listUsers();
43+
const userLengthBefore = UsersBefore.length;
44+
return addUser(newUser).then(async () => {
45+
const UsersAfter = await listUsers();
46+
const userLengthAfter = UsersAfter.length;
47+
expect(userLengthAfter).toBe(userLengthBefore + 1);
48+
});
49+
});
50+
51+
test('Adding a new User should return the new User', async () => {
52+
expect.assertions(7);
53+
const addedUser = await addUser(newUser);
54+
expect(typeof addedUser.id).toBe('number');
55+
expect(addedUser.username).toBe(newUser.username);
56+
expect(addedUser.email).toBe(newUser.email);
57+
expect(addedUser.first_name).toBe(newUser.first_name);
58+
expect(addedUser.last_name).toBe(newUser.last_name);
59+
expect(addedUser.password).not.toBe(newUser.password); // Hashed pass
60+
expect(addedUser.author_id).toBe(newUser.author_id);
61+
});
62+
63+
test('Updating an User should return the modified data', async () => {
64+
expect.assertions(15);
65+
const originalUser = await getUser(1);
66+
expect(originalUser.id).toBe(1);
67+
expect(originalUser.username).not.toBe(newUser.username);
68+
expect(originalUser.email).not.toBe(newUser.email);
69+
expect(originalUser.first_name).not.toBe(newUser.first_name);
70+
expect(originalUser.last_name).not.toBe(newUser.last_name);
71+
expect(originalUser.password).not.toBe(newUser.password);
72+
expect(originalUser.author_id).not.toBe(newUser.author_id);
73+
const modifiedUser = await modifyUser(1, newUser);
74+
expect(modifiedUser.id).toBeDefined();
75+
expect(typeof modifiedUser.id).toBe('number');
76+
expect(modifiedUser.username).toBe(newUser.username);
77+
expect(modifiedUser.email).toBe(newUser.email);
78+
expect(modifiedUser.first_name).toBe(newUser.first_name);
79+
expect(modifiedUser.last_name).toBe(newUser.last_name);
80+
expect(modifiedUser.password).toBe(newUser.password);
81+
expect(modifiedUser.author_id).toBe(newUser.author_id);
82+
});
83+
84+
test('Deleting an User should return undefined', async () => {
85+
expect.assertions(2);
86+
return deleteUser(1)
87+
.then(data => expect(data.id).toBe(undefined))
88+
.then(async () => expect(await getUser(1)).toBeUndefined());
89+
});
90+
});

0 commit comments

Comments
 (0)