UNPKG

5.18 kBtext/coffeescriptView Raw
1faker = require 'faker'
2uuid = require 'node-uuid'
3
4EventManager = require '../src/event-manager'
5{hash} = require './helpers'
6
7callAnnounceEvent = (manager, event) ->
8 room = null
9 message = null
10
11 manager.announceEvent event, (rm, msg) ->
12 room = rm
13 message = msg
14
15 [room, message]
16
17callReceiveHook = (manager, req) ->
18 event = null
19 manager.receiveHook req, (ev) ->
20 event = ev
21 event
22
23describe 'EventManager', ->
24 [body, guid, manager, robot, roomName, signature] = []
25
26 beforeEach ->
27 robot = {}
28 manager = new EventManager(robot)
29 robot.logger =
30 info: ->
31
32 spyOn(robot.logger, 'info')
33
34 describe 'receiveHook', ->
35 [eventName, guid, req] = []
36
37 beforeEach ->
38 body = faker.lorem.paragraphs()
39 eventName = faker.lorem.words(1)
40 guid = uuid.v4()
41 roomName = faker.lorem.words(1)
42 signature = hash()
43
44 req =
45 body: body
46 get: (param) ->
47 switch param
48 when 'X-Github-Delivery' then guid
49 when 'X-Github-Signature' then signature
50 when 'X-Github-Event' then eventName
51 query:
52 room: roomName
53
54 it 'sets the data element', ->
55 event = callReceiveHook(manager, req)
56
57 expect(event.data).toEqual body
58
59 it 'sets the event ID', ->
60 event = callReceiveHook(manager, req)
61
62 expect(event.id).toEqual guid
63
64 it 'sets the room name', ->
65 event = callReceiveHook(manager, req)
66
67 expect(event.room).toEqual roomName
68
69 it 'sets the signature', ->
70 event = callReceiveHook(manager, req)
71
72 expect(event.signature).toEqual signature
73
74 it 'sets the event type', ->
75 event = callReceiveHook(manager, req)
76
77 expect(event.type).toEqual eventName
78
79 describe 'when the room name is not part of the query string', ->
80 oldEnv = null
81
82 beforeEach ->
83 req.query.room = undefined
84 oldEnv = process.env
85 process.env =
86 HUBOT_GITHUB_EVENT_DEFAULT_ROOM: roomName
87
88 afterEach ->
89 process.env = oldEnv
90
91 it 'uses the default room name', ->
92 event = callReceiveHook(manager, req)
93
94 expect(event.room).toEqual roomName
95
96 describe 'announceEvent', ->
97 [event, formatters] = []
98
99 beforeEach ->
100 formatters = manager.getFormatters()
101 formatters.foo = (event) ->
102 event
103
104 spyOn(manager, 'getFormatters').andReturn(formatters)
105
106 body = faker.lorem.paragraphs()
107 guid = uuid.v4()
108 roomName = faker.lorem.words(1)
109 signature = hash()
110
111 event =
112 data: body
113 id: guid
114 room: roomName
115 signature: signature
116 type: 'foo'
117
118 it 'formats the event', ->
119 [_, message] = callAnnounceEvent(manager, event)
120
121 expect(message).toEqual event
122
123 it 'uses the event room to announce the event', ->
124 [room, _] = callAnnounceEvent(manager, event)
125
126 expect(room).toEqual roomName
127
128 describe 'when the event type is unrecognized', ->
129 beforeEach ->
130 event.type = 'bar'
131
132 it 'does not announce the event', ->
133 [room, message] = callAnnounceEvent(manager, event)
134
135 expect(room).toBeNull()
136 expect(message).toBeNull()
137
138 describe 'and the HUBOT_GITHUB_EVENT_ANNOUNCE_UNHANDLED variable is set', ->
139 oldEnv = null
140
141 beforeEach ->
142 oldEnv = process.env
143 process.env.HUBOT_GITHUB_EVENT_ANNOUNCE_UNHANDLED = true
144
145 afterEach ->
146 process.env = oldEnv
147
148 it 'uses the unhandled formatter', ->
149 [_, message] = callAnnounceEvent(manager, event)
150
151 expect(message).toEqual """
152 GitHub sent an event I don't understand: #{event.type}
153
154 #{JSON.stringify(event.data, null, 2)}
155 """
156
157 describe 'when the formatter returns null', ->
158 beforeEach ->
159 formatters.foo = (event) ->
160 null
161
162 it 'logs a message', ->
163 callAnnounceEvent(manager, event)
164
165 expect(robot.logger.info).toHaveBeenCalled()
166
167 describe 'when the formatter throws an exception', ->
168 beforeEach ->
169 formatters.foo = (event) ->
170 throw new Error('An error happened')
171
172 robot.emit = ->
173 spyOn(robot, 'emit')
174
175 it 'emits an error event', ->
176 callAnnounceEvent(manager, event)
177
178 expect(robot.emit).toHaveBeenCalled()
179 expect(robot.emit.mostRecentCall.args[0]).toEqual 'error'
180
181 describe 'and HUBOT_GITHUB_EVENT_ANNOUNCE_EXCEPTIONS is defined', ->
182 oldEnv = null
183
184 beforeEach ->
185 oldEnv = process.env
186 process.env =
187 HUBOT_GITHUB_EVENT_ANNOUNCE_EXCEPTIONS: true
188
189 robot.messageRoom = ->
190 spyOn(robot, 'messageRoom')
191
192 afterEach ->
193 process.env = oldEnv
194
195 it 'announces the exception', ->
196 [room, _] = callAnnounceEvent(manager, event)
197
198 expect(room).toEqual roomName
199 expect(robot.messageRoom).not.toHaveBeenCalled()
200
201 it 'still emits the error event', ->
202 callAnnounceEvent(manager, event)
203
204 expect(robot.emit).toHaveBeenCalled()
205 expect(robot.emit.mostRecentCall.args[0]).toEqual 'error'