reviewlette 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,367 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reviewlette do
4
+
5
+ # set instance variable from local variable
6
+ def instance_variable!(variable_name)
7
+ Reviewlette.instance_variable_set("@#{variable_name}", send(variable_name.to_sym))
8
+ end
9
+
10
+ let(:number) { 23 }
11
+ let(:title) { 'title' }
12
+ let(:body) { 'body' }
13
+ let(:githubname) { 'gitty' }
14
+ let(:trelloname) { 'jschmid' }
15
+ let(:github_stub) { github_stub }
16
+ let(:board) { stub_boards_call }
17
+ let(:repo) { 'repo/repo' }
18
+ let(:id) { 23 }
19
+ let(:card) { stub_card_call }
20
+ let(:logger) { double 'logger' }
21
+ let(:repos) { %w[repo/repo, repos/repos] }
22
+ let(:trello_connection) { double 'trello_connection' }
23
+ let(:reviewer) {double 'reviewer'}
24
+ let(:db) {Reviewlette::Database.new}
25
+ let(:github_connection) { double 'github_connection' }
26
+ let(:full_comment) { @full_comment = "@#{trelloname} will review https://github.com/#{repo}/issues/#{number.to_s}" }
27
+ let(:exp) { AlreadyAssignedException }
28
+
29
+ describe '.spin' do
30
+ before do
31
+ instance_variable! :github_connection
32
+ instance_variable! :repo
33
+ instance_variable! :trello_connection
34
+ instance_variable! :id
35
+ instance_variable! :repos
36
+ instance_variable! :title
37
+ instance_variable! :body
38
+ instance_variable! :number
39
+ instance_variable! :logger
40
+ instance_variable! :repos
41
+ issue = { number: 1, title: 'Title', body: 'Body' }
42
+ expect(Reviewlette).to receive(:setup)
43
+ expect(Reviewlette).to receive(:get_available_repos).and_return [repo]
44
+ expect(Reviewlette).to receive(:get_unassigned_github_issues).and_return [issue]
45
+ expect(Reviewlette).to receive(:find_card).and_return true
46
+ expect(Reviewlette).to receive(:update_vacations)
47
+ end
48
+
49
+ it 'spins until find_id' do
50
+ expect(Reviewlette).to receive(:find_id).and_return false
51
+ expect(Reviewlette).to_not receive(:set_reviewer)
52
+ expect(Reviewlette).to_not receive(:transform_name)
53
+ expect(Reviewlette).to_not receive(:add_reviewer_on_github)
54
+ expect(Reviewlette).to_not receive(:comment_on_github)
55
+ expect(Reviewlette).to_not receive(:add_to_trello_card)
56
+ expect(Reviewlette).to_not receive(:comment_on_trello)
57
+ expect(Reviewlette).to_not receive(:move_to_list)
58
+ expect(Reviewlette).to_not receive(:comment_on_error)
59
+ Reviewlette.spin
60
+ end
61
+
62
+ it 'spins until set_reviewer' do
63
+ expect(Reviewlette).to receive(:find_id).and_return true
64
+ expect(Reviewlette).to receive(:set_reviewer)
65
+ expect(Reviewlette).to_not receive(:transform_name)
66
+ expect(Reviewlette).to_not receive(:add_reviewer_on_github)
67
+ expect(Reviewlette).to_not receive(:comment_on_github)
68
+ expect(Reviewlette).to_not receive(:add_to_trello_card)
69
+ expect(Reviewlette).to_not receive(:comment_on_trello)
70
+ expect(Reviewlette).to_not receive(:move_to_list)
71
+ expect(Reviewlette).to receive(:comment_on_error)
72
+ Reviewlette.spin
73
+ end
74
+
75
+ it 'spins until set_reviewer' do
76
+ expect(Reviewlette).to receive(:find_id).and_return true
77
+ expect(Reviewlette).to receive(:set_reviewer).and_return true
78
+ expect(Reviewlette).to receive(:transform_name)
79
+ expect(Reviewlette).to receive(:add_reviewer_on_github)
80
+ expect(Reviewlette).to receive(:comment_on_github)
81
+ # expect(Reviewlette).to receive(:add_to_trello_card)
82
+ expect(Reviewlette).to receive(:comment_on_trello)
83
+ expect(Reviewlette).to receive(:move_to_list)
84
+ Reviewlette.instance_variable_set(:@reviewer, 'hi')
85
+ Reviewlette.instance_variable_set(:@db, db)
86
+ allow(@reviewer).to receive(:username)
87
+ expect(db).to receive(:add_pr_to_db).with('Title', @reviewer.username)
88
+ expect(Reviewlette.instance_variable_set(:@reviewer, nil))
89
+ expect(Reviewlette).to_not receive(:comment_on_error)
90
+ Reviewlette.spin
91
+ end
92
+ end
93
+
94
+ describe '.get_available_repos' do
95
+
96
+ it 'pulls in an array on avaialble repos' do
97
+
98
+ instance_variable! :repos
99
+ expect(Reviewlette.instance_variable_get(:@repos)).to be_kind_of Array #ok
100
+ Reviewlette.get_available_repos
101
+ end
102
+ end
103
+
104
+ describe '#find_card' do
105
+
106
+ it 'finds the card by Github title' do
107
+ line = 'Review_1337_name_of_pr_trello_shortid_454'
108
+ pulls = { number: 1 }
109
+ expect(Reviewlette).to receive(:match_pr_id_with_issue_id).and_return [pulls]
110
+ allow(Reviewlette.find_card(line)).to receive(:match_pr_id_with_issue_id).and_return Array
111
+ end
112
+
113
+ end
114
+
115
+ describe '.fetch_branch' do
116
+
117
+ it 'gets the branch_name from github' do
118
+ branch_name = 'review_github_branch_name_trello_23'
119
+ subject.instance_variable_set(:@pullreq_ids, {number: 1})
120
+ split_branch_name = branch_name.split('_')
121
+ instance_variable! :github_connection
122
+ expect(Reviewlette.instance_variable_get(:@pullreq_ids)).to receive_message_chain(:values, :index => 0).and_return number
123
+ expect(github_connection).to receive(:get_branch_name).and_return branch_name
124
+ expect(branch_name).to receive(:split).with('_').and_return split_branch_name
125
+ expect(split_branch_name).to receive_message_chain(:last, :to_i)
126
+ Reviewlette.fetch_branch
127
+ end
128
+ end
129
+
130
+ describe '.comment_on_error' do
131
+ it 'posts a comment with the arror message on trello' do
132
+ instance_variable! :trello_connection
133
+ expect(trello_connection).to receive(:comment_on_card).with("Skipped Issue 1 because everyone on the team is assigned to the card", nil)
134
+ Reviewlette.comment_on_error
135
+ end
136
+ end
137
+
138
+ describe '.get_unassigned_github_issues' do
139
+ it 'returns all unassigned issues' do
140
+ instance_variable! :github_connection
141
+ expect(github_connection).to receive_message_chain(:list_issues, :select)
142
+ Reviewlette.get_unassigned_github_issues
143
+ end
144
+ end
145
+
146
+ describe '.match_pr_id_with_issue_id' do
147
+
148
+ it 'matches issue id with pr id' do
149
+ instance_variable! :github_connection
150
+ instance_variable! :repo
151
+ pulls = {number: 1}
152
+ allow(github_connection).to receive(:list_pulls).and_return [pulls]
153
+ allow(pulls).to receive(:number).and_return [1]
154
+ Reviewlette.match_pr_id_with_issue_id
155
+ end
156
+ end
157
+
158
+
159
+ describe '.transform_name' do
160
+ it 'transforms trelloname to github name' do
161
+ instance_variable! :trelloname
162
+ Reviewlette.transform_name
163
+ expect(Reviewlette.instance_variable_get("@githubname")).to be_a_kind_of String
164
+ end
165
+ end
166
+
167
+ describe '.find_id' do
168
+ before do
169
+ instance_variable! :id
170
+ instance_variable! :trello_connection
171
+ end
172
+
173
+ it 'finds the id' do
174
+ expect(trello_connection).to receive(:find_card_by_id).with(id).and_return card
175
+ Reviewlette.find_id
176
+ end
177
+
178
+ it 'does not find the id' do
179
+ Reviewlette.instance_variable_set("@id", 0)
180
+ Reviewlette.instance_variable_set("@logger", logger)
181
+ expect(logger).to receive(:warn)
182
+ expect(Reviewlette.find_id).to be false
183
+ end
184
+ end
185
+
186
+ describe '.set_reviewer' do
187
+
188
+ before do
189
+ Reviewlette.instance_variable_set("@reviewer", nil)
190
+ end
191
+
192
+ it 'sets the reviewer' do
193
+ reviewer = double('reviewer')
194
+ instance_variable! :trello_connection
195
+ instance_variable! :card
196
+ expect(trello_connection).to receive(:determine_reviewer).with(card).and_return reviewer
197
+ expect(reviewer).to receive(:username).and_return String
198
+ expect(reviewer).to receive(:username).and_return String
199
+ Reviewlette.set_reviewer
200
+ end
201
+
202
+ it 'fails to set the reviewer because everyone on the team is assigned to the card' do
203
+ reviewer = double('reviewer')
204
+ instance_variable! :trello_connection
205
+ instance_variable! :card
206
+ Reviewlette.instance_variable_set("@logger", logger)
207
+ expect(trello_connection).to receive(:determine_reviewer).with(card).and_raise(Reviewlette::AlreadyAssignedException)
208
+ allow(card).to receive(:short_id).and_return 3
209
+ expect($stdout).to receive(:puts)
210
+ expect(logger).to receive(:warn)
211
+ expect(Reviewlette.set_reviewer).to eq false
212
+ end
213
+ end
214
+
215
+ describe '.add_reviewer_on_github' do
216
+ it 'adds the reviewer on github as assignee' do
217
+ instance_variable! :github_connection
218
+ instance_variable! :title
219
+ instance_variable! :body
220
+ instance_variable! :number
221
+ instance_variable! :githubname
222
+ expect(github_connection).to receive(:add_assignee).with('repo/repo', 23, 'title', 'body', 'gitty').and_return true
223
+ Reviewlette.add_reviewer_on_github
224
+ end
225
+ end
226
+
227
+ describe '.comment_on_github' do
228
+ it 'comments on the issue' do
229
+ instance_variable! :card
230
+ instance_variable! :number
231
+ instance_variable! :githubname
232
+ instance_variable! :github_connection
233
+ expect(card).to receive(:url).and_return 'www.example.url'
234
+ expect(github_connection).to receive(:comment_on_issue).with('repo/repo', 23, 'gitty', 'www.example.url').and_return true
235
+ Reviewlette.comment_on_github
236
+ end
237
+ end
238
+
239
+ describe '.add_to_trello_card' do
240
+ it 'adds a reviewer to the right trello card' do
241
+ instance_variable! :trello_connection
242
+ instance_variable! :reviewer
243
+ instance_variable! :card
244
+ expect(trello_connection).to receive(:add_reviewer_to_card).with(reviewer, card).and_return true
245
+ Reviewlette.add_to_trello_card
246
+ end
247
+
248
+ it 'rescues with: already assigned' do
249
+ instance_variable! :trello_connection
250
+ expect{Reviewlette.add_to_trello_card}.to raise_exception
251
+ # Reviewlette.add_to_trello_card
252
+ end
253
+ end
254
+
255
+ describe '.comment_on_trello' do
256
+ before do
257
+ instance_variable! :repo
258
+ instance_variable! :trelloname
259
+ instance_variable! :number
260
+ instance_variable! :trello_connection
261
+ instance_variable! :full_comment
262
+ instance_variable! :card
263
+ end
264
+
265
+ it 'puts a comment on the trello card ' do
266
+ expect(full_comment).to eq '@jschmid will review https://github.com/repo/repo/issues/23'
267
+ end
268
+
269
+ it 'actually posts' do
270
+ expect(trello_connection).to receive(:comment_on_card).with(full_comment, card).and_return true
271
+ Reviewlette.comment_on_trello
272
+ end
273
+ end
274
+
275
+ describe '.move_to_list' do
276
+ before do
277
+ instance_variable! :github_connection
278
+ instance_variable! :trello_connection
279
+ instance_variable! :card
280
+ instance_variable! :repo
281
+ instance_variable! :id
282
+ end
283
+
284
+ it 'moves the card to #Done list if the pull is merged' do
285
+ expect(trello_connection).to receive(:find_column).with('Done').and_return 'Done'
286
+ expect(trello_connection).to receive(:move_card_to_list).with(card,'Done').and_return Object
287
+ expect(github_connection).to receive(:pull_merged?).with(repo, id).and_return true
288
+ Reviewlette.move_to_list
289
+ end
290
+
291
+ it 'moves the card to #in-Review list if the pull is not merged' do
292
+ expect(trello_connection).to receive(:find_column).with('In review').and_return 'In review'
293
+ expect(trello_connection).to receive(:move_card_to_list).with(card,'In review').and_return Object
294
+ expect(github_connection).to receive(:pull_merged?).with(repo, id).and_return false
295
+ Reviewlette.move_to_list
296
+ end
297
+ end
298
+
299
+ describe '.setup' do
300
+ before do
301
+ instance_variable! :github_connection
302
+ instance_variable! :trello_connection
303
+ instance_variable! :board
304
+ instance_variable! :repo
305
+ end
306
+
307
+ it 'sets up repo variable' do
308
+ Reviewlette.setup
309
+ expect(Reviewlette.instance_variable_get('@repo')).to be_kind_of String #ok
310
+ end
311
+ it 'sets up the github_connection' do
312
+ Reviewlette.setup
313
+ expect(github_connection).to be_kind_of Object #how to call this kind of structure
314
+ end
315
+
316
+ it 'sets up the trello_connection' do
317
+ Reviewlette.setup
318
+ expect(Reviewlette.instance_variable_get('@trello_connection')).to be_kind_of Object #same
319
+ end
320
+
321
+ it 'sets up the board' do
322
+ Reviewlette.setup
323
+ expect(Reviewlette.instance_variable_get('@board')).to be_kind_of Object #same
324
+ end
325
+ end
326
+
327
+ describe '.update_vacations' do
328
+
329
+ it 'updates vacationsstatus based on tel vacation output' do
330
+ vacations = ['2015-01-07', '2015-01-25']
331
+ instance_variable_set(:@vacations, vacations)
332
+ instance_variable_set(:@db, db)
333
+ expect(Reviewlette::Vacations).to receive(:find_vacations).at_least(:once)
334
+ expect(Reviewlette).to receive(:evaluate_vacations).at_least(:once)
335
+ Reviewlette.update_vacations
336
+ end
337
+ end
338
+
339
+ describe '.evaluate_vacations' do
340
+
341
+ it 'checks if vacation state is true' do
342
+ today = Date.today
343
+ allow(subject).to receive(:parse_vacations).and_return [[today]]
344
+ subject.evaluate_vacations('jschmid')
345
+ end
346
+
347
+ it 'checks if vacation state is false' do
348
+ allow(subject).to receive(:parse_vacations).and_return [1,2]
349
+ subject.evaluate_vacations('jschmid')
350
+ end
351
+ end
352
+
353
+
354
+ describe '.parse_vacations' do
355
+
356
+ it 'parses Date in proper format' do
357
+ # vacations = ["2014-08-23 - 2014-09-14", "2014-10-03 - 2014-10-05", "2014-12-24 - 2014-12-28"]
358
+ # split = [["2014-08-23", "2014-09-14"], ["2014-10-03", "2014-10-05"], ["2014-12-24", "2014-12-28"]]
359
+ # ret = [['Sat, 23 Aug 2014', 'Sun, 14 Sep 2014'], ['Fri, 03 Oct 2014', 'Sun, 05 Oct 2014'], ['Wed, 24 Dec 2014', 'Sun, 28 Dec 2014']]
360
+ # instance_variable_set(:@vacations, vacations)
361
+ # instance_variable_set(:@split, split)
362
+ # expect(instance_variable_get(:@vacations)).to receive(:map).and_return split
363
+ # expect(instance_variable_get(:@split)).to receive(:map).and_return ret
364
+ # subject.parse_vacations
365
+ end
366
+ end
367
+ end
@@ -0,0 +1,23 @@
1
+ $:.unshift(File.expand_path(File.dirname(__FILE__))) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ require 'simplecov'
7
+ SimpleCov.minimum_coverage 80
8
+ SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
9
+ SimpleCov.start do
10
+ add_filter '/spec/'
11
+ #add_filter 'vendor'
12
+ end
13
+
14
+
15
+ require 'webmock/rspec'
16
+ require 'rspec'
17
+ require_relative '../lib/reviewlette/exceptions'
18
+ require_relative '../lib/reviewlette/vacations'
19
+ require_relative '../lib/reviewlette/database'
20
+ require 'reviewlette'
21
+ require 'support/request_stubbing'
22
+
23
+
@@ -0,0 +1,305 @@
1
+ module Helpers
2
+
3
+ def user_details
4
+ {
5
+ 'id' => 'abcdef123456789012345678',
6
+ 'fullName' => 'Test User',
7
+ 'username' => 'me',
8
+ 'intials' => 'TU',
9
+ 'avatarHash' => 'abcdef1234567890abcdef1234567890',
10
+ 'bio' => 'a rather dumb user',
11
+ 'url' => 'https://trello.com/me',
12
+ 'email' => 'johnsmith@example.com'
13
+ }
14
+ end
15
+
16
+ def user_payload
17
+ JSON.generate(user_details)
18
+ end
19
+
20
+ def self.boards_details
21
+ [{
22
+ 'id' => 'abcdef123456789123456789',
23
+ 'name' => 'Test',
24
+ 'desc' => 'This is a test board',
25
+ 'closed' => false,
26
+ 'idOrganization' => 'abcdef123456789123456789',
27
+ 'url' => 'https://trello.com/board/test/abcdef123456789123456789'
28
+ }]
29
+ end
30
+
31
+ def boards_payload
32
+ JSON.generate(boards_details)
33
+ end
34
+
35
+ def checklists_details
36
+ [{
37
+ 'id' => 'abcdef123456789123456789',
38
+ 'name' => 'Test Checklist',
39
+ 'desc' => 'A marvelous little checklist',
40
+ 'closed' => false,
41
+ 'position' => 16384,
42
+ 'url' => 'https://trello.com/blah/blah',
43
+ 'idBoard' => 'abcdef123456789123456789',
44
+ 'idList' => 'abcdef123456789123456789',
45
+ 'idMembers' => ['abcdef123456789123456789'],
46
+ 'checkItems' => { 'id' => 'ghijk987654321' }
47
+ }]
48
+ end
49
+
50
+ def checklists_payload
51
+ JSON.generate(checklists_details)
52
+ end
53
+
54
+ def lists_details
55
+ [{
56
+ 'id' => 'abcdef123456789123456789',
57
+ 'name' => 'To Do',
58
+ 'closed' => false,
59
+ 'idBoard' => 'abcdef123456789123456789',
60
+ 'cards' => cards_details
61
+ }]
62
+ end
63
+
64
+ def lists_payload
65
+ JSON.generate(lists_details)
66
+ end
67
+
68
+ def self.cards_details
69
+ [{
70
+ 'id' => 'abcdef123456789123456789',
71
+ 'idShort' => '1',
72
+ 'name' => 'Do something awesome',
73
+ 'desc' => 'Awesome things are awesome.',
74
+ 'closed' => false,
75
+ 'idList' => 'abcdef123456789123456789',
76
+ 'idBoard' => 'abcdef123456789123456789',
77
+ 'idAttachmentCover' => 'abcdef123456789123456789',
78
+ 'idMembers' => ['abcdef123456789123456789'],
79
+ 'url' => 'https://trello.com/card/board/specify-the-type-and-scope-of-the-jit-in-a-lightweight-spec/abcdef123456789123456789/abcdef123456789123456789',
80
+ 'shortUrl' => 'https://trello.com/c/abcdef12',
81
+ 'pos' => 12,
82
+ 'dateLastActivity' => '2012-12-07T18:40:24.314Z'
83
+ }]
84
+ end
85
+
86
+
87
+ def cards_payload
88
+ JSON.generate(cards_details)
89
+ end
90
+
91
+ def attachments_details
92
+ [{
93
+ 'id' => 'abcdef123456789123456789',
94
+ 'name' => 'attachment1.png',
95
+ 'url' => 'http://trello-assets.domain.tld/attachment1.png',
96
+ 'bytes' => 98765,
97
+ 'idMember' => 'abcdef123456789123456781',
98
+ 'isUpload' => false,
99
+ 'date' => '2013-02-28T17:12:28.497Z',
100
+ },
101
+ {
102
+ 'id' => 'abcdef123456789123456781',
103
+ 'name' => 'attachment2.png',
104
+ 'url' => 'http://trello-assets.domain.tld/attachment2.png',
105
+ 'bytes' => 89123,
106
+ 'idMember' => 'abcdef123456789123456782',
107
+ 'isUpload' => true,
108
+ 'date' => '2013-03-01T14:01:25.212Z',
109
+ }]
110
+ end
111
+
112
+ def attachments_payload
113
+ JSON.generate(attachments_details)
114
+ end
115
+
116
+ def card_payload
117
+ JSON.generate(cards_details.first)
118
+ end
119
+
120
+ def orgs_details
121
+ [{
122
+ 'id' => 'abcdef123456789123456789',
123
+ 'name' => 'test',
124
+ 'displayName' => 'Test Organization',
125
+ 'desc' => 'This is a test organization',
126
+ 'url' => 'https://trello.com/test'
127
+ }]
128
+ end
129
+
130
+ def orgs_payload
131
+ JSON.generate(orgs_details)
132
+ end
133
+
134
+ def actions_details
135
+ [{
136
+ 'id' => '4ee2482134a81a757a08af47',
137
+ 'idMemberCreator' => 'abcdef123456789123456789',
138
+ 'data'=> {
139
+ 'card' => {
140
+ 'id' => '4ee2482134a81a757a08af45',
141
+ 'name' => 'Bytecode outputter'
142
+ },
143
+ 'board' => {
144
+ 'id' => '4ec54f2f73820a0dea0d1f0e',
145
+ 'name' => 'Caribou VM'
146
+ },
147
+ 'list' => {
148
+ 'id' => '4ee238b034a81a757a05cda0',
149
+ 'name' => 'Assembler'
150
+ }
151
+ },
152
+ 'date' => '2012-02-10T11:32:17Z',
153
+ 'type' => 'createCard'
154
+ }]
155
+ end
156
+
157
+ def actions_payload
158
+ JSON.generate(actions_details)
159
+ end
160
+
161
+ def notification_details
162
+ {
163
+ 'id' => '4f30d084d5b0f7ab453bee51',
164
+ 'unread' => false,
165
+ 'type' => 'commentCard',
166
+ 'date' => '2012-02-07T07:19:32.393Z',
167
+ 'data' => {
168
+ 'board' => {
169
+ 'id' => 'abcdef123456789123456789',
170
+ 'name' => 'Test'
171
+ },
172
+ 'card'=>{
173
+ 'id' => 'abcdef123456789123456789',
174
+ 'name' => 'Do something awesome'
175
+ },
176
+ 'text' => 'test'
177
+ },
178
+ 'idMemberCreator' => 'abcdef123456789012345678'
179
+ }
180
+ end
181
+
182
+ def notification_payload
183
+ JSON.generate(notification_details)
184
+ end
185
+
186
+ def organization_details
187
+ {
188
+ 'id' => '4ee7e59ae582acdec8000291',
189
+ 'name' => 'publicorg',
190
+ 'desc' => 'This is a test organization',
191
+ 'members' => [{
192
+ 'id' => '4ee7df3ce582acdec80000b2',
193
+ 'username' => 'alicetester',
194
+ 'fullName' => 'Alice Tester'
195
+ }, {
196
+ 'id' => '4ee7df74e582acdec80000b6',
197
+ 'username' => 'davidtester',
198
+ 'fullName' => 'David Tester'
199
+ }, {
200
+ 'id' => '4ee7e2e1e582acdec8000112',
201
+ 'username' => 'edtester',
202
+ 'fullName' => 'Ed Tester'
203
+ }]
204
+ }
205
+ end
206
+
207
+ def organization_payload
208
+ JSON.generate(organization_details)
209
+ end
210
+
211
+ def token_details
212
+ {
213
+ 'id' => '4f2c10c7b3eb95a45b294cd5',
214
+ 'idMember' => 'abcdef123456789123456789',
215
+ 'dateCreated' => '2012-02-03T16:52:23.661Z',
216
+ 'permissions' => [
217
+ {
218
+ 'idModel' => 'me',
219
+ 'modelType' => 'Member',
220
+ 'read' => true,
221
+ 'write' => true
222
+ },
223
+ {
224
+ 'idModel' => '*',
225
+ 'modelType' => 'Board',
226
+ 'read' => true,
227
+ 'write' => true
228
+ },
229
+ {
230
+ 'idModel' => '*',
231
+ 'modelType' => 'Organization',
232
+ 'read' => true,
233
+ 'write' => true
234
+ }
235
+ ]
236
+ }
237
+ end
238
+
239
+ def token_payload
240
+ JSON.generate(token_details)
241
+ end
242
+
243
+ def label_details
244
+ [
245
+ {'color' => 'yellow', 'name' => 'iOS'},
246
+ {'color' => 'purple', 'name' => 'Issue or bug'}
247
+ ]
248
+ end
249
+
250
+ def label_payload
251
+ JSON.generate(label_details)
252
+ end
253
+
254
+ def label_name_details
255
+ [
256
+ {'yellow' => 'bug'},
257
+ {'red' => 'urgent'},
258
+ {'green' => 'deploy'},
259
+ {'blue' => 'on hold'},
260
+ {'orange' => 'new feature'},
261
+ {'purple' => 'experimental'}
262
+ ]
263
+ end
264
+
265
+ def label_name_payload
266
+ JSON.generate(label_name_details)
267
+ end
268
+
269
+ def webhooks_details
270
+ [
271
+ {
272
+ 'id' => 'webhookid',
273
+ 'description' => 'Test webhook',
274
+ 'idModel' => '1234',
275
+ 'callbackURL' => 'http://example.org/webhook',
276
+ 'active' => true
277
+ }
278
+ ]
279
+ end
280
+
281
+ def webhooks_payload
282
+ JSON.generate(webhooks_details)
283
+ end
284
+
285
+ def webhook_payload
286
+ JSON.generate(webhooks_details.first)
287
+ end
288
+ end
289
+
290
+ def oauth_client
291
+ Octokit::Client.new(:access_token => '13131313131313131313131313')
292
+ end
293
+
294
+
295
+ def stub_boards_call
296
+ trello_config = Reviewlette::TRELLO_CONFIG1
297
+ stub_request(:get, "https://api.trello.com/1/boards/UuKxYj6M?key=#{trello_config['consumerkey']}&token=#{trello_config['oauthtoken']}")
298
+ .to_return(:status => 200, :body => Helpers.boards_details.first.to_json)
299
+ end
300
+
301
+ def stub_card_call
302
+ trello_config = Reviewlette::TRELLO_CONFIG1
303
+ stub_request(:get, "https://api.trello.com/cards/8SoYLG6A?key=#{trello_config['consumerkey']}&token=#{trello_config['oauthtoken']}")
304
+ .to_return(:status => 200, :body => Helpers.cards_details.first.to_json)
305
+ end