1 | path = require 'path'
|
2 | chai = require 'chai'
|
3 | sinon = require 'sinon'
|
4 | chai.use require 'sinon-chai'
|
5 | _ = require 'lodash'
|
6 | Robot = require 'hubot/src/robot'
|
7 | Brain = require 'hubot/src/brain'
|
8 | TextMessage = require('hubot/src/message').TextMessage
|
9 |
|
10 | expect = chai.expect
|
11 |
|
12 |
|
13 | process.setMaxListeners(20)
|
14 |
|
15 | describe '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 |
|
28 | describe '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
|