blob: 17df04ed0fece14ae91a06582968b2a27028c86d [file] [log] [blame]
Zack Williamsea89ebb2018-09-07 12:37:36 -07001/*
2 * Copyright 2017-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17(function () {
18 'use strict';
19
20 const chai = require('chai');
21 const expect = chai.expect;
22 const sinon = require('sinon');
23 const sinonChai = require('sinon-chai');
24 const mockery = require('mockery');
25 chai.use(sinonChai);
26
27 const socketSpy = sinon.spy();
28
29 const mockSocket = {
30 get: () => {
31 return {
32 emit: socketSpy
33 }
34 }
35 };
36
37 const trigger = {}
38
39 const mockStream = {
40 on: (event, cb) => {
41 trigger[event] = cb
42 },
43 consumer: {
44 on: sinon.spy()
45 }
46 }
47
48 const fakekafka = {
49 KafkaConsumer: {
50 createReadStream: () => mockStream
51 }
52 }
53
54 const channelName = 'Site';
55 const msgTopic = 'xos.gui_events';
56
57 describe('The event system', () => {
58
59 before((done) => {
60
61 // Enable mockery to mock objects
62 mockery.enable({
63 warnOnReplace: false,
64 warnOnUnregistered: false
65 });
66
67 // Override the node-rdkafka module with our fakekafka instance
68 mockery.registerMock('node-rdkafka', fakekafka);
69
70 // mock the socketIo client to have a spy
71 mockery.registerMock('./websocket.js', mockSocket);
72
73 require('../src/controllers/kafka.js');
74 setTimeout(() => {
75 done();
76 }, 1000);
77 });
78
79 after(() => {
80 mockery.disable();
81 });
82
83 // run after each test
84 beforeEach(() => {
85 socketSpy.reset();
86 });
87
88 it('should send a websocket event when text Kafka event is received', (done) => {
89 trigger.data({topic:msgTopic,
90 key:channelName,
91 timestamp:1234,
92 value:'I am sending a message.',
93 });
94
95 setTimeout(() => {
96 expect(socketSpy).to.have.been.called;
97 expect(socketSpy).to.have.been.calledWith('update', {
98 model: channelName,
99 msg: 'I am sending a message.'
100 });
101 done();
102 }, 500)
103 });
104
105 it('should send a websocket event when JSON Kafka event is received', (done) => {
106 trigger.data({topic:msgTopic,
107 key:channelName,
108 timestamp:2345,
109 value:JSON.stringify({msg: 'JSON Message'}),
110 });
111
112 setTimeout(() => {
113 expect(socketSpy).to.have.been.called;
114 expect(socketSpy).to.have.been.calledWith('update', {
115 model: channelName,
116 msg: {msg: 'JSON Message'}
117 });
118 done();
119 }, 1000)
120 });
121
122 it('should send a websocket event with msg: Deleted when JSON object has deleted:true', (done) => {
123 trigger.data({topic:msgTopic,
124 key:channelName,
125 timestamp:3456,
126 value:JSON.stringify({msg: 'Deleted', deleted: true}),
127 });
128
129 setTimeout(() => {
130 expect(socketSpy).to.have.been.called;
131 expect(socketSpy).to.have.been.calledWith('remove', {
132 model: channelName,
133 msg: {
134 msg: 'Deleted',
135 deleted: true
136 },
137 deleted: true
138 });
139
140 done();
141 }, 1000)
142 });
143
144 it('should not send a websocket event if the Kafka key is Diag', (done) => {
145 trigger.data({topic:msgTopic,
146 key:'Diag',
147 timestamp:4567,
148 value:JSON.stringify({msg: 'Diag Message'}),
149 });
150
151 setTimeout(() => {
152 expect(socketSpy).not.to.have.been.called;
153 done();
154 }, 1000)
155 });
156
157 });
158})();