blob: 05ddadcc453b96595d29b94510148e8de26a00b6 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
const chai = require('chai');
const expect = chai.expect;
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const mockery = require('mockery');
chai.use(sinonChai);
const fakeredis = require('fakeredis');
const client = fakeredis.createClient('test-client');
const publisher = fakeredis.createClient('test-client');
const socketSpy = sinon.spy();
const mockSocket = {
get: () => {
return {
emit: socketSpy
}
}
};
const mockRequest = {
get: () => {
return {
end: (fn) => {
fn(null, {body: [
{name: 'Slice'},
{name: 'Site'}
]});
}
}
}
}
const channelName = 'Site';
describe('The event system', () => {
before((done) => {
// Enable mockery to mock objects
mockery.enable({
warnOnReplace: false,
warnOnUnregistered: false
});
// Stub the createClient method to *always* return the client created above
sinon.stub(fakeredis, 'createClient', () => client);
// Override the redis module with our fakeredis instance
mockery.registerMock('redis', fakeredis);
// Override the superagent module with our mockRequest instance
mockery.registerMock('superagent', mockRequest);
// mock the socketIo client to have a spy
mockery.registerMock('./websocket.js', mockSocket);
require('../src/controllers/redis.js');
setTimeout(() => {
done();
}, 1000);
});
after(() => {
mockery.disable();
fakeredis.createClient.restore();
});
// run after each test
beforeEach(() => {
client.unsubscribe(channelName);
client.subscribe(channelName);
publisher.flushdb();
socketSpy.reset();
});
it('should send a websocket event when it receive a redis event that is not JSON', (done) => {
publisher.publish(channelName, 'I am sending a message.');
setTimeout(() => {
expect(socketSpy).to.have.been.called;
expect(socketSpy).to.have.been.calledWith('update', {
model: channelName,
msg: 'I am sending a message.'
});
done();
}, 500)
});
it('should send a websocket event when it receive a redis event that is JSON', (done) => {
publisher.publish(channelName, JSON.stringify({msg: 'Json Message'}));
setTimeout(() => {
expect(socketSpy).to.have.been.called;
expect(socketSpy).to.have.been.calledWith('update', {
model: channelName,
msg: {msg: 'Json Message'}
});
done();
}, 1000)
});
it('should send a websocket event when an object has been removed', (done) => {
publisher.publish(channelName, JSON.stringify({msg: 'Deleted', deleted: true}));
setTimeout(() => {
expect(socketSpy).to.have.been.called;
expect(socketSpy).to.have.been.calledWith('remove', {
model: channelName,
msg: {
msg: 'Deleted',
deleted: true
},
deleted: true
});
done();
}, 1000)
});
it('should not send a websocket event if the channel is Diag', (done) => {
publisher.publish('Diag', JSON.stringify({msg: 'Json Message'}));
setTimeout(() => {
expect(socketSpy).not.to.have.been.called;
done();
}, 1000)
});
});
})();