1 | faker = require 'faker'
|
2 | uuid = require 'node-uuid'
|
3 |
|
4 | EventManager = require '../src/event-manager'
|
5 | {hash} = require './helpers'
|
6 |
|
7 | callAnnounceEvent = (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 |
|
17 | callReceiveHook = (manager, req) ->
|
18 | event = null
|
19 | manager.receiveHook req, (ev) ->
|
20 | event = ev
|
21 | event
|
22 |
|
23 | describe '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'
|