Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 10 additions & 12 deletions lib/routes/fruits.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,20 @@ router.get('/fruits/:id', (request, response) => {
const {id} = request.params;
fruits.find(id).then(result => {
if (result.rowCount === 0) {
response.status = 404;
response.status(404);
return response.send(`Item ${id} not found`);
}
return response.send(result.rows[0]);
}).catch((err) => {
response.status = 400;
response.send(err);
}).catch(() => {
response.sendStatus(400);
});
});

router.get('/fruits', (request, response) => {
fruits.findAll().then(results => {
response.send(results.rows);
}).catch((err) => {
response.status = 400;
response.send(err);
}).catch(() => {
response.sendStatus(400);
});
});

Expand All @@ -34,7 +32,7 @@ router.post('/fruits', validations.validateCreate, (request, response) => {
return fruits.create(name, stock).then(() => {
response.sendStatus(201);
}).catch((err) => {
response.status = 400;
response.status(400);
response.send(err);
});
});
Expand All @@ -44,12 +42,12 @@ router.put('/fruits/:id', validations.validateUpdate, (request, response) => {
const {id} = request.params;
fruits.update({name, stock, id}).then((result) => {
if (result.rowCount === 0) {
response.status = 404;
response.status(404);
return response.send(`Unknown item ${id}`);
}
return response.sendStatus(204);
}).catch((err) => {
response.status = 400;
response.status(400);
response.send(err);
});
});
Expand All @@ -58,12 +56,12 @@ router.delete('/fruits/:id', (request, response) => {
const {id} = request.params;
fruits.remove(id).then((result) => {
if (result.rowCount === 0) {
response.status = 404;
response.status(404);
return response.send(`Unknown item ${id}`);
}
return response.sendStatus(204);
}).catch((err) => {
response.status = 400;
response.status(400);
response.send(err);
});
});
Expand Down
24 changes: 8 additions & 16 deletions lib/validations/index.js
Original file line number Diff line number Diff line change
@@ -1,51 +1,43 @@
'use strict';

function validateCreate (request, response, next) {
if (!request.body) {
response.status = 400;
return response.send('The body must not be null');
}

// No need to check for no body, express will make body an empty object
const {name, stock, id} = request.body;

if (!name) {
response.status = 400;
response.status(400);
return response.send('The name must not be null');
}

if (!stock) {
response.status = 400;
response.status(400);
return response.send('The stock must not be greater or equal to 0');
}

if (id) {
response.status = 400;
response.status(400);
return response.send('The created item already contains an id');
}

next();
}

function validateUpdate (request, response, next) {
if (!request.body) {
response.status = 400;
return response.send('The body must not be null');
}

// No need to check for no body, express will make body an empty object
const {name, stock, id} = request.body;

if (!name) {
response.status = 400;
response.status(400);
return response.send('The name must not be null');
}

if (!stock) {
response.status = 400;
response.status(400);
return response.send('The stock must not be greater or equal to 0');
}

if (id && id !== request.params.id) {
response.status = 400;
response.status(400);
return response.send('The id cannot be changed');
}

Expand Down
54 changes: 54 additions & 0 deletions test/fruits-api-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
'use strict';

const test = require('tape');
const proxyquire = require('proxyquire');

const mockDb = {
query: () => {
return Promise.resolve();
}
};

const fruits = proxyquire('../lib/api/fruits', {
'../db': mockDb
});

test('test api methods', (t) => {
t.equal(typeof fruits.find, 'function', 'find method should be a function');
t.equal(typeof fruits.findAll, 'function', 'findAll method should be a function');
t.equal(typeof fruits.create, 'function', 'create method should be a function');
t.equal(typeof fruits.update, 'function', 'update method should be a function');
t.equal(typeof fruits.remove, 'function', 'remove method should be a function');

t.end();
});

test('test find all', (t) => {
const result = fruits.findAll();
t.equal(result instanceof Promise, true, 'should return a promise');
t.end();
});

test('test find', (t) => {
const result = fruits.find('id');
t.equal(result instanceof Promise, true, 'should return a promise');
t.end();
});

test('test create', (t) => {
const result = fruits.create('name', 'stock');
t.equal(result instanceof Promise, true, 'should return a promise');
t.end();
});

test('test update', (t) => {
const result = fruits.update({name: 'name', stock: 'stock', id: 1});
t.equal(result instanceof Promise, true, 'should return a promise');
t.end();
});

test('test remove', (t) => {
const result = fruits.remove('id');
t.equal(result instanceof Promise, true, 'should return a promise');
t.end();
});
Loading