UNPKG

9.93 kBtext/coffeescriptView Raw
1path = require 'path'
2chai = require 'chai'
3sinon = require 'sinon'
4chai.use require 'sinon-chai'
5_ = require 'lodash'
6Robot = require 'hubot/src/robot'
7Brain = require 'hubot/src/brain'
8TextMessage = require('hubot/src/message').TextMessage
9
10expect = chai.expect
11
12# to avoid EventEmitter memory leak warning
13process.setMaxListeners(20)
14
15describe 'active-owner script', ->
16 beforeEach ->
17 @robot =
18 respond: sinon.spy()
19 hear: sinon.spy()
20 brain: data: {}
21 on: sinon.spy()
22 router: post: sinon.spy()
23 require('../src/active-owner')(@robot)
24
25 it 'registers respond listeners', ->
26 expect(@robot.respond).to.have.been.calledWith(/(list|show) (active owners|AO's|AOs)/i)
27
28describe 'Hubot with active-owner script', ->
29 robot = null
30 user = null
31 adapter = null
32
33 beforeEach (done) ->
34 robot = new Robot null, 'mock-adapter', true, 'TestHubot'
35 robot.adapter.on 'connected', ->
36 robot.loadFile path.resolve('.', 'src'), 'active-owner.coffee'
37 robot.loadFile path.resolve('.', 'node_modules', 'hubot-help', 'src'), 'help.coffee'
38 user = robot.brain.userForId '1', {
39 name: '@Gary'
40 room: '1'
41 }
42 robot.brain.userForId '2', {
43 name: 'Charlie'
44 room: '1'
45 }
46 adapter = robot.adapter
47 waitForHelp = ->
48 if robot.helpCommands().length > 0
49 done()
50 else
51 setTimeout waitForHelp, 100
52 waitForHelp()
53 robot.run()
54
55 afterEach ->
56 robot.server.close()
57 robot.shutdown
58
59 describe 'help', ->
60 it 'should have 5 options', ->
61 expect(robot.helpCommands()).to.have.length 5
62
63 describe 'teams', ->
64 it 'should add a new team', (done) ->
65 adapter.on 'send', (envelope, strings) ->
66 expect(strings[0]).to.equal('Team America added.')
67 expect(robot.brain.data.teams['team america']?).to.be.true
68 done()
69 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
70
71 it 'should not add a duplicate team', (done) ->
72 adapter.on 'send', (envelope, strings) ->
73 if strings[0] == 'Team America already being tracked.'
74 done()
75 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
76 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
77
78 it 'should delete a team', (done) ->
79 adapter.on 'send', (envelope, strings) ->
80 if strings[0] == 'Removed Team America from tracked teams.'
81 expect(robot.brain.data.teams['team america']?).to.be.false
82 done()
83 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
84 adapter.receive new TextMessage user, 'TestHubot delete Team America from teams'
85
86 describe 'assign AO', ->
87 beforeEach ->
88 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
89
90 it 'should assign a known person to a known team', (done) ->
91 adapter.on 'send', (envelope, strings) ->
92 expect(strings[0]).to.equal('Got it.')
93 aoId = robot.brain.data.teams['team america'].aoUserId
94 expect(robot.brain.userForId(aoId).name).to.equal('@Gary')
95 done()
96 adapter.receive new TextMessage user, 'TestHubot assign @Gary as AO for Team America'
97
98 it 'should assign sender of message to a team', (done) ->
99 adapter.on 'send', (envelope, strings) ->
100 expect(strings[0]).to.equal('Got it.')
101 aoId = robot.brain.data.teams['team america'].aoUserId
102 expect(robot.brain.userForId(aoId).name).to.equal('@Gary')
103 done()
104 adapter.receive new TextMessage user, "TestHubot I'm AO for Team America"
105
106 it 'should not assign an unknown person to a team', (done) ->
107 adapter.on 'send', (envelope, strings) ->
108 expect(strings[0]).to.equal("I have no idea who you're talking about.")
109 done()
110 adapter.receive new TextMessage user, "TestHubot assign Kim Jong as AO for Team America"
111
112 it 'should not assign a person to an unknown team', (done) ->
113 adapter.on 'send', (envelope, strings) ->
114 expect(strings[0]).to.equal("Never heard of that team. You can add a team with 'Add <team name> to teams'.")
115 done()
116 adapter.receive new TextMessage user, "TestHubot assign @Gary as AO for the Braves"
117
118 describe 'show AOs', ->
119 it 'should know when none exist', (done) ->
120 adapter.on 'send', (envelope, strings) ->
121 expResp = "Sorry, I'm not keeping track of any teams or their AOs.\n" +
122 "Get started with 'Add <team name> to teams'."
123 expect(strings[0]).to.equal(expResp)
124 done()
125 adapter.receive new TextMessage user, 'TestHubot show AOs'
126
127 it 'should list all AOs', (done) ->
128 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
129 adapter.receive new TextMessage user, 'TestHubot add The Mighty Ducks to teams'
130 adapter.receive new TextMessage user, 'TestHubot add Team Knight Rider to teams'
131 adapter.receive new TextMessage user, "TestHubot I'm AO for Team America"
132 adapter.receive new TextMessage user, "TestHubot assign Charlie as AO for The Mighty Ducks"
133 adapter.on 'send', (envelope, strings) ->
134 expResp = """
135 AOs:
136 @Gary has been active owner on Team America for a few seconds
137 Charlie has been active owner on The Mighty Ducks for a few seconds
138 * Team Knight Rider has no active owner! Use: \'Assign <user> as AO for <team>\'.
139 """
140 expect(strings[0]).to.equal(expResp)
141 done()
142 adapter.receive new TextMessage user, 'TestHubot show AOs'
143
144 describe 'show needed reviews', ->
145 it 'should show needed reviews', (done) ->
146 adapter.on 'send', (envelope, strings) ->
147 expResp = """
148 PRs in need of review:
149 Added a few seconds ago: http://www.github.com/a/b/pull/1
150 Added a few seconds ago: http://www.github.com/a/b/pull/2
151 """
152 expect(strings[0]).to.equal(expResp)
153 done()
154 robot.emit 'review-needed',
155 url: 'http://www.github.com/a/b/pull/1'
156 repo: 'a/b'
157 number: 1
158 robot.emit 'review-needed',
159 url: 'http://www.github.com/a/b/pull/2'
160 repo: 'a/b'
161 number: 2
162 adapter.receive new TextMessage user, 'TestHubot show needed reviews'
163 it 'knows when no reviews are needed', (done) ->
164 adapter.on 'send', (envelope, strings) ->
165 expResp = """
166 Nothing needs review as far as I know.
167 """
168 expect(strings[0]).to.equal(expResp)
169 done()
170 adapter.receive new TextMessage user, 'TestHubot show needed reviews'
171
172 describe 'on review-needed events', ->
173 it 'should message AOs with PR link', (done) ->
174 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
175 adapter.receive new TextMessage user, 'TestHubot add The Mighty Ducks to teams'
176 adapter.receive new TextMessage user, 'TestHubot add Team Knight Rider to teams'
177 adapter.receive new TextMessage user, "TestHubot I'm AO for Team America"
178 adapter.receive new TextMessage user, "TestHubot assign Charlie as AO for The Mighty Ducks"
179 verifyAlertedUsers = ->
180 if alertedUsers.indexOf('1') >= 0 && alertedUsers.indexOf('2') >= 0
181 done()
182 finished = _.after 2, verifyAlertedUsers
183 alertedUsers = []
184
185 adapter.on 'send', (envelope, strings) ->
186 expect(strings[0]).to.equal("Rapid Response needs a review of http://www.github.com/a/b/pull/1")
187 alertedUsers.push(envelope.id)
188 finished()
189 robot.emit 'review-needed',
190 url: 'http://www.github.com/a/b/pull/1'
191 repo: 'a/b'
192 number: 1
193
194 it 'should persist the PR needing review', (done) ->
195 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
196 adapter.receive new TextMessage user, "TestHubot I'm AO for Team America"
197 adapter.on 'send', (envelope, strings) ->
198 expect(robot.brain.data.prsForReview).to.contain.keys('a/b/1')
199 expect(robot.brain.data.prsForReview['a/b/1'].url).to.equal('http://www.github.com/a/b/pull/1')
200 expect(robot.brain.data.prsForReview['a/b/1'].repo).to.equal('a/b')
201 expect(robot.brain.data.prsForReview['a/b/1'].number).to.equal(1)
202 done()
203 robot.emit 'review-needed',
204 url: 'http://www.github.com/a/b/pull/1'
205 repo: 'a/b'
206 number: 1
207
208 describe 'on review-no-longer-needed events', ->
209 beforeEach ->
210 adapter.receive new TextMessage user, 'TestHubot add Team America to teams'
211 adapter.receive new TextMessage user, 'TestHubot add The Mighty Ducks to teams'
212 adapter.receive new TextMessage user, "TestHubot I'm AO for Team America"
213 robot.emit 'review-needed',
214 url: 'http://www.github.com/a/b/pull/1'
215 repo: 'a/b'
216 number: 1
217
218 it 'should message AOs that review is no longer needed, with PR link', (done) ->
219 adapter.receive new TextMessage user, "TestHubot assign Charlie as AO for The Mighty Ducks"
220 verifyAlertedUsers = ->
221 if alertedUsers.indexOf('1') >= 0 && alertedUsers.indexOf('2') >= 0
222 done()
223 finished = _.after 2, verifyAlertedUsers
224 alertedUsers = []
225 adapter.on 'send', (envelope, strings) ->
226 expect(strings[0]).to.equal("Review no longer needed for http://www.github.com/a/b/pull/1. The PR either was closed or review label was removed.")
227 alertedUsers.push(envelope.id)
228 finished()
229 robot.emit 'review-no-longer-needed',
230 url: 'http://www.github.com/a/b/pull/1'
231 repo: 'a/b'
232 number: 1
233
234 it 'should remove the PR that is no longer in need of review', (done) ->
235 adapter.on 'send', (envelope, strings) ->
236 expect(robot.brain.data.prsForReview).not.to.contain.keys('a/b/1')
237 done()
238 robot.emit 'review-no-longer-needed',
239 url: 'http://www.github.com/a/b/pull/1'
240 repo: 'a/b'
241 number: 1