/* eslint-disable no-undef */
'use strict';
const assert = require('assert');
const supertest = require('supertest');
const proxyquire = require('proxyquire');
const mockDb = {
init: () => {
return Promise.resolve();
}
};
describe('Fruits', () => {
it('get all', async () => {
const mockApi = {
findAll: () => Promise.resolve({ rows: [{ id: 1 }] })
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const { body } = await supertest(app)
.get('/api/fruits')
.expect('Content-Type', /json/)
.expect(200);
assert.strictEqual(Array.isArray(body), true);
assert.strictEqual(body.length, 1);
});
it('get all error', async () => {
const mockApi = {
findAll: () => Promise.reject(new Error('error'))
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.get('/api/fruits')
.expect(400);
assert.strictEqual(response.statusCode, 400);
});
it('get one', async () => {
const mockApi = {
find: id => {
assert.strictEqual(id, '1');
return Promise.resolve({ rows: [{ id }] });
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const { body } = await supertest(app)
.get('/api/fruits/1')
.expect('Content-Type', /json/)
.expect(200);
assert.strictEqual(Array.isArray(body), false);
assert.strictEqual(body.id, '1');
});
it('get one - return 404', async () => {
const mockApi = {
find: () => Promise.resolve({ rowCount: 0 })
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.get('/api/fruits/1')
.expect(404);
assert.strictEqual(response.text, 'Item 1 not found');
});
it('get one - error', async () => {
const mockApi = {
find: () => Promise.reject(new Error('error'))
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.get('/api/fruits/1')
.expect(400);
assert.strictEqual(response.statusCode, 400);
});
it('post', async () => {
const fruitData = {
name: 'Banana',
stock: 10
};
const mockApi = {
create: (name, stock) => {
assert.strictEqual(name, fruitData.name);
assert.strictEqual(stock, fruitData.stock);
return Promise.resolve({ rows: [] });
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.post('/api/fruits')
.send(fruitData)
.expect(201);
assert.strictEqual(response.statusCode, 201);
});
it('post - error - no name', async () => {
const fruitData = {
stock: 10
};
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.send(fruitData)
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The name is required!');
});
it('post - error - no stock', async () => {
const fruitData = {
name: 'Banana'
};
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.send(fruitData)
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
});
it('post - error - id error', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.send({ name: 'Banana', stock: 10, id: 22 })
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'Id was invalidly set on request.');
});
it('post - error', async () => {
const fruitData = {
name: 'Banana',
stock: 10
};
const mockApi = {
create: () => {
return Promise.reject(new Error('error'));
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.post('/api/fruits')
.send(fruitData)
.expect(400);
assert.strictEqual(response.statusCode, 400);
});
it('post - error - id error', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.send({ name: 'Banana', stock: 10, id: 22 })
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'Id was invalidly set on request.');
});
it('post - error - no payload', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('post - error - invalid payload', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.set('Content-Type', 'application/json')
.send('Some text')
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('post - error - xml payload', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const xmlFruitData = 'Banana10';
const response = await supertest(app)
.post('/api/fruits')
.set('Content-Type', 'application/xml')
.send(xmlFruitData)
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('post - error - JSON Content-Type and XML body', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const xmlFruitData = 'adam10';
const response = await supertest(app)
.post('/api/fruits')
.set('Content-Type', 'application/json')
.send(xmlFruitData)
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('post - error - negative number of stock', async () => {
const fruitData = {
name: 'Banana',
stock: -10
};
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.send(fruitData)
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
});
it('post - error - no numeric stock', async () => {
const fruitData = {
name: 'Banana',
stock: 'two'
};
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.post('/api/fruits')
.send(fruitData)
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
});
it('put', async () => {
const fruitData = {
name: 'Banana',
stock: 10,
id: '20'
};
const mockApi = {
update: options => {
assert.strictEqual(options.name, fruitData.name);
assert.strictEqual(options.stock, fruitData.stock);
assert.strictEqual(options.id, fruitData.id);
return Promise.resolve({ rowCount: 1 });
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.put('/api/fruits/20')
.send(fruitData)
.expect(204);
assert.strictEqual(response.statusCode, 204);
});
it('put - error - no name', async () => {
const fruitData = {
stock: 10
};
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.put('/api/fruits/20')
.expect(422)
.send(fruitData);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The name is required!');
});
it('put - error - no stock', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.put('/api/fruits/20')
.send({ name: 'name' })
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
});
it('put - error - id error', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.put('/api/fruits/20')
.send({ name: 'Banana', stock: 10, id: '22' })
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'Id was invalidly set on request.');
});
it('put - error - not found', async () => {
const fruitData = {
name: 'Banana',
stock: 10,
id: '20'
};
const mockApi = {
update: () => {
return Promise.resolve({ rowCount: 0 });
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.put('/api/fruits/20')
.send(fruitData)
.expect(404);
assert.strictEqual(response.statusCode, 404);
assert.strictEqual(response.text, 'Unknown item 20');
});
it('put - error', async () => {
const fruitData = {
name: 'Banana',
stock: 10,
id: '22'
};
const mockApi = {
update: () => {
return Promise.reject(new Error('error'));
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.put('/api/fruits/22')
.send(fruitData)
.expect(400);
assert.strictEqual(response.statusCode, 400);
});
it('put - error - no payload', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.put('/api/fruits/20')
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('put - error - invalid payload', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.put('/api/fruits/20')
.set('Content-Type', 'application/json')
.send('Some text')
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('put - error - xml payload', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const xmlFruitData = 'Banana10';
const response = await supertest(app)
.put('/api/fruits/10')
.set('Content-Type', 'application/xml')
.send(xmlFruitData)
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('put - error - JSON Content-Type and XML body', async () => {
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const xmlFruitData = 'adam10';
const response = await supertest(app)
.put('/api/fruits/10')
.set('Content-Type', 'application/json')
.send(xmlFruitData)
.expect(415);
assert.strictEqual(response.statusCode, 415);
assert.strictEqual(response.text, 'Invalid payload!');
});
it('put - error - no numeric stock', async () => {
const fruitData = {
name: 'Banana',
stock: 'two'
};
const app = proxyquire('../app', {
'./lib/db': mockDb
});
const response = await supertest(app)
.put('/api/fruits/10')
.send(fruitData)
.expect(422);
assert.strictEqual(response.statusCode, 422);
assert.strictEqual(response.text, 'The stock must be greater or equal to 0!');
});
it('delete', async () => {
const mockApi = {
remove: id => {
assert.strictEqual(id, '1');
return Promise.resolve({ rowCount: 1 });
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.delete('/api/fruits/1')
.expect(204);
assert.strictEqual(response.statusCode, 204);
});
it('delete - error - not found', async () => {
const mockApi = {
remove: () => {
return Promise.resolve({ rowCount: 0 });
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.delete('/api/fruits/1')
.expect(404);
assert.strictEqual(response.statusCode, 404);
assert.strictEqual(response.text, 'Unknown item 1');
});
it('delete - error', async () => {
const mockApi = {
remove: () => {
return Promise.reject(new Error('error'));
}
};
// Mock the nested require
const routesStub = proxyquire('../lib/routes/fruits', {
'../api/fruits': mockApi
});
const app = proxyquire('../app', {
'./lib/db': mockDb,
'./lib/routes/fruits': routesStub
});
const response = await supertest(app)
.delete('/api/fruits/1')
.expect(400);
assert.strictEqual(response.statusCode, 400);
});
});