Skip to content

Commit

Permalink
feature/implement-delete-function
Browse files Browse the repository at this point in the history
- implement delete function
- implement fetch all centers function
- write tests for fetch function
- write tests for delete function
- write more tests to cover edge cases in the user controller
  • Loading branch information
Billmike committed Apr 15, 2018
1 parent 826e84b commit c9354ab
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 17 deletions.
41 changes: 41 additions & 0 deletions server/controllers/center.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,47 @@ class CenterController {
});
});
}

static deleteCenter(request, response) {
const { username } = request.userDetails;
Center.findById(request.params.centerId)
.then((center) => {
if (!center) {
return response.status(404).json({
message: 'Center not found.'
});
}
if (username !== 'adminuser') {
return response.status(401).json({
message: 'You need admin priviledges to access this resource'
});
}
return center.destroy().then(() => {
response.status(200).json({
message: 'Center deleted successfully',
deletedCenter: center
});
});
}).catch(() => {
return response.status(500).json({
message: serverError
});
});
}

static getCenters(request, response) {
Center.all()
.then((centers) => {
return response.status(200).json({
message: 'Centers fetched successfully.',
centerData: centers
});
}).catch(() => {
return response.status(500).json({
message: serverError
});
});
}
}

export default CenterController;
5 changes: 5 additions & 0 deletions server/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,9 @@ module.exports = (app) => {
'/api/v1/centers/:centerId', sessionControl.isLoggedIn,
sessionControl.isUser, centerController.editCenter
);
app.delete(
'/api/v1/center/:centerId', sessionControl.isLoggedIn,
sessionControl.isUser, centerController.deleteCenter
);
app.get('/api/v1/centers', centerController.getCenters);
};
75 changes: 75 additions & 0 deletions server/tests/center.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dummyUser, { adminUser } from './seed/userseed';

const request = supertest(app);
const centerApi = '/api/v1/centers';
const deleteCenter = '/api/v1/center';

describe('Tests for Centers endpoint', () => {
describe('Test create center endpoint', () => {
Expand Down Expand Up @@ -191,5 +192,79 @@ describe('Tests for Centers endpoint', () => {
done();
});
});
it('should throw an error if the center to be edited does not exist', (done) => {
request.put(`${centerApi}/400?token=${adminUser.token}`)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(centerSeed)
.end((error, response) => {
expect(response.status).to.equal(404);
done();
});
});
it('should successfully modify a center\'s detail', (done) => {
const testCenter = { ...centerSeed };
testCenter.description = 'Brand new center here';
request.put(`${centerApi}/${centerSeed.id}?token=${adminUser.token}`)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(testCenter)
.end((error, response) => {
expect(response.status).to.equal(201);
done();
});
});
});
describe('Delete center endpoint', () => {
it('Should return an error if the user is not an admin', (done) => {
request.delete(`${deleteCenter}/${centerSeed
.id}?token=${dummyUser.token}`)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(centerSeed)
.end((error, response) => {
expect(response.status).to.equal(401);
done();
});
});
it('should return an error if the center does not exist', (done) => {
request.delete(`${deleteCenter}/100?token=${adminUser.token}`)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.end((error, response) => {
expect(response.status).to.equal(404);
done();
});
});
it(
'should successfully delete a center if the user is an admin',
(done) => {
request.delete(`${deleteCenter}/${centerSeed
.id}?token=${adminUser.token}`)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.end((error, response) => {
expect(response.status).to.equal(200);
done();
});
}
);
});
describe('Get all centers endpoint', () => {
it('should fetch all centers in the application', (done) => {
request.get(centerApi)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.end((error, response) => {
expect(response.status).to.equal(200);
done();
});
});
})
});
71 changes: 71 additions & 0 deletions server/tests/user.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,44 @@ describe('Integration tests for Authentication', () => {
done();
});
});
it(
'should fail to sign up a user if the email is already registered',
(done) => {
const testUser = {
username: 'randomuser',
email: 'qwertyuiop@gmail.com',
password: 'qwertyuiop'
};
request.post(signupAPI)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(testUser)
.end((error, response) => {
expect(response.status).to.equal(409);
expect(response.body).to.be.an('object');
expect(response.body.message)
.to.equal('This email is already taken.');
done();
});
}
);
it('should fail to sign up a user of the username already exists', (done) => {
const testUser = {
username: 'piedpiper',
email: 'randomemail@gmail.com',
password: 'qwertyuiop'
};
request.post(signupAPI)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(testUser)
.end((error, response) => {
expect(response.status).to.equal(409);
done();
});
});
it(
'should successfully create a user when all relevant data is supplied',
(done) => {
Expand Down Expand Up @@ -150,6 +188,39 @@ describe('Integration tests for Authentication', () => {
});
}
);
it(
'should fail if the user provides a wrong password for an email that exists',
(done) => {
const testUser = {
email: dummyUser.email,
password: dummyUser.password
};
testUser.password = 'zxcvbnmasdf';
request.post(signinAPI)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(testUser)
.end((error, response) => {
expect(response.status).to.equal(400);
expect(response.body.message)
.to.equal('Invalid email or password.');
done();
});
}
);
it('should fail if the email is unregistered', (done) => {
const testUser = { email: 'asdfg@gmail.com', password: 'qwertyuiop' };
request.post(signinAPI)
.set('Connection', 'keep alive')
.set('Content-Type', 'application/json')
.type('form')
.send(testUser)
.end((error, response) => {
expect(response.status).to.equal(400);
done();
});
});
it('should sign-in a user that is already signed up', (done) => {
const testUser = { email: dummyUser.email, password: dummyUser.password };
request.post(signinAPI)
Expand Down
8 changes: 0 additions & 8 deletions server/validators/validateSignin.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@ const validateEmail = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;

const validateSignin = (userData) => {
const errors = {};
if (
(userData.email === undefined ||
userData.email.trim() === '' ||
!validateEmail.test(userData.email)) &&
(userData.password === undefined || userData.password.trim() === '')
) {
errors.requiredFields = 'All fields are required.';
}
if (
userData.email === undefined ||
userData.email.trim() === '' ||
Expand Down
9 changes: 0 additions & 9 deletions server/validators/validateSignup.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@ const validateEmail = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;

const validateSignup = (userData) => {
const errors = {};
if (
(userData.username === undefined || userData.username.trim() === '') &&
(userData.email === undefined ||
userData.email.trim() === '' ||
!validateEmail.test(userData.email)) &&
(userData.password === undefined || userData.password.trim() === '')
) {
errors.requiredFields = 'All fields are required.';
}
if (
userData.username === undefined ||
userData.username.trim() === '' ||
Expand Down

0 comments on commit c9354ab

Please sign in to comment.