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.
Files changed (142) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +106 -17
  3. data/lib/trello.rb +47 -34
  4. data/lib/trello/action.rb +10 -8
  5. data/lib/trello/association_builder/has_many.rb +17 -0
  6. data/lib/trello/association_builder/has_one.rb +16 -0
  7. data/lib/trello/association_fetcher/has_many.rb +26 -0
  8. data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
  9. data/lib/trello/association_fetcher/has_many/params.rb +56 -0
  10. data/lib/trello/association_fetcher/has_one.rb +25 -0
  11. data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
  12. data/lib/trello/association_fetcher/has_one/params.rb +36 -0
  13. data/lib/trello/association_infer_tool.rb +13 -0
  14. data/lib/trello/association_proxy.rb +1 -1
  15. data/lib/trello/attachment.rb +13 -10
  16. data/lib/trello/basic_data.rb +16 -49
  17. data/lib/trello/board.rb +17 -3
  18. data/lib/trello/card.rb +103 -38
  19. data/lib/trello/checklist.rb +14 -13
  20. data/lib/trello/client.rb +1 -1
  21. data/lib/trello/comment.rb +4 -4
  22. data/lib/trello/custom_field.rb +131 -0
  23. data/lib/trello/custom_field_item.rb +98 -0
  24. data/lib/trello/custom_field_option.rb +22 -0
  25. data/lib/trello/error.rb +12 -0
  26. data/lib/trello/item.rb +7 -7
  27. data/lib/trello/item_state.rb +3 -3
  28. data/lib/trello/label.rb +30 -12
  29. data/lib/trello/label_name.rb +10 -10
  30. data/lib/trello/list.rb +6 -6
  31. data/lib/trello/member.rb +10 -9
  32. data/lib/trello/notification.rb +6 -6
  33. data/lib/trello/organization.rb +11 -11
  34. data/lib/trello/plugin_datum.rb +6 -6
  35. data/lib/trello/register_attributes.rb +54 -0
  36. data/lib/trello/token.rb +6 -5
  37. data/lib/trello/webhook.rb +5 -5
  38. data/spec/action_spec.rb +22 -1
  39. data/spec/basic_data_spec.rb +58 -0
  40. data/spec/board_spec.rb +28 -2
  41. data/spec/card_spec.rb +183 -8
  42. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  43. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  44. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  45. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  46. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  47. data/spec/cassettes/can_get_actions.yml +196 -0
  48. data/spec/cassettes/can_get_attachments.yml +187 -0
  49. data/spec/cassettes/can_get_comments.yml +193 -0
  50. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  51. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  52. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  53. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  54. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  55. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  56. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  57. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  58. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  59. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  60. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  61. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  62. data/spec/cassettes/can_success_delete_card.yml +185 -0
  63. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  64. data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
  65. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  66. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  67. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  68. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  69. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  70. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  71. data/spec/cassettes/get_board_of_card.yml +187 -0
  72. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  73. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  74. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  75. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  76. data/spec/cassettes/get_list_of_card.yml +188 -0
  77. data/spec/cassettes/get_lists.yml +187 -0
  78. data/spec/cassettes/get_members_of_card.yml +189 -0
  79. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  80. data/spec/cassettes/get_voters_of_card.yml +188 -0
  81. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  82. data/spec/cassettes/revote_on_a_card.yml +464 -0
  83. data/spec/checklist_spec.rb +39 -3
  84. data/spec/client_spec.rb +5 -1
  85. data/spec/custom_field_item_spec.rb +192 -0
  86. data/spec/custom_field_option_spec.rb +49 -0
  87. data/spec/custom_field_spec.rb +261 -0
  88. data/spec/integration/basic_data/many_spec.rb +123 -0
  89. data/spec/integration/basic_data/one_spec.rb +84 -0
  90. data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
  91. data/spec/integration/board/update!_spec.rb +31 -0
  92. data/spec/integration/board_lists_spec.rb +21 -0
  93. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  94. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  95. data/spec/integration/card/add_checklist_spec.rb +32 -0
  96. data/spec/integration/card/add_comment_spec.rb +19 -0
  97. data/spec/integration/card/add_memeber_spec.rb +19 -0
  98. data/spec/integration/card/associations/actions_spec.rb +17 -0
  99. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  100. data/spec/integration/card/associations/board_spec.rb +17 -0
  101. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  102. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  103. data/spec/integration/card/associations/comments_spec.rb +19 -0
  104. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  105. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  106. data/spec/integration/card/associations/list_spec.rb +16 -0
  107. data/spec/integration/card/associations/members_spec.rb +18 -0
  108. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  109. data/spec/integration/card/associations/voters_spec.rb +17 -0
  110. data/spec/integration/card/close!_spec.rb +16 -0
  111. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  112. data/spec/integration/card/create_spec.rb +50 -0
  113. data/spec/integration/card/delete_spec.rb +16 -0
  114. data/spec/integration/card/find_spec.rb +67 -0
  115. data/spec/integration/card/move_to_board_spec.rb +36 -0
  116. data/spec/integration/card/move_to_list_spec.rb +20 -0
  117. data/spec/integration/card/remove_member_spec.rb +19 -0
  118. data/spec/integration/card/save_spec.rb +61 -0
  119. data/spec/integration/card/update!_spec.rb +53 -0
  120. data/spec/integration/card/vote_spec.rb +50 -0
  121. data/spec/integration/custom_field_item_spec.rb +47 -0
  122. data/spec/item_spec.rb +20 -0
  123. data/spec/label_spec.rb +99 -0
  124. data/spec/list_spec.rb +21 -0
  125. data/spec/member_spec.rb +23 -0
  126. data/spec/notification_spec.rb +21 -0
  127. data/spec/organization_spec.rb +26 -0
  128. data/spec/spec_helper.rb +96 -23
  129. data/spec/token_spec.rb +19 -0
  130. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  131. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  132. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  133. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  134. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  135. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  136. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  137. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  138. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  139. data/spec/unit/trello/basic_data_spec.rb +54 -0
  140. data/spec/unit/trello/card_spec.rb +103 -0
  141. data/spec/webhook_spec.rb +20 -0
  142. metadata +224 -30
@@ -167,12 +167,21 @@ module Trello
167
167
  expected_item_id = "1234"
168
168
  expected_state = "incomplete"
169
169
  expected_resource =
170
- "/cards/abccardid/checklist/abcdef123456789123456789" \
171
- "/checkItem/#{expected_item_id}/state"
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
@@ -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(Error, "404 error response")
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