ruby-trello 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -5
- data/lib/trello/board.rb +6 -8
- data/lib/trello/card.rb +14 -28
- data/lib/trello/checklist.rb +14 -0
- data/lib/trello/item.rb +4 -0
- data/lib/trello/label.rb +3 -3
- data/lib/trello/list.rb +13 -3
- data/lib/trello/organization.rb +14 -7
- data/spec/action_spec.rb +67 -31
- data/spec/array_spec.rb +1 -1
- data/spec/association_spec.rb +11 -7
- data/spec/basic_auth_policy_spec.rb +4 -4
- data/spec/board_spec.rb +169 -92
- data/spec/card_spec.rb +232 -119
- data/spec/checklist_spec.rb +109 -16
- data/spec/client_spec.rb +83 -45
- data/spec/configuration_spec.rb +24 -43
- data/spec/hash_spec.rb +5 -1
- data/spec/item_spec.rb +27 -9
- data/spec/label_spec.rb +52 -27
- data/spec/list_spec.rb +86 -29
- data/spec/member_spec.rb +62 -40
- data/spec/notification_spec.rb +57 -22
- data/spec/oauth_policy_spec.rb +45 -24
- data/spec/organization_spec.rb +16 -8
- data/spec/spec_helper.rb +28 -3
- data/spec/string_spec.rb +11 -8
- data/spec/token_spec.rb +31 -11
- data/spec/trello_spec.rb +20 -23
- data/spec/webhook_spec.rb +24 -9
- metadata +4 -6
- data/spec/item_state_spec.rb +0 -0
data/spec/card_spec.rb
CHANGED
@@ -4,24 +4,34 @@ module Trello
|
|
4
4
|
describe Card do
|
5
5
|
include Helpers
|
6
6
|
|
7
|
-
let(:card)
|
7
|
+
let(:card) { client.find(:card, 'abcdef123456789123456789') }
|
8
8
|
let(:client) { Client.new }
|
9
9
|
|
10
|
-
before
|
11
|
-
client
|
12
|
-
|
10
|
+
before do
|
11
|
+
allow(client)
|
12
|
+
.to receive(:get)
|
13
|
+
.with("/cards/abcdef123456789123456789", {})
|
14
|
+
.and_return JSON.generate(cards_details.first)
|
13
15
|
end
|
14
16
|
|
15
17
|
context "finding" do
|
16
18
|
let(:client) { Trello.client }
|
17
19
|
|
20
|
+
before do
|
21
|
+
allow(client)
|
22
|
+
.to receive(:find)
|
23
|
+
end
|
24
|
+
|
18
25
|
it "delegates to Trello.client#find" do
|
19
|
-
client
|
26
|
+
expect(client)
|
27
|
+
.to receive(:find)
|
28
|
+
.with(:card, 'abcdef123456789123456789', {})
|
29
|
+
|
20
30
|
Card.find('abcdef123456789123456789')
|
21
31
|
end
|
22
32
|
|
23
33
|
it "is equivalent to client#find" do
|
24
|
-
Card.find('abcdef123456789123456789').
|
34
|
+
expect(Card.find('abcdef123456789123456789')).to eq(card)
|
25
35
|
end
|
26
36
|
end
|
27
37
|
|
@@ -30,17 +40,17 @@ module Trello
|
|
30
40
|
|
31
41
|
it "creates a new record" do
|
32
42
|
card = Card.new(cards_details.first)
|
33
|
-
card.
|
43
|
+
expect(card).to be_valid
|
34
44
|
end
|
35
45
|
|
36
46
|
it 'must not be valid if not given a name' do
|
37
47
|
card = Card.new('idList' => lists_details.first['id'])
|
38
|
-
card.
|
48
|
+
expect(card).to_not be_valid
|
39
49
|
end
|
40
50
|
|
41
51
|
it 'must not be valid if not given a list id' do
|
42
52
|
card = Card.new('name' => lists_details.first['name'])
|
43
|
-
card.
|
53
|
+
expect(card).to_not be_valid
|
44
54
|
end
|
45
55
|
|
46
56
|
it 'creates a new record and saves it on Trello', refactor: true do
|
@@ -52,13 +62,16 @@ module Trello
|
|
52
62
|
result = JSON.generate(cards_details.first.merge(payload.merge(idList: lists_details.first['id'])))
|
53
63
|
|
54
64
|
expected_payload = {name: "Test Card", desc: nil, idList: "abcdef123456789123456789",
|
55
|
-
idMembers: nil, labels: nil, pos: nil }
|
65
|
+
idMembers: nil, labels: nil, pos: nil, due: nil}
|
56
66
|
|
57
|
-
client
|
67
|
+
expect(client)
|
68
|
+
.to receive(:post)
|
69
|
+
.with("/cards", expected_payload)
|
70
|
+
.and_return result
|
58
71
|
|
59
72
|
card = Card.create(cards_details.first.merge(payload.merge(list_id: lists_details.first['id'])))
|
60
73
|
|
61
|
-
card.
|
74
|
+
expect(card).to be_a Card
|
62
75
|
end
|
63
76
|
end
|
64
77
|
|
@@ -70,133 +83,197 @@ module Trello
|
|
70
83
|
name: expected_new_name,
|
71
84
|
}
|
72
85
|
|
73
|
-
client
|
86
|
+
expect(client)
|
87
|
+
.to receive(:put)
|
88
|
+
.once
|
89
|
+
.with("/cards/abcdef123456789123456789", payload)
|
74
90
|
|
75
91
|
card.name = expected_new_name
|
76
92
|
card.save
|
77
93
|
end
|
94
|
+
|
95
|
+
it "updating desc does a put on the correct resource with the correct value" do
|
96
|
+
expected_new_desc = "xxx"
|
97
|
+
|
98
|
+
payload = {
|
99
|
+
desc: expected_new_desc,
|
100
|
+
}
|
101
|
+
|
102
|
+
client.should_receive(:put).once.with("/cards/abcdef123456789123456789", payload)
|
103
|
+
|
104
|
+
card.desc = expected_new_desc
|
105
|
+
card.save
|
106
|
+
end
|
78
107
|
end
|
79
108
|
|
80
109
|
context "deleting" do
|
81
110
|
it "deletes the card" do
|
82
|
-
client
|
111
|
+
expect(client)
|
112
|
+
.to receive(:delete)
|
113
|
+
.with("/cards/#{card.id}")
|
114
|
+
|
83
115
|
card.delete
|
84
116
|
end
|
85
117
|
end
|
86
118
|
|
87
119
|
context "fields" do
|
88
120
|
it "gets its id" do
|
89
|
-
card.id.
|
121
|
+
expect(card.id).to_not be_nil
|
90
122
|
end
|
91
123
|
|
92
124
|
it "gets its short id" do
|
93
|
-
card.short_id.
|
125
|
+
expect(card.short_id).to_not be_nil
|
94
126
|
end
|
95
127
|
|
96
128
|
it "gets its name" do
|
97
|
-
card.name.
|
129
|
+
expect(card.name).to_not be_nil
|
98
130
|
end
|
99
131
|
|
100
132
|
it "gets its description" do
|
101
|
-
card.desc.
|
133
|
+
expect(card.desc).to_not be_nil
|
102
134
|
end
|
103
135
|
|
104
136
|
it "knows if it is open or closed" do
|
105
|
-
card.closed.
|
137
|
+
expect(card.closed).to_not be_nil
|
106
138
|
end
|
107
139
|
|
108
140
|
it "gets its url" do
|
109
|
-
card.url.
|
141
|
+
expect(card.url).to_not be_nil
|
110
142
|
end
|
111
143
|
|
112
144
|
it "gets its short url" do
|
113
|
-
card.short_url.
|
145
|
+
expect(card.short_url).to_not be_nil
|
114
146
|
end
|
115
147
|
|
116
148
|
it "gets its last active date" do
|
117
|
-
card.last_activity_date.
|
149
|
+
expect(card.last_activity_date).to_not be_nil
|
118
150
|
end
|
119
151
|
|
120
152
|
it "gets its cover image id" do
|
121
|
-
card.cover_image_id.
|
153
|
+
expect(card.cover_image_id).to_not be_nil
|
122
154
|
end
|
123
155
|
|
124
156
|
it "gets its pos" do
|
125
|
-
card.pos.
|
157
|
+
expect(card.pos).to_not be_nil
|
126
158
|
end
|
127
159
|
end
|
128
160
|
|
129
161
|
context "actions" do
|
162
|
+
let(:filter) { :all }
|
163
|
+
|
164
|
+
before do
|
165
|
+
allow(client)
|
166
|
+
.to receive(:get)
|
167
|
+
.with("/cards/abcdef123456789123456789/actions", { filter: filter })
|
168
|
+
.and_return actions_payload
|
169
|
+
end
|
170
|
+
|
130
171
|
it "asks for all actions by default" do
|
131
|
-
|
132
|
-
card.actions.count.should be > 0
|
172
|
+
expect(card.actions.count).to be > 0
|
133
173
|
end
|
134
174
|
|
135
|
-
|
136
|
-
|
137
|
-
|
175
|
+
context 'when overriding a filter' do
|
176
|
+
let(:filter) { :updateCard }
|
177
|
+
|
178
|
+
it "allows the filter" do
|
179
|
+
expect(card.actions(filter: filter).count).to be > 0
|
180
|
+
end
|
138
181
|
end
|
139
182
|
end
|
140
183
|
|
141
184
|
context "boards" do
|
185
|
+
before do
|
186
|
+
allow(client)
|
187
|
+
.to receive(:get)
|
188
|
+
.with("/boards/abcdef123456789123456789", {})
|
189
|
+
.and_return JSON.generate(boards_details.first)
|
190
|
+
end
|
191
|
+
|
142
192
|
it "has a board" do
|
143
|
-
|
144
|
-
card.board.should_not be_nil
|
193
|
+
expect(card.board).to_not be_nil
|
145
194
|
end
|
146
195
|
end
|
147
196
|
|
148
197
|
context "cover image" do
|
198
|
+
before do
|
199
|
+
allow(client)
|
200
|
+
.to receive(:get)
|
201
|
+
.with("/attachments/abcdef123456789123456789", {})
|
202
|
+
.and_return JSON.generate(attachments_details.first)
|
203
|
+
end
|
204
|
+
|
149
205
|
it "has a cover image" do
|
150
|
-
|
151
|
-
card.cover_image.should_not be_nil
|
206
|
+
expect(card.cover_image).to_not be_nil
|
152
207
|
end
|
153
208
|
end
|
154
209
|
|
155
210
|
context "checklists" do
|
156
|
-
before
|
157
|
-
client
|
211
|
+
before do
|
212
|
+
allow(client)
|
213
|
+
.to receive(:get)
|
214
|
+
.with("/cards/abcdef123456789123456789/checklists", { filter: :all})
|
215
|
+
.and_return checklists_payload
|
158
216
|
end
|
159
217
|
|
160
218
|
it "has a list of checklists" do
|
161
|
-
card.checklists.count.
|
219
|
+
expect(card.checklists.count).to be > 0
|
162
220
|
end
|
163
221
|
|
164
222
|
it "creates a new checklist for the card" do
|
165
|
-
client
|
223
|
+
expect(client)
|
224
|
+
.to receive(:post)
|
225
|
+
.with("/cards/abcdef123456789123456789/checklists", name: "new checklist")
|
226
|
+
|
166
227
|
card.create_new_checklist("new checklist")
|
167
228
|
end
|
168
229
|
end
|
169
230
|
|
170
231
|
context "list" do
|
232
|
+
before do
|
233
|
+
allow(client)
|
234
|
+
.to receive(:get)
|
235
|
+
.with("/lists/abcdef123456789123456789", {})
|
236
|
+
.and_return JSON.generate(lists_details.first)
|
237
|
+
end
|
171
238
|
it 'has a list' do
|
172
|
-
|
173
|
-
card.list.should_not be_nil
|
239
|
+
expect(card.list).to_not be_nil
|
174
240
|
end
|
175
241
|
|
176
242
|
it 'can be moved to another list' do
|
177
243
|
other_list = double(id: '987654321987654321fedcba')
|
178
244
|
payload = {value: other_list.id}
|
179
|
-
|
245
|
+
|
246
|
+
expect(client)
|
247
|
+
.to receive(:put)
|
248
|
+
.with("/cards/abcdef123456789123456789/idList", payload)
|
249
|
+
|
180
250
|
card.move_to_list(other_list)
|
181
251
|
end
|
182
252
|
|
183
253
|
it 'should not be moved if new list is identical to old list' do
|
184
254
|
other_list = double(id: 'abcdef123456789123456789')
|
185
|
-
|
186
|
-
client.should_not_receive(:put)
|
255
|
+
expect(client).to_not receive(:put)
|
187
256
|
card.move_to_list(other_list)
|
188
257
|
end
|
189
258
|
|
190
259
|
it "should accept a string for moving a card to list" do
|
191
260
|
payload = { value: "12345678"}
|
192
|
-
|
261
|
+
|
262
|
+
expect(client)
|
263
|
+
.to receive(:put)
|
264
|
+
.with("/cards/abcdef123456789123456789/idList", payload)
|
265
|
+
|
193
266
|
card.move_to_list("12345678")
|
194
267
|
end
|
195
268
|
|
196
269
|
it 'can be moved to another board' do
|
197
270
|
other_board = double(id: '987654321987654321fedcba')
|
198
271
|
payload = {value: other_board.id}
|
199
|
-
|
272
|
+
|
273
|
+
expect(client)
|
274
|
+
.to receive(:put)
|
275
|
+
.with("/cards/abcdef123456789123456789/idBoard", payload)
|
276
|
+
|
200
277
|
card.move_to_board(other_board)
|
201
278
|
end
|
202
279
|
|
@@ -204,24 +281,37 @@ module Trello
|
|
204
281
|
other_board = double(id: '987654321987654321fedcba')
|
205
282
|
other_list = double(id: '987654321987654321aalist')
|
206
283
|
payload = {value: other_board.id, idList: other_list.id}
|
207
|
-
|
284
|
+
|
285
|
+
expect(client)
|
286
|
+
.to receive(:put)
|
287
|
+
.with("/cards/abcdef123456789123456789/idBoard", payload)
|
288
|
+
|
208
289
|
card.move_to_board(other_board, other_list)
|
209
290
|
end
|
210
291
|
|
211
292
|
it 'should not be moved if new board is identical with old board', focus: true do
|
212
293
|
other_board = double(id: 'abcdef123456789123456789')
|
213
|
-
client.
|
294
|
+
expect(client).to_not receive(:put)
|
214
295
|
card.move_to_board(other_board)
|
215
296
|
end
|
216
297
|
end
|
217
298
|
|
218
299
|
context "members" do
|
219
|
-
|
220
|
-
client
|
221
|
-
|
300
|
+
before do
|
301
|
+
allow(client)
|
302
|
+
.to receive(:get)
|
303
|
+
.with("/boards/abcdef123456789123456789", {})
|
304
|
+
.and_return JSON.generate(boards_details.first)
|
222
305
|
|
223
|
-
|
224
|
-
|
306
|
+
allow(client)
|
307
|
+
.to receive(:get)
|
308
|
+
.with("/members/abcdef123456789123456789")
|
309
|
+
.and_return user_payload
|
310
|
+
end
|
311
|
+
|
312
|
+
it "has a list of members" do
|
313
|
+
expect(card.board).to_not be_nil
|
314
|
+
expect(card.members).to_not be_nil
|
225
315
|
end
|
226
316
|
|
227
317
|
it "allows a member to be added to a card" do
|
@@ -229,40 +319,63 @@ module Trello
|
|
229
319
|
payload = {
|
230
320
|
value: new_member.id
|
231
321
|
}
|
232
|
-
|
322
|
+
|
323
|
+
expect(client)
|
324
|
+
.to receive(:post)
|
325
|
+
.with("/cards/abcdef123456789123456789/members", payload)
|
326
|
+
|
233
327
|
card.add_member(new_member)
|
234
328
|
end
|
235
329
|
|
236
330
|
it "allows a member to be removed from a card" do
|
237
331
|
existing_member = double(id: '4ee7df3ce582acdec80000b2')
|
238
|
-
|
332
|
+
|
333
|
+
expect(client)
|
334
|
+
.to receive(:delete)
|
335
|
+
.with("/cards/abcdef123456789123456789/members/#{existing_member.id}")
|
336
|
+
|
239
337
|
card.remove_member(existing_member)
|
240
338
|
end
|
241
339
|
end
|
242
340
|
|
243
341
|
context "comments" do
|
244
342
|
it "posts a comment" do
|
245
|
-
client
|
246
|
-
|
247
|
-
|
343
|
+
expect(client)
|
344
|
+
.to receive(:post)
|
345
|
+
.with("/cards/abcdef123456789123456789/actions/comments", { text: 'testing' })
|
346
|
+
.and_return JSON.generate(boards_details.first)
|
248
347
|
|
249
348
|
card.add_comment "testing"
|
250
349
|
end
|
251
350
|
end
|
252
351
|
|
253
352
|
context "labels" do
|
353
|
+
before do
|
354
|
+
allow(client)
|
355
|
+
.to receive(:get)
|
356
|
+
.with("/cards/abcdef123456789123456789/labels")
|
357
|
+
.and_return label_payload
|
358
|
+
|
359
|
+
allow(client)
|
360
|
+
.to receive(:post)
|
361
|
+
.with("/cards/abcdef123456789123456789/labels", { value: 'green' })
|
362
|
+
.and_return "not important"
|
363
|
+
|
364
|
+
allow(client)
|
365
|
+
.to receive(:delete)
|
366
|
+
.with("/cards/abcdef123456789123456789/labels/green")
|
367
|
+
.and_return "not important"
|
368
|
+
end
|
254
369
|
it "can retrieve labels" do
|
255
|
-
client.stub(:get).with("/cards/abcdef123456789123456789/labels").
|
370
|
+
client.stub(:get).with("/cards/abcdef123456789123456789/labels", {}).
|
256
371
|
and_return label_payload
|
257
372
|
labels = card.labels
|
258
373
|
expect(labels.size).to eq(4)
|
259
|
-
|
260
374
|
expect(labels[0].color).to eq('yellow')
|
261
375
|
expect(labels[0].id).to eq('abcdef123456789123456789')
|
262
376
|
expect(labels[0].board_id).to eq('abcdef123456789123456789')
|
263
377
|
expect(labels[0].name).to eq('iOS')
|
264
378
|
expect(labels[0].uses).to eq(3)
|
265
|
-
|
266
379
|
expect(labels[1].color).to eq('purple')
|
267
380
|
expect(labels[1].id).to eq('abcdef123456789123456789')
|
268
381
|
expect(labels[1].board_id).to eq('abcdef123456789123456789')
|
@@ -270,120 +383,120 @@ module Trello
|
|
270
383
|
expect(labels[1].uses).to eq(1)
|
271
384
|
end
|
272
385
|
|
273
|
-
it "can add a label" do
|
274
|
-
client.stub(:post).with("/cards/abcdef123456789123456789/labels", { value: 'green' }).
|
275
|
-
and_return "not important"
|
276
|
-
card.add_label('green')
|
277
|
-
expect(card.errors).to be_empty
|
278
|
-
end
|
279
|
-
|
280
386
|
it "can remove a label" do
|
281
|
-
client.stub(:delete).with("/cards/abcdef123456789123456789/labels/green").
|
282
|
-
and_return "not important"
|
283
|
-
card.remove_label('green')
|
284
|
-
expect(card.errors).to be_empty
|
285
|
-
end
|
286
|
-
|
287
|
-
it "can remove a label instance" do
|
288
387
|
client.should_receive(:delete).once.with("/cards/abcdef123456789123456789/idLabels/abcdef123456789123456789")
|
289
388
|
label = Label.new(label_details.first)
|
290
389
|
card.remove_label(label)
|
291
390
|
end
|
292
391
|
|
293
|
-
it "can add a label
|
294
|
-
%w(green yellow orange red purple blue sky lime pink black).each do |color|
|
295
|
-
client.stub(:post).with("/cards/abcdef123456789123456789/labels", { :value => color }).
|
296
|
-
and_return "not important"
|
297
|
-
card.add_label(color)
|
298
|
-
expect(card.errors).to be_empty
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
it "can add a label instance" do
|
392
|
+
it "can add a label" do
|
303
393
|
client.should_receive(:post).once.with("/cards/abcdef123456789123456789/idLabels", {:value => "abcdef123456789123456789"})
|
304
394
|
label = Label.new(label_details.first)
|
305
395
|
card.add_label label
|
306
396
|
end
|
307
397
|
|
308
|
-
it "throws an error when trying to add a label
|
309
|
-
client.stub(:post).with("/cards/abcdef123456789123456789/
|
398
|
+
it "throws an error when trying to add a invalid label" do
|
399
|
+
client.stub(:post).with("/cards/abcdef123456789123456789/idLabels", { value: 'abcdef123456789123456789' }).
|
310
400
|
and_return "not important"
|
311
|
-
|
312
|
-
|
401
|
+
label = Label.new(label_details.first)
|
402
|
+
label.name = nil
|
403
|
+
card.add_label(label)
|
404
|
+
expect(card.errors.full_messages.to_sentence).to eq("Label is not valid.")
|
313
405
|
end
|
314
406
|
|
315
|
-
it "throws an error when trying to remove a label
|
316
|
-
client.stub(:delete).with("/cards/abcdef123456789123456789/
|
407
|
+
it "throws an error when trying to remove a invalid label" do
|
408
|
+
client.stub(:delete).with("/cards/abcdef123456789123456789/idLabels/abcdef123456789123456789").
|
317
409
|
and_return "not important"
|
318
|
-
|
319
|
-
|
410
|
+
label = Label.new(label_details.first)
|
411
|
+
label.name = nil
|
412
|
+
card.remove_label(label)
|
413
|
+
expect(card.errors.full_messages.to_sentence).to eq("Label is not valid.")
|
320
414
|
end
|
321
415
|
end
|
322
416
|
|
323
417
|
context "attachments" do
|
324
418
|
it "can add an attachment" do
|
325
419
|
f = File.new('spec/list_spec.rb', 'r')
|
326
|
-
client
|
327
|
-
|
328
|
-
|
329
|
-
|
420
|
+
allow(client)
|
421
|
+
.to receive(:get)
|
422
|
+
.with("/cards/abcdef123456789123456789/attachments")
|
423
|
+
.and_return attachments_payload
|
424
|
+
|
425
|
+
allow(client)
|
426
|
+
.to receive(:post)
|
427
|
+
.with("/cards/abcdef123456789123456789/attachments", { file: f, name: '' })
|
428
|
+
.and_return "not important"
|
330
429
|
|
331
430
|
card.add_attachment(f)
|
332
431
|
|
333
|
-
card.errors.
|
432
|
+
expect(card.errors).to be_empty
|
334
433
|
end
|
335
434
|
|
336
435
|
it "can list the existing attachments with correct fields" do
|
337
|
-
client
|
338
|
-
|
436
|
+
allow(client)
|
437
|
+
.to receive(:get)
|
438
|
+
.with("/boards/abcdef123456789123456789", {})
|
439
|
+
.and_return JSON.generate(boards_details.first)
|
440
|
+
|
441
|
+
allow(client)
|
442
|
+
.to receive(:get)
|
443
|
+
.with("/cards/abcdef123456789123456789/attachments")
|
444
|
+
.and_return attachments_payload
|
445
|
+
|
446
|
+
expect(card.board).to_not be_nil
|
447
|
+
expect(card.attachments).to_not be_nil
|
339
448
|
|
340
|
-
card.board.should_not be_nil
|
341
|
-
card.attachments.should_not be_nil
|
342
449
|
first_attachment = card.attachments.first
|
343
|
-
first_attachment.id.
|
344
|
-
first_attachment.name.
|
345
|
-
first_attachment.url.
|
346
|
-
first_attachment.bytes.
|
347
|
-
first_attachment.member_id.
|
348
|
-
first_attachment.date.
|
349
|
-
first_attachment.is_upload.
|
350
|
-
first_attachment.mime_type.
|
450
|
+
expect(first_attachment.id).to eq attachments_details[0]["id"]
|
451
|
+
expect(first_attachment.name).to eq attachments_details[0]["name"]
|
452
|
+
expect(first_attachment.url).to eq attachments_details[0]["url"]
|
453
|
+
expect(first_attachment.bytes).to eq attachments_details[0]["bytes"]
|
454
|
+
expect(first_attachment.member_id).to eq attachments_details[0]["idMember"]
|
455
|
+
expect(first_attachment.date).to eq Time.parse(attachments_details[0]["date"])
|
456
|
+
expect(first_attachment.is_upload).to eq attachments_details[0]["isUpload"]
|
457
|
+
expect(first_attachment.mime_type).to eq attachments_details[0]["mimeType"]
|
351
458
|
end
|
352
459
|
|
353
460
|
it "can remove an attachment" do
|
354
|
-
client
|
355
|
-
|
356
|
-
|
461
|
+
allow(client)
|
462
|
+
.to receive(:delete)
|
463
|
+
.with("/cards/abcdef123456789123456789/attachments/abcdef123456789123456789")
|
464
|
+
.and_return "not important"
|
465
|
+
|
466
|
+
allow(client)
|
467
|
+
.to receive(:get)
|
468
|
+
.with("/cards/abcdef123456789123456789/attachments")
|
469
|
+
.and_return attachments_payload
|
357
470
|
|
358
471
|
card.remove_attachment(card.attachments.first)
|
359
|
-
card.errors.
|
472
|
+
expect(card.errors).to be_empty
|
360
473
|
end
|
361
474
|
end
|
362
475
|
|
363
476
|
describe "#closed?" do
|
364
477
|
it "returns the closed attribute" do
|
365
|
-
expect(card
|
478
|
+
expect(card).to_not be_closed
|
366
479
|
end
|
367
480
|
end
|
368
481
|
|
369
482
|
describe "#close" do
|
370
483
|
it "updates the close attribute to true" do
|
371
484
|
card.close
|
372
|
-
expect(card
|
485
|
+
expect(card).to be_closed
|
373
486
|
end
|
374
487
|
end
|
375
488
|
|
376
489
|
describe "#close!" do
|
377
490
|
it "updates the close attribute to true and saves the list" do
|
378
|
-
payload = {
|
379
|
-
closed: true,
|
380
|
-
}
|
491
|
+
payload = { closed: true }
|
381
492
|
|
382
|
-
client
|
493
|
+
expect(client)
|
494
|
+
.to receive(:put)
|
495
|
+
.once
|
496
|
+
.with("/cards/abcdef123456789123456789", payload)
|
383
497
|
|
384
498
|
card.close!
|
385
499
|
end
|
386
500
|
end
|
387
|
-
|
388
501
|
end
|
389
502
|
end
|