mockingjay.js
Version:
"Provides Mockdata or downloads it from predefined REST services"
260 lines (227 loc) • 9.21 kB
JavaScript
const rewire = require('rewire')
const nock = require('nock')
const server = rewire('./index.js')
const mylog = console.log.bind(console);
const mockConsole = jasmine.createSpyObj('mockConsole', [
'info',
'error',
'log'
]);
mockConsole.log.and.callFake(console.log.bind(console));
server.__set__({
console: mockConsole
})
const chai = require('chai')
const chaiHttp = require('chai-http')
const should = chai.should()
chai.use(chaiHttp)
const wrapDb = require('../db')
const dbWrite = jasmine.createSpy('db.write')
const initDb = (dbObj) => {
/* Since lowdb does not implement a write method when running it in
* memory only, we have to mock this function
*/
const db = wrapDb.wrapDb(dbObj)
dbWrite.calls.reset()
db.write = dbWrite
return db
}
describe('server', () => {
'use strict';
const port = 3000
describe('dbIntegrityMode', () => {
const db = initDb({});
let instance;
afterEach(() => {
instance.close()
});
it('should get possible value, default value and current value', (done) => {
instance = server.init(db, port);
chai.request(instance)
.get('/dbIntegrityMode')
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200);
res.body.should.deep.equal({
"availableValues": [
"READONLY",
"OVERWRITE"
],
"defaultValue": "READONLY",
"dbIntegrityMode": "READONLY"
})
done()
})
})
it('should put provided value', (done) => {
instance = server.init(db, port);
chai.request(instance)
.put('/dbIntegrityMode')
.send({dbIntegrityMode: 'OVERWRITE'})
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200)
chai.request(instance)
.get('/dbIntegrityMode')
.end((err, res) => {
res.body.dbIntegrityMode.should.equal('OVERWRITE')
done()
})
})
})
it('should fail on invalid value', (done) => {
instance = server.init(db, port);
chai.request(instance)
.put('/dbIntegrityMode')
.send({dbIntegrityMode: 'invalid value'})
.end((err, res) => {
res.should.have.status(400)
expect(res.body.error).toBeDefined();
chai.request(instance)
.get('/dbIntegrityMode')
.end((err, res) => {
res.body.dbIntegrityMode.should.equal(res.body.defaultValue)
done()
})
})
})
})
describe('db datas in different modes', () => {
const getMockData = {
'foo': 'bar'
}
const postMockData = {
'zoo': 'bar'
}
const getMissingMockData = {
'bar': 'foo'
}
const postMissingMockData = {
'zoo': 'foo'
}
let db, instance
beforeEach(() => {
db = initDb({
'http%3A%2F%2Fwww%2Ealready-stored-url%2Ecom%3Fparam%3D42': {
'GET': getMockData,
'POST': postMockData
}
})
instance = server.init(db, port)
nock('http://www.not-yet-stored-url.com')
.get('/')
.query({
param: 42
})
.reply(200, getMissingMockData)
nock('http://www.another-not-yet-stored-url.com')
.post('/')
.query({
param: 42
})
.reply(200, postMissingMockData)
})
afterEach(() => {
instance.close()
});
describe('READONLY', () => {
beforeEach((done) => {
chai.request(instance)
.put('/dbIntegrityMode')
.send({dbIntegrityMode: 'READONLY'})
.end(done)
})
it('should GET http://www.already-stored-url.com?param=42', (done) => {
chai.request(instance)
.get('/urls/http%3A%2F%2Fwww.already-stored-url.com%3Fparam%3D42')
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200)
res.body.should.deep.equal(getMockData)
done()
})
})
it('should fail on GET http://www.not-yet-stored-url.com?param=42', (done) => {
chai.request(instance)
.get('/urls/http%3A%2F%2Fwww%2Enot-yet-stored-url%2Ecom%3Fparam%3D42')
.end((err, res) => {
res.should.have.status(404)
done()
})
})
it('should return POST-Result http://www.already-stored-url.com?param=42', (done) => {
chai.request(instance)
.post('/urls/http%3A%2F%2Fwww.already-stored-url%2Ecom%3Fparam%3D42')
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200)
res.body.should.deep.equal(postMockData)
done()
})
})
})
describe('OVERWRITE', () => {
beforeEach((done) => {
chai.request(instance)
.put('/dbIntegrityMode')
.send({dbIntegrityMode: 'OVERWRITE'})
.end(done)
})
it('should GET http://www.not-yet-stored-url.com?param=42', (done) => {
chai.request(instance)
.get('/urls/http%3A%2F%2Fwww.not-yet-stored-url.com%3Fparam%3D42')
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200)
res.body.should.deep.equal(getMissingMockData)
expect(dbWrite).toHaveBeenCalled()
done()
})
})
it('should POST http://www.another-not-yet-stored-url.com?param=42', (done) => {
chai.request(instance)
.post('/urls/http%3A%2F%2Fwww.another-not-yet-stored-url.com%3Fparam%3D42')
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200)
res.body.should.deep.equal(postMissingMockData)
expect(dbWrite).toHaveBeenCalled()
done()
})
})
it('should store data in database so that a later call will not fail in READONLY mode', (done) => {
chai.request(instance)
.get('/urls/http%3A%2F%2Fwww%2Enot-yet-stored-url%2Ecom%3Fparam%3D42')
.end((err, res) => {
chai.request(instance)
.put('/dbIntegrityMode')
.send({dbIntegrityMode: 'READONLY'})
.end((err, putRes) => {
chai.request(instance)
.get('/urls/http%3A%2F%2Fwww%2Enot-yet-stored-url%2Ecom%3Fparam%3D42')
.end((err, res) => {
expect(err).toBeNull()
res.should.have.status(200)
res.body.should.deep.equal(getMissingMockData)
done()
})
})
})
})
})
})
describe('callback', () => {
const db = initDb({});
let instance
afterEach(() => {
instance.close()
})
it('should call the callback when server is started', (done) => {
const cb = jasmine.createSpy().and.callFake(done)
instance = server.init(db, port, cb)
// In this tick, callback must not yet be called. It should be called
// later, which is proven by calling done properly
expect(cb).not.toHaveBeenCalled()
})
})
})