ruby-trello 2.0.0 → 2.3.1
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.
- checksums.yaml +5 -5
- data/README.md +106 -17
- data/lib/trello.rb +47 -34
- data/lib/trello/action.rb +10 -8
- data/lib/trello/association_builder/has_many.rb +17 -0
- data/lib/trello/association_builder/has_one.rb +16 -0
- data/lib/trello/association_fetcher/has_many.rb +26 -0
- data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
- data/lib/trello/association_fetcher/has_many/params.rb +56 -0
- data/lib/trello/association_fetcher/has_one.rb +25 -0
- data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
- data/lib/trello/association_fetcher/has_one/params.rb +36 -0
- data/lib/trello/association_infer_tool.rb +13 -0
- data/lib/trello/association_proxy.rb +1 -1
- data/lib/trello/attachment.rb +13 -10
- data/lib/trello/basic_data.rb +16 -49
- data/lib/trello/board.rb +17 -3
- data/lib/trello/card.rb +103 -38
- data/lib/trello/checklist.rb +14 -13
- data/lib/trello/client.rb +1 -1
- data/lib/trello/comment.rb +4 -4
- data/lib/trello/custom_field.rb +131 -0
- data/lib/trello/custom_field_item.rb +98 -0
- data/lib/trello/custom_field_option.rb +22 -0
- data/lib/trello/error.rb +12 -0
- data/lib/trello/item.rb +7 -7
- data/lib/trello/item_state.rb +3 -3
- data/lib/trello/label.rb +30 -12
- data/lib/trello/label_name.rb +10 -10
- data/lib/trello/list.rb +6 -6
- data/lib/trello/member.rb +10 -9
- data/lib/trello/notification.rb +6 -6
- data/lib/trello/organization.rb +11 -11
- data/lib/trello/plugin_datum.rb +6 -6
- data/lib/trello/register_attributes.rb +54 -0
- data/lib/trello/token.rb +6 -5
- data/lib/trello/webhook.rb +5 -5
- data/spec/action_spec.rb +22 -1
- data/spec/basic_data_spec.rb +58 -0
- data/spec/board_spec.rb +28 -2
- data/spec/card_spec.rb +183 -8
- data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
- data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
- data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
- data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
- data/spec/cassettes/can_close_bong_a_card.yml +189 -0
- data/spec/cassettes/can_get_actions.yml +196 -0
- data/spec/cassettes/can_get_attachments.yml +187 -0
- data/spec/cassettes/can_get_comments.yml +193 -0
- data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
- data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
- data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
- data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
- data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
- data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
- data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
- data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
- data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
- data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
- data/spec/cassettes/can_success_create_a_card.yml +99 -0
- data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
- data/spec/cassettes/can_success_delete_card.yml +185 -0
- data/spec/cassettes/can_success_upate_a_card.yml +189 -0
- data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
- data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
- data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
- data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
- data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
- data/spec/cassettes/custom_field_item_save_1.yml +97 -0
- data/spec/cassettes/custom_field_item_save_2.yml +281 -0
- data/spec/cassettes/get_board_of_card.yml +187 -0
- data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
- data/spec/cassettes/get_checklists_of_card.yml +187 -0
- data/spec/cassettes/get_cover_image_of_card.yml +187 -0
- data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
- data/spec/cassettes/get_list_of_card.yml +188 -0
- data/spec/cassettes/get_lists.yml +187 -0
- data/spec/cassettes/get_members_of_card.yml +189 -0
- data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
- data/spec/cassettes/get_voters_of_card.yml +188 -0
- data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
- data/spec/cassettes/revote_on_a_card.yml +464 -0
- data/spec/checklist_spec.rb +39 -3
- data/spec/client_spec.rb +5 -1
- data/spec/custom_field_item_spec.rb +192 -0
- data/spec/custom_field_option_spec.rb +49 -0
- data/spec/custom_field_spec.rb +261 -0
- data/spec/integration/basic_data/many_spec.rb +123 -0
- data/spec/integration/basic_data/one_spec.rb +84 -0
- data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
- data/spec/integration/board/update!_spec.rb +31 -0
- data/spec/integration/board_lists_spec.rb +21 -0
- data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
- data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
- data/spec/integration/card/add_checklist_spec.rb +32 -0
- data/spec/integration/card/add_comment_spec.rb +19 -0
- data/spec/integration/card/add_memeber_spec.rb +19 -0
- data/spec/integration/card/associations/actions_spec.rb +17 -0
- data/spec/integration/card/associations/attachments_spec.rb +18 -0
- data/spec/integration/card/associations/board_spec.rb +17 -0
- data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
- data/spec/integration/card/associations/checklists_spec.rb +18 -0
- data/spec/integration/card/associations/comments_spec.rb +19 -0
- data/spec/integration/card/associations/cover_image_spec.rb +18 -0
- data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
- data/spec/integration/card/associations/list_spec.rb +16 -0
- data/spec/integration/card/associations/members_spec.rb +18 -0
- data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
- data/spec/integration/card/associations/voters_spec.rb +17 -0
- data/spec/integration/card/close!_spec.rb +16 -0
- data/spec/integration/card/create_new_check_list_spec.rb +19 -0
- data/spec/integration/card/create_spec.rb +50 -0
- data/spec/integration/card/delete_spec.rb +16 -0
- data/spec/integration/card/find_spec.rb +67 -0
- data/spec/integration/card/move_to_board_spec.rb +36 -0
- data/spec/integration/card/move_to_list_spec.rb +20 -0
- data/spec/integration/card/remove_member_spec.rb +19 -0
- data/spec/integration/card/save_spec.rb +61 -0
- data/spec/integration/card/update!_spec.rb +53 -0
- data/spec/integration/card/vote_spec.rb +50 -0
- data/spec/integration/custom_field_item_spec.rb +47 -0
- data/spec/item_spec.rb +20 -0
- data/spec/label_spec.rb +99 -0
- data/spec/list_spec.rb +21 -0
- data/spec/member_spec.rb +23 -0
- data/spec/notification_spec.rb +21 -0
- data/spec/organization_spec.rb +26 -0
- data/spec/spec_helper.rb +96 -23
- data/spec/token_spec.rb +19 -0
- data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
- data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
- data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
- data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
- data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
- data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
- data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
- data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
- data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
- data/spec/unit/trello/basic_data_spec.rb +54 -0
- data/spec/unit/trello/card_spec.rb +103 -0
- data/spec/webhook_spec.rb +20 -0
- metadata +224 -30
data/spec/checklist_spec.rb
CHANGED
@@ -167,12 +167,21 @@ module Trello
|
|
167
167
|
expected_item_id = "1234"
|
168
168
|
expected_state = "incomplete"
|
169
169
|
expected_resource =
|
170
|
-
"/cards/abccardid/
|
171
|
-
|
172
|
-
payload = { value: expected_state }
|
170
|
+
"/cards/abccardid/checkItem/#{expected_item_id}"
|
171
|
+
payload = { state: expected_state }
|
173
172
|
expect(client).to receive(:put).once.with(expected_resource, payload)
|
174
173
|
checklist.update_item_state(expected_item_id, expected_state)
|
175
174
|
end
|
175
|
+
|
176
|
+
it "updates an item's with boolean input" do
|
177
|
+
expected_item_id = "1234"
|
178
|
+
expected_state = "complete"
|
179
|
+
expected_resource =
|
180
|
+
"/cards/abccardid/checkItem/#{expected_item_id}"
|
181
|
+
payload = { state: expected_state }
|
182
|
+
expect(client).to receive(:put).once.with(expected_resource, payload)
|
183
|
+
checklist.update_item_state(expected_item_id, true)
|
184
|
+
end
|
176
185
|
end
|
177
186
|
|
178
187
|
context "board" do
|
@@ -256,5 +265,32 @@ module Trello
|
|
256
265
|
checklist.copy
|
257
266
|
end
|
258
267
|
end
|
268
|
+
|
269
|
+
describe "#update_fields" do
|
270
|
+
it "does not set any fields when the fields argument is empty" do
|
271
|
+
expected = {
|
272
|
+
'id' => 'id',
|
273
|
+
'name' => 'name',
|
274
|
+
'desc' => 'description',
|
275
|
+
'closed' => 'closed',
|
276
|
+
'url' => 'url',
|
277
|
+
'checkItems' => 'check_items',
|
278
|
+
'pos' => 'position',
|
279
|
+
'idBoard' => 'board_id',
|
280
|
+
'idCard' => 'card_id',
|
281
|
+
'idList' => 'list_id',
|
282
|
+
'idMembers' => 'member_ids'
|
283
|
+
}
|
284
|
+
|
285
|
+
checklist = Checklist.new(expected)
|
286
|
+
checklist.client = client
|
287
|
+
|
288
|
+
checklist.update_fields({})
|
289
|
+
|
290
|
+
expected.each do |key, value|
|
291
|
+
expect(checklist.send(value)).to eq expected[key]
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
259
295
|
end
|
260
296
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -50,7 +50,11 @@ describe Client do
|
|
50
50
|
.to receive(:try_execute)
|
51
51
|
.and_return(response_with_non_200_status)
|
52
52
|
|
53
|
-
expect { client.get "/xxx" }.to raise_error
|
53
|
+
expect { client.get "/xxx" }.to raise_error do |error|
|
54
|
+
expect(error).to be_a(Error)
|
55
|
+
expect(error.message).to eq("404 error response")
|
56
|
+
expect(error.status_code).to eq(404)
|
57
|
+
end
|
54
58
|
end
|
55
59
|
end
|
56
60
|
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Trello
|
4
|
+
describe CustomFieldItem do
|
5
|
+
include Helpers
|
6
|
+
|
7
|
+
let(:text_field_details) {
|
8
|
+
{
|
9
|
+
'id' => 'abcdefgh12345678',
|
10
|
+
'value' => {"text" => "Low Priority"},
|
11
|
+
'idValue' => nil,
|
12
|
+
'idModel' => 'abc123',
|
13
|
+
'idCustomField' => 'abcd1234',
|
14
|
+
'modelType' => 'card'
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
let(:list_item_details) {
|
19
|
+
{
|
20
|
+
'id' => 'abcdefgh12345678',
|
21
|
+
'value' => nil,
|
22
|
+
'idValue' => 'abcde12345',
|
23
|
+
'idModel' => 'abc123',
|
24
|
+
'idCustomField' => 'abcd1234',
|
25
|
+
'modelType' => 'card'
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
let(:client) { Client.new }
|
30
|
+
let(:text_item) { CustomFieldItem.new(text_field_details) }
|
31
|
+
let(:list_item) { CustomFieldItem.new(list_item_details) }
|
32
|
+
|
33
|
+
it 'validates presence of id, model ID and custom field ID' do
|
34
|
+
invalid_item = CustomFieldItem.new
|
35
|
+
|
36
|
+
expect(invalid_item).to be_invalid
|
37
|
+
expect(invalid_item.errors).to include(:id)
|
38
|
+
expect(invalid_item.errors).to include(:model_id)
|
39
|
+
expect(invalid_item.errors).to include(:custom_field_id)
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'retrieve item fields' do
|
43
|
+
it 'gets its id' do
|
44
|
+
expect(text_item.id).to eq text_field_details['id']
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'gets its value' do
|
48
|
+
expect(text_item.value).to eq text_field_details['value']
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'gets its model type' do
|
52
|
+
expect(text_item.model_type).to eq text_field_details['modelType']
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'gets its model ID' do
|
56
|
+
expect(text_item.model_id).to eq text_field_details['idModel']
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'gets its custom field ID' do
|
60
|
+
expect(text_item.custom_field_id).to eq text_field_details['idCustomField']
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'has a value ID for list option' do
|
64
|
+
expect(list_item.option_id).to eq list_item_details['idValue']
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'list option' do
|
69
|
+
let(:client) { Trello.client }
|
70
|
+
|
71
|
+
before do
|
72
|
+
allow(client)
|
73
|
+
.to receive(:get)
|
74
|
+
.with("/customFields/#{list_item.custom_field_id}/options/#{list_item.option_id}")
|
75
|
+
.and_return JSON.generate(custom_field_option_details)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'gets the value' do
|
79
|
+
expect(list_item.option_value).to_not be_nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'custom field' do
|
84
|
+
let(:client) { Trello.client }
|
85
|
+
|
86
|
+
before do
|
87
|
+
allow(client)
|
88
|
+
.to receive(:get)
|
89
|
+
.with("/customFields/abcd1234", {})
|
90
|
+
.and_return JSON.generate(custom_fields_details.first)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'has a custom field' do
|
94
|
+
expect(text_item.custom_field).to be_a CustomField
|
95
|
+
expect(text_item.custom_field.name).to eq('Priority')
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'returns the custom field type' do
|
99
|
+
expect(text_item.type).to eq 'checkbox'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe 'card' do
|
104
|
+
let(:client) { Trello.client }
|
105
|
+
|
106
|
+
before do
|
107
|
+
allow(client)
|
108
|
+
.to receive(:get)
|
109
|
+
.with("/cards/abc123", {})
|
110
|
+
.and_return JSON.generate(cards_details.first)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'has a card' do
|
114
|
+
expect(text_item.card).to be_a Card
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#update_fields' do
|
119
|
+
|
120
|
+
context 'when the fields argument is empty' do
|
121
|
+
let(:fields) { {} }
|
122
|
+
|
123
|
+
it 'custom field item does not set any fields' do
|
124
|
+
text_item.update_fields(fields)
|
125
|
+
|
126
|
+
expect(text_item.id).to eq text_field_details['id']
|
127
|
+
expect(text_item.option_id).to eq text_field_details['idValue']
|
128
|
+
expect(text_item.model_id).to eq text_field_details['idModel']
|
129
|
+
expect(text_item.custom_field_id).to eq text_field_details['idCustomField']
|
130
|
+
expect(text_item.model_type).to eq text_field_details['modelType']
|
131
|
+
expect(text_item.value).to eq text_field_details['value']
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'when the fields argument has at least one field' do
|
136
|
+
|
137
|
+
context 'and the field does changed' do
|
138
|
+
let(:fields) { { value: { number: '42' } } }
|
139
|
+
|
140
|
+
it 'custom field item does set the changed fields' do
|
141
|
+
text_item.update_fields(fields)
|
142
|
+
|
143
|
+
expect(text_item.value).to eq( { number: '42' } )
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'card has been mark as changed' do
|
147
|
+
text_item.update_fields(fields)
|
148
|
+
|
149
|
+
expect(text_item.changed?).to be_truthy
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "and the field doesn't changed" do
|
154
|
+
let(:fields) { { value: text_field_details['value'] } }
|
155
|
+
|
156
|
+
it "custom field item attributes doesn't changed" do
|
157
|
+
text_item.update_fields(fields)
|
158
|
+
|
159
|
+
expect(text_item.value).to eq(text_field_details['value'])
|
160
|
+
end
|
161
|
+
|
162
|
+
it "custom field item hasn't been mark as changed", pending: true do
|
163
|
+
text_item.update_fields(fields)
|
164
|
+
|
165
|
+
expect(text_item.changed?).to be_falsy
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "and the field isn't a correct attributes of the card" do
|
170
|
+
let(:fields) { { abc: 'abc' } }
|
171
|
+
|
172
|
+
it "custom field item attributes doesn't changed" do
|
173
|
+
text_item.update_fields(fields)
|
174
|
+
|
175
|
+
expect(text_item.id).to eq text_field_details['id']
|
176
|
+
expect(text_item.option_id).to eq text_field_details['idValue']
|
177
|
+
expect(text_item.model_id).to eq text_field_details['idModel']
|
178
|
+
expect(text_item.custom_field_id).to eq text_field_details['idCustomField']
|
179
|
+
expect(text_item.model_type).to eq text_field_details['modelType']
|
180
|
+
expect(text_item.value).to eq text_field_details['value']
|
181
|
+
end
|
182
|
+
|
183
|
+
it "custom field item hasn't been mark as changed" do
|
184
|
+
text_item.update_fields(fields)
|
185
|
+
|
186
|
+
expect(text_item.changed?).to be_falsy
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Trello
|
4
|
+
describe CustomFieldOption do
|
5
|
+
include Helpers
|
6
|
+
|
7
|
+
let(:option) { CustomFieldOption.new(custom_field_option_details) }
|
8
|
+
|
9
|
+
it 'validates presence of value and id' do
|
10
|
+
invalid_option = CustomFieldOption.new
|
11
|
+
|
12
|
+
expect(invalid_option).to be_invalid
|
13
|
+
expect(invalid_option.errors).to include(:value)
|
14
|
+
expect(invalid_option.errors).to include(:id)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'retrieve option fields' do
|
18
|
+
it 'gets its id' do
|
19
|
+
expect(option.id).to eq custom_field_option_details['_id']
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'gets its color' do
|
23
|
+
expect(option.color).to eq custom_field_option_details['color']
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'knows its value' do
|
27
|
+
expect(option.value).to eq custom_field_option_details['value']
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'gets its pos' do
|
31
|
+
expect(option.pos).to eq custom_field_option_details['pos']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'update fields' do
|
36
|
+
it 'allows fields to be updated' do
|
37
|
+
updated = {
|
38
|
+
color: "purple",
|
39
|
+
value: { "text" => "Medium Priority" }
|
40
|
+
}
|
41
|
+
|
42
|
+
option.update_fields(updated)
|
43
|
+
|
44
|
+
expect(option.color).to eq "purple"
|
45
|
+
expect(option.value).to eq({"text" => "Medium Priority"})
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,261 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Trello
|
4
|
+
describe CustomField do
|
5
|
+
include Helpers
|
6
|
+
|
7
|
+
let(:custom_field) { client.find('customFields', 'abcdef123456789123456789') }
|
8
|
+
let(:client) { Client.new }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(client)
|
12
|
+
.to receive(:get)
|
13
|
+
.with('/customFields/abcdef123456789123456789', {})
|
14
|
+
.and_return custom_fields_payload
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'creating' do
|
18
|
+
let(:client) { Trello.client }
|
19
|
+
|
20
|
+
it 'creates a new CustomField record' do
|
21
|
+
custom_fields_details.each do |details|
|
22
|
+
custom_field = CustomField.new(details)
|
23
|
+
expect(custom_field).to be_valid
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'properly initializes all fields from response-like formatted hash' do
|
28
|
+
custom_field_details = custom_fields_details.first
|
29
|
+
custom_field = CustomField.new(custom_field_details)
|
30
|
+
expect(custom_field.id).to eq(custom_field_details['id'])
|
31
|
+
expect(custom_field.name).to eq(custom_field_details['name'])
|
32
|
+
expect(custom_field.type).to eq(custom_field_details['type'])
|
33
|
+
expect(custom_field.pos).to eq(custom_field_details['pos'])
|
34
|
+
expect(custom_field.model_id).to eq(custom_field_details['idModel'])
|
35
|
+
expect(custom_field.model_type).to eq(custom_field_details['modelType'])
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'properly initializes all fields from options-like formatted hash' do
|
39
|
+
custom_field_details = custom_fields_details[1]
|
40
|
+
custom_field = CustomField.new(custom_field_details)
|
41
|
+
expect(custom_field.id).to eq(custom_field_details[:id])
|
42
|
+
expect(custom_field.name).to eq(custom_field_details[:name])
|
43
|
+
expect(custom_field.type).to eq(custom_field_details[:type])
|
44
|
+
expect(custom_field.pos).to eq(custom_field_details[:pos])
|
45
|
+
expect(custom_field.model_id).to eq(custom_field_details[:model_id])
|
46
|
+
expect(custom_field.model_type).to eq(custom_field_details[:model_type])
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'validates presence of id, name, model id, model type, type, and position' do
|
50
|
+
custom_field = CustomField.new
|
51
|
+
expect(custom_field).to_not be_valid
|
52
|
+
expect(custom_field.errors.count).to eq(6)
|
53
|
+
expect(custom_field.errors).to include(:name)
|
54
|
+
expect(custom_field.errors).to include(:id)
|
55
|
+
expect(custom_field.errors).to include(:model_id)
|
56
|
+
expect(custom_field.errors).to include(:model_type)
|
57
|
+
expect(custom_field.errors).to include(:pos)
|
58
|
+
expect(custom_field.errors).to include(:type)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'creates a new record and saves it on Trello', refactor: true do
|
62
|
+
test_payload = {
|
63
|
+
name: 'Test Custom Field'
|
64
|
+
}
|
65
|
+
|
66
|
+
result = JSON.generate(custom_fields_details.first.merge(test_payload))
|
67
|
+
expected_payload = {name: 'Test Custom Field', type: 'checkbox', idModel: 'abc123',
|
68
|
+
modelType: 'board', pos: 123, fieldGroup: nil}
|
69
|
+
|
70
|
+
expect(client)
|
71
|
+
.to receive(:post)
|
72
|
+
.with('/customFields', expected_payload)
|
73
|
+
.and_return result
|
74
|
+
|
75
|
+
custom_field = CustomField.create(custom_fields_details[1].merge(test_payload))
|
76
|
+
expect(custom_field).to be_a CustomField
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'finding' do
|
81
|
+
let(:client) { Trello.client }
|
82
|
+
|
83
|
+
before do
|
84
|
+
allow(client)
|
85
|
+
.to receive(:find)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'delegates to Trello.client#find' do
|
89
|
+
expect(client)
|
90
|
+
.to receive(:find)
|
91
|
+
.with('customFields', 'abcdef123456789123456789', {})
|
92
|
+
|
93
|
+
CustomField.find('abcdef123456789123456789')
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'is equivalent to client#find' do
|
97
|
+
expect(CustomField.find('abcdef123456789123456789')).to eq(custom_field)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'updating' do
|
102
|
+
it 'correctly updates custom field name' do
|
103
|
+
expected_new_name = 'Test Name'
|
104
|
+
|
105
|
+
payload = { name: expected_new_name }
|
106
|
+
|
107
|
+
expect(client)
|
108
|
+
.to receive(:put).once
|
109
|
+
.with('/customFields/abcdef123456789123456789', payload)
|
110
|
+
|
111
|
+
custom_field.name = expected_new_name
|
112
|
+
custom_field.save
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'fields' do
|
117
|
+
it 'gets its id' do
|
118
|
+
expect(custom_field.id).to_not be_nil
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'gets its name' do
|
122
|
+
expect(custom_field.name).to_not be_nil
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'gets the model id' do
|
126
|
+
expect(custom_field.model_id).to_not be_nil
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'gets the model type' do
|
130
|
+
expect(custom_field.model_type).to_not be_nil
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'gets its type' do
|
134
|
+
expect(custom_field.type).to_not be_nil
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'gets its position' do
|
138
|
+
expect(custom_field.pos).to_not be_nil
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'boards' do
|
143
|
+
before do
|
144
|
+
allow(client)
|
145
|
+
.to receive(:get)
|
146
|
+
.with('/boards/abc123', {})
|
147
|
+
.and_return JSON.generate(boards_details.first)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'has a board' do
|
151
|
+
expect(custom_field.board).to_not be_nil
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'options' do
|
156
|
+
it 'creates a new option' do
|
157
|
+
payload = { :value => { "text" => "High Priority" } }
|
158
|
+
|
159
|
+
expect(client)
|
160
|
+
.to receive(:post)
|
161
|
+
.with('/customFields/abcdef123456789123456789/options', payload)
|
162
|
+
|
163
|
+
custom_field.create_new_option({"text" => "High Priority"})
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'deletes option' do
|
167
|
+
expect(client)
|
168
|
+
.to receive(:delete)
|
169
|
+
.with('/customFields/abcdef123456789123456789/options/abc123')
|
170
|
+
|
171
|
+
custom_field.delete_option('abc123')
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context 'deleting' do
|
176
|
+
it 'deletes the custom field' do
|
177
|
+
expect(client)
|
178
|
+
.to receive(:delete)
|
179
|
+
.with("/customFields/#{custom_field.id}")
|
180
|
+
|
181
|
+
custom_field.delete
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe '#update_fields' do
|
186
|
+
let(:custom_field_detail) { custom_fields_details.first }
|
187
|
+
let(:custom_field) { CustomField.new(custom_field_detail) }
|
188
|
+
|
189
|
+
context 'when the fields argument is empty' do
|
190
|
+
let(:fields) { {} }
|
191
|
+
|
192
|
+
it 'custom field does not set any fields' do
|
193
|
+
custom_field.update_fields(fields)
|
194
|
+
|
195
|
+
expect(custom_field.id).to eq custom_field_detail['id']
|
196
|
+
expect(custom_field.model_id).to eq custom_field_detail['idModel']
|
197
|
+
expect(custom_field.model_type).to eq custom_field_detail['modelType']
|
198
|
+
expect(custom_field.name).to eq custom_field_detail['name']
|
199
|
+
expect(custom_field.pos).to eq custom_field_detail['pos']
|
200
|
+
expect(custom_field.type).to eq custom_field_detail['type']
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'when the fields argument has at least one field' do
|
205
|
+
context 'and the field does changed' do
|
206
|
+
let(:fields) { { name: 'Awesome Name' } }
|
207
|
+
|
208
|
+
it 'custom field does set the changed fields' do
|
209
|
+
custom_field.update_fields(fields)
|
210
|
+
|
211
|
+
expect(custom_field.name).to eq('Awesome Name')
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'custom field has been mark as changed' do
|
215
|
+
custom_field.update_fields(fields)
|
216
|
+
|
217
|
+
expect(custom_field.changed?).to be_truthy
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
context "and the field doesn't changed" do
|
222
|
+
let(:fields) { { name: custom_field_detail['name'] } }
|
223
|
+
|
224
|
+
it "custom field attributes doesn't changed" do
|
225
|
+
custom_field.update_fields(fields)
|
226
|
+
|
227
|
+
expect(custom_field.name).to eq(custom_field_detail['name'])
|
228
|
+
end
|
229
|
+
|
230
|
+
it "custom field hasn't been mark as changed", pending: true do
|
231
|
+
custom_field.update_fields(fields)
|
232
|
+
|
233
|
+
expect(custom_field.changed?).to be_falsy
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context "and the field isn't a correct attributes of the card" do
|
238
|
+
let(:fields) { { abc: 'abc' } }
|
239
|
+
|
240
|
+
it "custom field attributes doesn't changed" do
|
241
|
+
custom_field.update_fields(fields)
|
242
|
+
|
243
|
+
expect(custom_field.id).to eq custom_field_detail['id']
|
244
|
+
expect(custom_field.model_id).to eq custom_field_detail['idModel']
|
245
|
+
expect(custom_field.model_type).to eq custom_field_detail['modelType']
|
246
|
+
expect(custom_field.name).to eq custom_field_detail['name']
|
247
|
+
expect(custom_field.pos).to eq custom_field_detail['pos']
|
248
|
+
expect(custom_field.type).to eq custom_field_detail['type']
|
249
|
+
end
|
250
|
+
|
251
|
+
it "custom field hasn't been mark as changed" do
|
252
|
+
custom_field.update_fields(fields)
|
253
|
+
|
254
|
+
expect(custom_field.changed?).to be_falsy
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
end
|
261
|
+
end
|