ruby-trello-czuger 2.0.0

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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +182 -0
  3. data/lib/trello.rb +163 -0
  4. data/lib/trello/action.rb +68 -0
  5. data/lib/trello/association.rb +14 -0
  6. data/lib/trello/association_proxy.rb +42 -0
  7. data/lib/trello/attachment.rb +40 -0
  8. data/lib/trello/authorization.rb +187 -0
  9. data/lib/trello/basic_data.rb +132 -0
  10. data/lib/trello/board.rb +211 -0
  11. data/lib/trello/card.rb +467 -0
  12. data/lib/trello/checklist.rb +143 -0
  13. data/lib/trello/client.rb +120 -0
  14. data/lib/trello/comment.rb +62 -0
  15. data/lib/trello/configuration.rb +68 -0
  16. data/lib/trello/core_ext/array.rb +6 -0
  17. data/lib/trello/core_ext/hash.rb +6 -0
  18. data/lib/trello/core_ext/string.rb +6 -0
  19. data/lib/trello/cover_image.rb +8 -0
  20. data/lib/trello/has_actions.rb +9 -0
  21. data/lib/trello/item.rb +37 -0
  22. data/lib/trello/item_state.rb +30 -0
  23. data/lib/trello/json_utils.rb +64 -0
  24. data/lib/trello/label.rb +108 -0
  25. data/lib/trello/label_name.rb +31 -0
  26. data/lib/trello/list.rb +114 -0
  27. data/lib/trello/member.rb +112 -0
  28. data/lib/trello/multi_association.rb +12 -0
  29. data/lib/trello/net.rb +39 -0
  30. data/lib/trello/notification.rb +61 -0
  31. data/lib/trello/organization.rb +68 -0
  32. data/lib/trello/plugin_datum.rb +34 -0
  33. data/lib/trello/token.rb +37 -0
  34. data/lib/trello/webhook.rb +103 -0
  35. data/spec/action_spec.rb +149 -0
  36. data/spec/array_spec.rb +13 -0
  37. data/spec/association_spec.rb +26 -0
  38. data/spec/basic_auth_policy_spec.rb +51 -0
  39. data/spec/board_spec.rb +442 -0
  40. data/spec/card_spec.rb +822 -0
  41. data/spec/checklist_spec.rb +296 -0
  42. data/spec/client_spec.rb +257 -0
  43. data/spec/configuration_spec.rb +95 -0
  44. data/spec/hash_spec.rb +15 -0
  45. data/spec/integration/how_to_authorize_spec.rb +53 -0
  46. data/spec/integration/how_to_use_boards_spec.rb +48 -0
  47. data/spec/integration/integration_test.rb +40 -0
  48. data/spec/item_spec.rb +75 -0
  49. data/spec/json_utils_spec.rb +73 -0
  50. data/spec/label_spec.rb +205 -0
  51. data/spec/list_spec.rb +253 -0
  52. data/spec/member_spec.rb +159 -0
  53. data/spec/notification_spec.rb +143 -0
  54. data/spec/oauth_policy_spec.rb +160 -0
  55. data/spec/organization_spec.rb +71 -0
  56. data/spec/spec_helper.rb +435 -0
  57. data/spec/string_spec.rb +55 -0
  58. data/spec/token_spec.rb +89 -0
  59. data/spec/trello_spec.rb +134 -0
  60. data/spec/webhook_spec.rb +130 -0
  61. metadata +200 -0
@@ -0,0 +1,160 @@
1
+ require 'spec_helper'
2
+
3
+ include Trello
4
+ include Trello::Authorization
5
+
6
+ describe OAuthPolicy do
7
+ before do
8
+ OAuthPolicy.consumer_credential = OAuthCredential.new 'xxx', 'xxx'
9
+ OAuthPolicy.token = nil
10
+ end
11
+
12
+ describe '#consumer_credential' do
13
+ it 'uses class setting if available' do
14
+ policy = OAuthPolicy.new
15
+ expect(policy.consumer_credential.key).to eq('xxx')
16
+ expect(policy.consumer_credential.secret).to eq('xxx')
17
+ end
18
+
19
+ it 'is built from given consumer_key and consumer_secret' do
20
+ policy = OAuthPolicy.new(
21
+ consumer_key: 'consumer_key',
22
+ consumer_secret: 'consumer_secret'
23
+ )
24
+ expect(policy.consumer_credential.key).to eq('consumer_key')
25
+ expect(policy.consumer_credential.secret).to eq('consumer_secret')
26
+ end
27
+
28
+ it 'is nil if none supplied to class' do
29
+ OAuthPolicy.consumer_credential = nil
30
+ policy = OAuthPolicy.new
31
+ expect(policy.consumer_credential).to be_nil
32
+ end
33
+ end
34
+
35
+ describe '#token' do
36
+ it 'uses class setting if available' do
37
+ OAuthPolicy.token = OAuthCredential.new 'xxx', 'xxx'
38
+ policy = OAuthPolicy.new
39
+ expect(policy.token.key).to eq('xxx')
40
+ expect(policy.token.secret).to eq('xxx')
41
+ end
42
+
43
+ it 'is built from given oauth_token and oauth_token_secret' do
44
+ policy = OAuthPolicy.new(
45
+ oauth_token: 'oauth_token',
46
+ oauth_token_secret: 'oauth_token_secret'
47
+ )
48
+ expect(policy.token.key).to eq('oauth_token')
49
+ expect(policy.token.secret).to eq('oauth_token_secret')
50
+ end
51
+
52
+ it 'is an empty token if no oauth credentials supplied' do
53
+ policy = OAuthPolicy.new
54
+ expect(policy.token).to be_nil
55
+ end
56
+ end
57
+
58
+ context '2-legged' do
59
+ it 'adds an authorization header' do
60
+ uri = Addressable::URI.parse('https://xxx/')
61
+
62
+ request = Request.new :get, uri
63
+
64
+ OAuthPolicy.token = OAuthCredential.new 'token', nil
65
+
66
+ authorized_request = OAuthPolicy.authorize request
67
+
68
+ expect(authorized_request.headers.keys).to include 'Authorization'
69
+ end
70
+
71
+ it 'preserves query parameters' do
72
+ uri = Addressable::URI.parse('https://xxx/?name=Riccardo')
73
+ request = Request.new :get, uri
74
+
75
+ allow(Clock)
76
+ .to receive(:timestamp)
77
+ .and_return '1327048592'
78
+
79
+ allow(Nonce)
80
+ .to receive(:next)
81
+ .and_return 'b94ff2bf7f0a5e87a326064ae1dbb18f'
82
+
83
+ OAuthPolicy.consumer_credential = OAuthCredential.new 'consumer_key', 'consumer_secret'
84
+ OAuthPolicy.token = OAuthCredential.new 'token', nil
85
+
86
+ authorized_request = OAuthPolicy.authorize request
87
+
88
+ the_query_parameters = Addressable::URI.parse(authorized_request.uri).query_values
89
+ expect(the_query_parameters).to eq({'name' => 'Riccardo'})
90
+ end
91
+
92
+ it 'adds the correct signature as part of authorization header' do
93
+ allow(Clock)
94
+ .to receive(:timestamp)
95
+ .and_return '1327048592'
96
+
97
+ allow(Nonce)
98
+ .to receive(:next)
99
+ .and_return 'b94ff2bf7f0a5e87a326064ae1dbb18f'
100
+
101
+ OAuthPolicy.consumer_credential = OAuthCredential.new 'consumer_key', 'consumer_secret'
102
+ OAuthPolicy.token = OAuthCredential.new 'token', nil
103
+
104
+ request = Request.new :get, Addressable::URI.parse('http://xxx/')
105
+
106
+ authorized_request = OAuthPolicy.authorize request
107
+
108
+ expect(authorized_request.headers['Authorization']).to match(/oauth_signature="TVNk%2FCs03FHqutDUqn05%2FDkvVek%3D"/)
109
+ end
110
+
111
+ it 'adds correct signature for uri with parameters' do
112
+ allow(Clock)
113
+ .to receive(:timestamp)
114
+ .and_return '1327351010'
115
+
116
+ allow(Nonce)
117
+ .to receive(:next)
118
+ .and_return 'f5474aaf44ca84df0b09870044f91c69'
119
+
120
+ OAuthPolicy.consumer_credential = OAuthCredential.new 'consumer_key', 'consumer_secret'
121
+ OAuthPolicy.token = OAuthCredential.new 'token', nil
122
+
123
+ request = Request.new :get, Addressable::URI.parse('http://xxx/?a=b')
124
+
125
+ authorized_request = OAuthPolicy.authorize request
126
+
127
+ expect(authorized_request.headers['Authorization']).to match(/oauth_signature="DprU1bdbNdJQ40UhD4n7wRR9jts%3D"/)
128
+ end
129
+
130
+ it 'fails if consumer_credential is unset' do
131
+ OAuthPolicy.consumer_credential = nil
132
+
133
+ request = Request.new :get, Addressable::URI.parse('http://xxx/')
134
+
135
+ expect { OAuthPolicy.authorize request }.to raise_error 'The consumer_credential has not been supplied.'
136
+ end
137
+
138
+ it 'can sign with token' do
139
+ allow(Clock)
140
+ .to receive(:timestamp)
141
+ .and_return '1327360530'
142
+
143
+ allow(Nonce)
144
+ .to receive(:next)
145
+ .and_return '4f610cb28e7aa8711558de5234af1f0e'
146
+
147
+ OAuthPolicy.consumer_credential = OAuthCredential.new 'consumer_key', 'consumer_secret'
148
+ OAuthPolicy.token = OAuthCredential.new 'token_key', 'token_secret'
149
+
150
+ request = Request.new :get, Addressable::URI.parse('http://xxx/')
151
+
152
+ authorized_request = OAuthPolicy.authorize request
153
+
154
+ expect(authorized_request.headers['Authorization']).to match(/oauth_signature="1Boj4fo6KiXA4xGD%2BKF5QOD36PI%3D"/)
155
+ end
156
+
157
+ it 'adds correct signature for https uri'
158
+ it 'adds correct signature for verbs other than get'
159
+ end
160
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ module Trello
4
+ describe Organization do
5
+ include Helpers
6
+
7
+ let(:organization) { client.find(:organization, '4ee7e59ae582acdec8000291') }
8
+ let(:client) { Client.new }
9
+
10
+ before do
11
+ allow(client)
12
+ .to receive(:get)
13
+ .with('/organizations/4ee7e59ae582acdec8000291', {})
14
+ .and_return organization_payload
15
+ end
16
+
17
+ context 'finding' do
18
+ let(:client) { Trello.client }
19
+
20
+ it 'delegates to Trello.client#find' do
21
+ expect(client)
22
+ .to receive(:find)
23
+ .with(:organization, '4ee7e59ae582acdec8000291', {})
24
+
25
+ Organization.find('4ee7e59ae582acdec8000291')
26
+ end
27
+
28
+ it 'is equivalent to client#find' do
29
+ expect(Organization.find('4ee7e59ae582acdec8000291')).to eq(organization)
30
+ end
31
+ end
32
+
33
+ context 'actions' do
34
+ it 'retrieves actions' do
35
+ allow(client)
36
+ .to receive(:get)
37
+ .with('/organizations/4ee7e59ae582acdec8000291/actions', { filter: :all })
38
+ .and_return actions_payload
39
+
40
+ expect(organization.actions.count).to be > 0
41
+ end
42
+ end
43
+
44
+ describe "#update_fields" do
45
+ it "does not set any fields when the fields argument is empty" do
46
+ expected = {
47
+ 'id' => 'id',
48
+ 'name' => 'name',
49
+ 'displayName' => 'display_name',
50
+ 'desc' => 'description',
51
+ 'url' => 'url',
52
+ 'invited' => 'invited',
53
+ 'website' => 'website',
54
+ 'logoHash' => 'logo_hash',
55
+ 'billableMemberCount' => 'billable_member_count',
56
+ 'activeBillableMemberCount' => 'active_billable_member_count',
57
+ 'memberships' => 'memberships'
58
+ }
59
+
60
+ organization = Organization.new(expected)
61
+
62
+ organization.update_fields({})
63
+
64
+ expected.each do |key, value|
65
+ expect(organization.send(value)).to eq expected[key]
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+
@@ -0,0 +1,435 @@
1
+ require 'rubygems'
2
+
3
+ unless defined? Rubinius
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+ end
7
+
8
+ begin
9
+ require 'pry-byebug'
10
+ rescue LoadError
11
+ end
12
+
13
+ # Set up gems listed in the Gemfile.
14
+ begin
15
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
16
+ require 'bundler'
17
+ Bundler.setup
18
+ rescue Bundler::GemNotFound => e
19
+ STDERR.puts e.message
20
+ STDERR.puts 'Try running `bundle install`.'
21
+ exit!
22
+ end
23
+
24
+ Bundler.require(:spec)
25
+
26
+ require 'trello'
27
+ require 'webmock/rspec'
28
+ require 'stringio'
29
+
30
+ Trello.logger = Logger.new(StringIO.new)
31
+
32
+ RSpec.configure do |rspec|
33
+ rspec.filter_run_excluding broken: true
34
+
35
+ rspec.before :each do
36
+ Trello.reset!
37
+ end
38
+
39
+ rspec.around(:each, :silence_warnings) do |example|
40
+ verbose = $VERBOSE
41
+ $VERBOSE = nil
42
+ example.run
43
+ $VERBOSE = verbose
44
+ end
45
+ end
46
+
47
+ module Helpers
48
+ def user_details
49
+ {
50
+ 'id' => 'abcdef123456789012345678',
51
+ 'fullName' => 'Test User',
52
+ 'username' => 'me',
53
+ 'intials' => 'TU',
54
+ 'avatarHash' => 'abcdef1234567890abcdef1234567890',
55
+ 'bio' => 'a rather dumb user',
56
+ 'url' => 'https://trello.com/me',
57
+ 'email' => 'johnsmith@example.com'
58
+ }
59
+ end
60
+
61
+ def user_payload
62
+ JSON.generate(user_details)
63
+ end
64
+
65
+ def boards_details
66
+ [{
67
+ 'id' => 'abcdef123456789123456789',
68
+ 'name' => 'Test',
69
+ 'desc' => 'This is a test board',
70
+ 'closed' => false,
71
+ 'starred' => false,
72
+ 'idOrganization' => 'abcdef123456789123456789',
73
+ 'url' => 'https://trello.com/board/test/abcdef123456789123456789',
74
+ 'dateLastActivity' => '2012-12-08T18:40:24.314Z'
75
+ },
76
+ {
77
+ name: 'Test',
78
+ desc: 'This is a test board',
79
+ closed: false,
80
+ starred: false,
81
+ organization_id: 'abcdef123456789123456789'
82
+ }]
83
+ end
84
+
85
+ def boards_payload
86
+ JSON.generate(boards_details)
87
+ end
88
+
89
+ def checklists_details
90
+ [{
91
+ 'id' => 'abcdef123456789123456789',
92
+ 'name' => 'Test Checklist',
93
+ 'desc' => 'A marvelous little checklist',
94
+ 'closed' => false,
95
+ 'pos' => 16384,
96
+ 'url' => 'https://trello.com/blah/blah',
97
+ 'idBoard' => 'abcdef123456789123456789',
98
+ 'idCard' => 'abccardid',
99
+ 'idList' => 'abcdef123456789123456789',
100
+ 'idMembers' => ['abcdef123456789123456789'],
101
+ 'checkItems' => { 'id' => 'ghijk987654321' }
102
+ },
103
+ {
104
+ name: 'A marvelous little checklist',
105
+ card_id: 'abccardid'
106
+ }]
107
+ end
108
+
109
+ def checklists_payload
110
+ JSON.generate(checklists_details)
111
+ end
112
+
113
+ def copied_checklists_details
114
+ [{
115
+ 'id' => 'uvwxyz987654321987654321',
116
+ 'name' => 'Test Checklist',
117
+ 'desc' => '',
118
+ 'closed' => nil,
119
+ 'position' => 99999,
120
+ 'url' => nil,
121
+ 'idBoard' => 'abcdef123456789123456789',
122
+ 'idList' => nil,
123
+ 'idMembers' => nil,
124
+ 'checkItems' => []
125
+ }]
126
+ end
127
+
128
+ def copied_checklists_payload
129
+ JSON.generate(copied_checklists_details)
130
+ end
131
+
132
+ def lists_details
133
+ [{
134
+ 'id' => 'abcdef123456789123456789',
135
+ 'name' => 'To Do',
136
+ 'closed' => false,
137
+ 'idBoard' => 'abcdef123456789123456789',
138
+ 'idListSource' => 'abcdef123456789123456780',
139
+ 'cards' => cards_details,
140
+ 'pos' => 12
141
+ },
142
+ {
143
+ name: 'To Do',
144
+ board_id: 'abcdef123456789123456789',
145
+ pos: 12,
146
+ source_list_id: 'abcdef123456789123456780'
147
+ }
148
+ ]
149
+ end
150
+
151
+ def lists_payload
152
+ JSON.generate(lists_details)
153
+ end
154
+
155
+ def cards_details
156
+ [{
157
+ 'id' => 'abcdef123456789123456789',
158
+ 'idShort' => '1',
159
+ 'name' => 'Do something awesome',
160
+ 'desc' => 'Awesome things are awesome.',
161
+ 'closed' => false,
162
+ 'idList' => 'abcdef123456789123456789',
163
+ 'idBoard' => 'abcdef123456789123456789',
164
+ 'idAttachmentCover' => 'abcdef123456789123456789',
165
+ 'idMembers' => ['abcdef123456789123456789'],
166
+ 'labels' => label_details,
167
+ 'idLabels' => [ 'abcdef123456789123456789',
168
+ 'bbcdef123456789123456789',
169
+ 'cbcdef123456789123456789',
170
+ 'dbcdef123456789123456789' ],
171
+ 'url' => 'https://trello.com/card/board/specify-the-type-and-scope-of-the-jit-in-a-lightweight-spec/abcdef123456789123456789/abcdef123456789123456789',
172
+ 'shortUrl' => 'https://trello.com/c/abcdef12',
173
+ 'pos' => 12,
174
+ 'dateLastActivity' => '2012-12-07T18:40:24.314Z'
175
+ },
176
+ {
177
+ name: 'Do something awesome',
178
+ list_id: 'abcdef123456789123456789',
179
+ desc: 'Awesome things are awesome.',
180
+ member_ids: ['abcdef123456789123456789'],
181
+ card_labels: [ 'abcdef123456789123456789',
182
+ 'bbcdef123456789123456789',
183
+ 'cbcdef123456789123456789',
184
+ 'dbcdef123456789123456789' ],
185
+ due: Date.today,
186
+ pos: 12,
187
+ source_card_id: 'abcdef1234567891234567890',
188
+ source_card_properties: 'checklist,members'
189
+ }]
190
+ end
191
+
192
+
193
+ def cards_payload
194
+ JSON.generate(cards_details)
195
+ end
196
+
197
+ def attachments_details
198
+ [{
199
+ 'id' => 'abcdef123456789123456789',
200
+ 'name' => 'attachment1.png',
201
+ 'url' => 'http://trello-assets.domain.tld/attachment1.png',
202
+ 'bytes' => 98765,
203
+ 'idMember' => 'abcdef123456789123456781',
204
+ 'isUpload' => false,
205
+ 'date' => '2013-02-28T17:12:28.497Z',
206
+ 'previews' => 'previews'
207
+ },
208
+ {
209
+ 'id' => 'abcdef123456789123456781',
210
+ 'name' => 'attachment2.png',
211
+ 'url' => 'http://trello-assets.domain.tld/attachment2.png',
212
+ 'bytes' => 89123,
213
+ 'idMember' => 'abcdef123456789123456782',
214
+ 'isUpload' => true,
215
+ 'date' => '2013-03-01T14:01:25.212Z',
216
+ }]
217
+ end
218
+
219
+ def attachments_payload
220
+ JSON.generate(attachments_details)
221
+ end
222
+
223
+ def plugin_data_details
224
+ [
225
+ {
226
+ "id"=>"abcdef123456789123456779",
227
+ "idPlugin"=>"abcdef123456789123456879",
228
+ "scope"=>"card",
229
+ "idModel"=>"abcdef123456789123446879",
230
+ "value"=>"{\"fields\":{\"plugin_key\":\"plugin_value\"}}",
231
+ "access"=>"shared"
232
+ },
233
+ {
234
+ "id"=>"abcdef123456789123456879",
235
+ "idPlugin"=>"abcdef123456789123456779",
236
+ "scope"=>"card",
237
+ "idModel"=>"abcdef123456789123446579",
238
+ "value"=>"{\"fields\":{\"plugin_key\":\"plugin_value\"}}",
239
+ "access"=>"shared"
240
+ }
241
+ ]
242
+ end
243
+
244
+ def plugin_data_payload
245
+ JSON.generate(plugin_data_details)
246
+ end
247
+
248
+ def card_payload
249
+ JSON.generate(cards_details.first)
250
+ end
251
+
252
+ def orgs_details
253
+ [{
254
+ 'id' => 'abcdef123456789123456789',
255
+ 'name' => 'test',
256
+ 'displayName' => 'Test Organization',
257
+ 'desc' => 'This is a test organization',
258
+ 'url' => 'https://trello.com/test'
259
+ }]
260
+ end
261
+
262
+ def orgs_payload
263
+ JSON.generate(orgs_details)
264
+ end
265
+
266
+ def actions_details
267
+ [{
268
+ 'id' => '4ee2482134a81a757a08af47',
269
+ 'idMemberCreator' => 'abcdef123456789123456789',
270
+ 'data' => {
271
+ 'card' => {
272
+ 'id' => '4ee2482134a81a757a08af45',
273
+ 'name' => 'Bytecode outputter'
274
+ },
275
+ 'board' => {
276
+ 'id' => '4ec54f2f73820a0dea0d1f0e',
277
+ 'name' => 'Caribou VM'
278
+ },
279
+ 'list' => {
280
+ 'id' => '4ee238b034a81a757a05cda0',
281
+ 'name' => 'Assembler'
282
+ }
283
+ },
284
+ 'date' => '2012-02-10T11:32:17Z',
285
+ 'type' => 'createCard'
286
+ }]
287
+ end
288
+
289
+ def actions_payload
290
+ JSON.generate(actions_details)
291
+ end
292
+
293
+ def notification_details
294
+ {
295
+ 'id' => '4f30d084d5b0f7ab453bee51',
296
+ 'unread' => false,
297
+ 'type' => 'commentCard',
298
+ 'date' => '2012-02-07T07:19:32.393Z',
299
+ 'data' => {
300
+ 'board' => {
301
+ 'id' => 'abcdef123456789123456789',
302
+ 'name' => 'Test'
303
+ },
304
+ 'card' =>{
305
+ 'id' => 'abcdef123456789123456789',
306
+ 'name' => 'Do something awesome'
307
+ },
308
+ 'text' => 'test'
309
+ },
310
+ 'idMemberCreator' => 'abcdef123456789012345678'
311
+ }
312
+ end
313
+
314
+ def notification_payload
315
+ JSON.generate(notification_details)
316
+ end
317
+
318
+ def organization_details
319
+ {
320
+ 'id' => '4ee7e59ae582acdec8000291',
321
+ 'name' => 'publicorg',
322
+ 'desc' => 'This is a test organization',
323
+ 'members' => [{
324
+ 'id' => '4ee7df3ce582acdec80000b2',
325
+ 'username' => 'alicetester',
326
+ 'fullName' => 'Alice Tester'
327
+ }, {
328
+ 'id' => '4ee7df74e582acdec80000b6',
329
+ 'username' => 'davidtester',
330
+ 'fullName' => 'David Tester'
331
+ }, {
332
+ 'id' => '4ee7e2e1e582acdec8000112',
333
+ 'username' => 'edtester',
334
+ 'fullName' => 'Ed Tester'
335
+ }]
336
+ }
337
+ end
338
+
339
+ def organization_payload
340
+ JSON.generate(organization_details)
341
+ end
342
+
343
+ def token_details
344
+ {
345
+ 'id' => '4f2c10c7b3eb95a45b294cd5',
346
+ 'idMember' => 'abcdef123456789123456789',
347
+ 'dateCreated' => '2012-02-03T16:52:23.661Z',
348
+ 'permissions' => [
349
+ {
350
+ 'idModel' => 'me',
351
+ 'modelType' => 'Member',
352
+ 'read' => true,
353
+ 'write' => true
354
+ },
355
+ {
356
+ 'idModel' => '*',
357
+ 'modelType' => 'Board',
358
+ 'read' => true,
359
+ 'write' => true
360
+ },
361
+ {
362
+ 'idModel' => '*',
363
+ 'modelType' => 'Organization',
364
+ 'read' => true,
365
+ 'write' => true
366
+ }
367
+ ]
368
+ }
369
+ end
370
+
371
+ def token_payload
372
+ JSON.generate(token_details)
373
+ end
374
+
375
+ def label_details
376
+ [
377
+ {'color' => 'yellow', 'name' => 'iOS', 'id' => 'abcdef123456789123456789', 'uses' => 3, 'idBoard' => 'abcdef123456789123456789'},
378
+ {'color' => 'purple', 'name' => 'Issue or bug', 'id' => 'bbcdef123456789123456789', 'uses' => 1, 'idBoard' => 'abcdef123456789123456789'},
379
+ {'color' => 'red', 'name' => 'deploy', 'id' => 'cbcdef123456789123456789', 'uses' => 2, 'idBoard' => 'abcdef123456789123456789'},
380
+ {'color' => 'blue', 'name' => 'on hold', 'id' => 'dbcdef123456789123456789', 'uses' => 6, 'idBoard' => 'abcdef123456789123456789'}
381
+ ]
382
+ end
383
+
384
+ def label_options
385
+ {
386
+ name: 'iOS',
387
+ board_id: 'abcdef123456789123456789',
388
+ color: 'yellow'
389
+ }
390
+ end
391
+
392
+ def label_payload
393
+ JSON.generate(label_details)
394
+ end
395
+
396
+ def webhooks_details
397
+ [
398
+ {
399
+ 'id' => 'webhookid',
400
+ 'description' => 'Test webhook',
401
+ 'idModel' => '1234',
402
+ 'callbackURL' => 'http://example.org/webhook',
403
+ 'active' => true
404
+ },
405
+ {
406
+ description: 'Test webhook',
407
+ id_model: '1234',
408
+ cakkback_url: 'http://example.org/webhook'
409
+ }
410
+ ]
411
+ end
412
+
413
+ def label_name_details
414
+ [
415
+ {'yellow' => 'bug'},
416
+ {'red' => 'urgent'},
417
+ {'green' => 'deploy'},
418
+ {'blue' => 'on hold'},
419
+ {'orange' => 'new feature'},
420
+ {'purple' => 'experimental'}
421
+ ]
422
+ end
423
+
424
+ def label_name_payload
425
+ JSON.generate(label_name_details)
426
+ end
427
+
428
+ def webhooks_payload
429
+ JSON.generate(webhooks_details)
430
+ end
431
+
432
+ def webhook_payload
433
+ JSON.generate(webhooks_details.first)
434
+ end
435
+ end