blob: 2f6a8fb386000c95cdfcb0607e20c81bb36dda60 [file] [log] [blame]
Zack Williamsea89ebb2018-09-07 12:37:36 -07001/*
2 * Copyright 2017-present Open Networking Foundation
Zack Williamsea89ebb2018-09-07 12:37:36 -07003 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
Zack Williamsea89ebb2018-09-07 12:37:36 -07006 * http://www.apache.org/licenses/LICENSE-2.0
Zack Williamsea89ebb2018-09-07 12:37:36 -07007 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
12 */
13
14(function () {
15 'use strict';
16
17 const chai = require('chai');
18 const expect = chai.expect;
19 const sinon = require('sinon');
20 const sinonChai = require('sinon-chai');
21 const mockery = require('mockery');
22 chai.use(sinonChai);
23
24 const socketSpy = sinon.spy();
25
26 const mockSocket = {
27 get: () => {
28 return {
29 emit: socketSpy
30 }
31 }
32 };
33
Zack Williamsea89ebb2018-09-07 12:37:36 -070034 const fakekafka = {
35 KafkaConsumer: {
Matteo Scandolof1523582018-09-28 18:03:09 +020036 createReadStream: sinon.stub()
Zack Williamsea89ebb2018-09-07 12:37:36 -070037 }
38 }
39
40 const channelName = 'Site';
41 const msgTopic = 'xos.gui_events';
42
43 describe('The event system', () => {
44
Matteo Scandolof1523582018-09-28 18:03:09 +020045 before(() => {
Zack Williamsea89ebb2018-09-07 12:37:36 -070046
47 // Enable mockery to mock objects
48 mockery.enable({
49 warnOnReplace: false,
50 warnOnUnregistered: false
51 });
52
53 // Override the node-rdkafka module with our fakekafka instance
54 mockery.registerMock('node-rdkafka', fakekafka);
55
56 // mock the socketIo client to have a spy
57 mockery.registerMock('./websocket.js', mockSocket);
58
Zack Williamsea89ebb2018-09-07 12:37:36 -070059 });
60
61 after(() => {
62 mockery.disable();
63 });
64
65 // run after each test
66 beforeEach(() => {
67 socketSpy.reset();
68 });
69
Matteo Scandolof1523582018-09-28 18:03:09 +020070 afterEach(() => {
71 var name = require.resolve('../src/controllers/kafka.js');
72 delete require.cache[name];
Zack Williamsea89ebb2018-09-07 12:37:36 -070073 });
74
Matteo Scandolof1523582018-09-28 18:03:09 +020075 describe('when connection fails', () => {
76 beforeEach((done) => {
77 fakekafka.KafkaConsumer.createReadStream
78 .onFirstCall().throws()
79 .onSecondCall().returns(true)
Zack Williamsea89ebb2018-09-07 12:37:36 -070080
Matteo Scandolof1523582018-09-28 18:03:09 +020081 require('../src/controllers/kafka.js');
82 setTimeout(() => {
83 done();
84 }, 10);
85 });
86
87 it('should try to reconnect after 5 seconds', (done) => {
88 setTimeout(() => {
89 expect(fakekafka.KafkaConsumer.createReadStream.calledTwice).to.be.true;
90 done();
91 }, 6 * 1000);
92 }).timeout(7 * 1000);
93
94 afterEach(() => {
95 fakekafka.KafkaConsumer.createReadStream = sinon.stub()
96 })
Zack Williamsea89ebb2018-09-07 12:37:36 -070097 });
98
Matteo Scandolof1523582018-09-28 18:03:09 +020099 describe('when is connected', () => {
100 const trigger = {}
Zack Williamsea89ebb2018-09-07 12:37:36 -0700101
Matteo Scandolof1523582018-09-28 18:03:09 +0200102 const mockStream = {
103 on: (event, cb) => {
104 trigger[event] = cb
105 },
106 consumer: {
107 on: sinon.spy()
108 }
109 }
110 beforeEach((done) => {
111 fakekafka.KafkaConsumer.createReadStream.returns(mockStream)
112 require('../src/controllers/kafka.js');
113
114 setTimeout(() => {
115 done();
116 }, 10);
117 });
118
119 it('should send a websocket event when text Kafka event is received', (done) => {
120 trigger.data({topic:msgTopic,
121 key:channelName,
122 timestamp:1234,
123 value:'I am sending a message.',
124 });
125
126 setTimeout(() => {
127 expect(socketSpy).to.have.been.called;
128 expect(socketSpy).to.have.been.calledWith('update', {
129 model: channelName,
130 msg: 'I am sending a message.'
131 });
132 done();
133 }, 500)
134 });
135
136 it('should send a websocket event when JSON Kafka event is received', (done) => {
137 trigger.data({topic:msgTopic,
138 key:channelName,
139 timestamp:2345,
140 value:JSON.stringify({msg: 'JSON Message'}),
141 });
142
143 setTimeout(() => {
144 expect(socketSpy).to.have.been.called;
145 expect(socketSpy).to.have.been.calledWith('update', {
146 model: channelName,
147 msg: {msg: 'JSON Message'}
148 });
149 done();
150 }, 1000)
151 });
152
153 it('should send a websocket event with msg: Deleted when JSON object has deleted:true', (done) => {
154 trigger.data({topic:msgTopic,
155 key:channelName,
156 timestamp:3456,
157 value:JSON.stringify({msg: 'Deleted', deleted: true}),
158 });
159
160 setTimeout(() => {
161 expect(socketSpy).to.have.been.called;
162 expect(socketSpy).to.have.been.calledWith('remove', {
163 model: channelName,
164 msg: {
165 msg: 'Deleted',
166 deleted: true
167 },
Zack Williamsea89ebb2018-09-07 12:37:36 -0700168 deleted: true
Matteo Scandolof1523582018-09-28 18:03:09 +0200169 });
170
171 done();
172 }, 1000)
173 });
174
175 it('should not send a websocket event if the Kafka key is Diag', (done) => {
176 trigger.data({topic:msgTopic,
177 key:'Diag',
178 timestamp:4567,
179 value:JSON.stringify({msg: 'Diag Message'}),
180 });
181
182 setTimeout(() => {
183 expect(socketSpy).not.to.have.been.called;
184 done();
185 }, 1000)
186 });
Zack Williamsea89ebb2018-09-07 12:37:36 -0700187 });
Zack Williamsea89ebb2018-09-07 12:37:36 -0700188 });
Matteo Scandolof1523582018-09-28 18:03:09 +0200189})();