ruby-trello 2.3.1 → 3.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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -2
  3. data/lib/trello.rb +13 -7
  4. data/lib/trello/action.rb +27 -21
  5. data/lib/trello/attachment.rb +40 -27
  6. data/lib/trello/basic_data.rb +104 -9
  7. data/lib/trello/board.rb +88 -102
  8. data/lib/trello/card.rb +34 -235
  9. data/lib/trello/checklist.rb +17 -71
  10. data/lib/trello/comment.rb +32 -22
  11. data/lib/trello/cover_image.rb +20 -0
  12. data/lib/trello/custom_field.rb +31 -84
  13. data/lib/trello/custom_field_item.rb +36 -58
  14. data/lib/trello/custom_field_option.rb +40 -13
  15. data/lib/trello/item.rb +27 -16
  16. data/lib/trello/item_state.rb +7 -15
  17. data/lib/trello/json_utils.rb +1 -1
  18. data/lib/trello/label.rb +14 -101
  19. data/lib/trello/label_name.rb +22 -25
  20. data/lib/trello/list.rb +31 -44
  21. data/lib/trello/member.rb +77 -32
  22. data/lib/trello/notification.rb +27 -20
  23. data/lib/trello/organization.rb +53 -25
  24. data/lib/trello/plugin_datum.rb +11 -16
  25. data/lib/trello/schema.rb +31 -0
  26. data/lib/trello/schema/attribute/base.rb +79 -0
  27. data/lib/trello/schema/attribute/board_pref.rb +45 -0
  28. data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
  29. data/lib/trello/schema/attribute/default.rb +45 -0
  30. data/lib/trello/schema/attribute_builder.rb +42 -0
  31. data/lib/trello/schema/attribute_registration.rb +47 -0
  32. data/lib/trello/schema/serializer/default.rb +17 -0
  33. data/lib/trello/schema/serializer/labels.rb +23 -0
  34. data/lib/trello/schema/serializer/time.rb +25 -0
  35. data/lib/trello/schema/serializer/webhooks.rb +25 -0
  36. data/lib/trello/token.rb +15 -12
  37. data/lib/trello/webhook.rb +18 -71
  38. data/spec/action_spec.rb +1 -2
  39. data/spec/board_spec.rb +43 -103
  40. data/spec/card_spec.rb +51 -50
  41. data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
  42. data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
  43. data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
  44. data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
  45. data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
  46. data/spec/cassettes/can_get_actions_of_board.yml +188 -0
  47. data/spec/cassettes/can_get_actions_of_list.yml +202 -0
  48. data/spec/cassettes/can_get_actions_of_members.yml +199 -0
  49. data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
  50. data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
  51. data/spec/cassettes/can_get_boards_of_label.yml +197 -0
  52. data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
  53. data/spec/cassettes/can_get_cards_of_board.yml +193 -0
  54. data/spec/cassettes/can_get_cards_of_list.yml +201 -0
  55. data/spec/cassettes/can_get_cards_of_member.yml +204 -0
  56. data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
  57. data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
  58. data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
  59. data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
  60. data/spec/cassettes/can_get_labels_of_board.yml +187 -0
  61. data/spec/cassettes/can_get_lists_of_board.yml +187 -0
  62. data/spec/cassettes/can_get_members_of_board.yml +188 -0
  63. data/spec/cassettes/can_get_members_of_organization.yml +200 -0
  64. data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
  65. data/spec/cassettes/can_get_organization_of_board.yml +189 -0
  66. data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
  67. data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
  68. data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
  69. data/spec/cassettes/can_success_create_a_board.yml +98 -0
  70. data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
  71. data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
  72. data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
  73. data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
  74. data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
  75. data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
  76. data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
  77. data/spec/cassettes/can_success_create_a_label.yml +102 -0
  78. data/spec/cassettes/can_success_create_a_list.yml +102 -0
  79. data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
  80. data/spec/cassettes/can_success_create_a_organization.yml +104 -0
  81. data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
  82. data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
  83. data/spec/cassettes/can_success_delete_checklist.yml +284 -0
  84. data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
  85. data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
  86. data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
  87. data/spec/cassettes/can_success_upate_a_board.yml +191 -0
  88. data/spec/cassettes/can_success_upate_a_list.yml +296 -0
  89. data/spec/cassettes/can_success_update_bong_a_board.yml +39 -39
  90. data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
  91. data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
  92. data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
  93. data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
  94. data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
  95. data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
  96. data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
  97. data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
  98. data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
  99. data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
  100. data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
  101. data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
  102. data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
  103. data/spec/cassettes/custom_field_item_save_1.yml +1 -1
  104. data/spec/cassettes/custom_field_item_save_2.yml +1 -1
  105. data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
  106. data/spec/cassettes/get_board_of_list.yml +197 -0
  107. data/spec/cassettes/get_boards_of_member.yml +207 -0
  108. data/spec/cassettes/label_delete.yml +285 -0
  109. data/spec/cassettes/label_find_with_id.yml +100 -0
  110. data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
  111. data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
  112. data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
  113. data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
  114. data/spec/cassettes/notification_find_with_id.yml +103 -0
  115. data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
  116. data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
  117. data/spec/cassettes/token_find_with_token_string.yml +100 -0
  118. data/spec/cassettes/webhook_delete.yml +286 -0
  119. data/spec/cassettes/webhook_find_with_id.yml +100 -0
  120. data/spec/checklist_spec.rb +27 -43
  121. data/spec/custom_field_item_spec.rb +2 -2
  122. data/spec/custom_field_option_spec.rb +2 -2
  123. data/spec/custom_field_spec.rb +25 -13
  124. data/spec/integration/action/find_spec.rb +23 -0
  125. data/spec/integration/basic_data/many_spec.rb +4 -0
  126. data/spec/integration/basic_data/schema_spec.rb +156 -0
  127. data/spec/integration/board/add_member_spec.rb +21 -0
  128. data/spec/integration/board/all_spec.rb +20 -0
  129. data/spec/integration/board/associations/actions_spec.rb +18 -0
  130. data/spec/integration/board/associations/cards_spec.rb +18 -0
  131. data/spec/integration/board/associations/checklists_spec.rb +18 -0
  132. data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
  133. data/spec/integration/board/associations/label_names_spec.rb +17 -0
  134. data/spec/integration/board/associations/labels_spec.rb +18 -0
  135. data/spec/integration/board/associations/lists_spec.rb +18 -0
  136. data/spec/integration/board/associations/members_spec.rb +18 -0
  137. data/spec/integration/board/associations/organization_spec.rb +19 -0
  138. data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
  139. data/spec/integration/board/create_spec.rb +95 -0
  140. data/spec/integration/board/find_card_spec.rb +18 -0
  141. data/spec/integration/board/find_spec.rb +42 -0
  142. data/spec/integration/board/remove_member_spec.rb +21 -0
  143. data/spec/integration/board/save_spec.rb +37 -0
  144. data/spec/integration/board/update!_spec.rb +33 -2
  145. data/spec/integration/card/associations/plugin_data_spec.rb +1 -1
  146. data/spec/integration/card/create_spec.rb +36 -2
  147. data/spec/integration/card/find_spec.rb +1 -1
  148. data/spec/integration/card/save_spec.rb +2 -2
  149. data/spec/integration/checklist/add_item_spec.rb +20 -0
  150. data/spec/integration/checklist/create_spec.rb +23 -0
  151. data/spec/integration/checklist/delete_spec.rb +17 -0
  152. data/spec/integration/checklist/find_spec.rb +22 -0
  153. data/spec/integration/checklist/update!_spec.rb +21 -0
  154. data/spec/integration/checklist/update_item_state_spec.rb +20 -0
  155. data/spec/integration/custom_field/association/board_spec.rb +18 -0
  156. data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
  157. data/spec/integration/custom_field/create_spec.rb +29 -0
  158. data/spec/integration/custom_field/find_spec.rb +41 -0
  159. data/spec/integration/custom_field/update!_spec.rb +25 -0
  160. data/spec/integration/custom_field_option/create_spec.rb +23 -0
  161. data/spec/integration/custom_field_option/delete_spec.rb +19 -0
  162. data/spec/integration/custom_field_option/find_spec.rb +21 -0
  163. data/spec/integration/label/association/board_spec.rb +18 -0
  164. data/spec/integration/label/create_spec.rb +23 -0
  165. data/spec/integration/label/delete_spec.rb +21 -0
  166. data/spec/integration/label/find_spec.rb +20 -0
  167. data/spec/integration/label/update!_spec.rb +25 -0
  168. data/spec/integration/list/archive_all_cards_spec.rb +20 -0
  169. data/spec/integration/list/associations/actions_spec.rb +18 -0
  170. data/spec/integration/list/associations/board_spec.rb +18 -0
  171. data/spec/integration/list/associations/cards_spec.rb +18 -0
  172. data/spec/integration/list/create_spec.rb +44 -0
  173. data/spec/integration/list/find_spec.rb +37 -0
  174. data/spec/integration/list/move_all_cards_spec.rb +31 -0
  175. data/spec/integration/list/save_spec.rb +40 -0
  176. data/spec/integration/list/update!_spec.rb +43 -0
  177. data/spec/integration/member/associations/actions_spec.rb +17 -0
  178. data/spec/integration/member/associations/boards_spec.rb +18 -0
  179. data/spec/integration/member/associations/cards_spec.rb +18 -0
  180. data/spec/integration/member/associations/notifications_spec.rb +18 -0
  181. data/spec/integration/member/associations/organizations_spec.rb +18 -0
  182. data/spec/integration/member/find_spec.rb +39 -0
  183. data/spec/integration/member/update!_spec.rb +18 -0
  184. data/spec/integration/notification/find_spec.rb +27 -0
  185. data/spec/integration/organization/associations/actions_spec.rb +18 -0
  186. data/spec/integration/organization/associations/boards_spec.rb +18 -0
  187. data/spec/integration/organization/associations/members_spec.rb +18 -0
  188. data/spec/integration/organization/create_spec.rb +23 -0
  189. data/spec/integration/organization/find_spec.rb +37 -0
  190. data/spec/integration/organization/update!_spec.rb +28 -0
  191. data/spec/integration/token/find_spec.rb +24 -0
  192. data/spec/integration/webhook/create_spec.rb +27 -0
  193. data/spec/integration/webhook/delete_spec.rb +21 -0
  194. data/spec/integration/webhook/find_spec.rb +22 -0
  195. data/spec/integration/webhook/update!_spec.rb +24 -0
  196. data/spec/item_spec.rb +2 -2
  197. data/spec/label_spec.rb +31 -33
  198. data/spec/list_spec.rb +32 -14
  199. data/spec/notification_spec.rb +3 -3
  200. data/spec/organization_spec.rb +6 -5
  201. data/spec/spec_helper.rb +22 -14
  202. data/spec/token_spec.rb +10 -11
  203. data/spec/unit/trello/basic_data_spec.rb +67 -8
  204. data/spec/unit/trello/board/new_spec.rb +370 -0
  205. data/spec/unit/trello/board/save_spec.rb +49 -0
  206. data/spec/unit/trello/board/update_fields_spec.rb +129 -0
  207. data/spec/unit/trello/board/update_spec.rb +197 -0
  208. data/spec/unit/trello/member/new_spec.rb +62 -0
  209. data/spec/unit/trello/member/update_fields_spec.rb +80 -0
  210. data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
  211. data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
  212. data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
  213. data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
  214. data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
  215. data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
  216. data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
  217. data/spec/unit/trello/schema_spec.rb +25 -0
  218. data/spec/webhook_spec.rb +23 -7
  219. metadata +422 -102
  220. data/lib/trello/register_attributes.rb +0 -54
  221. data/spec/integration/basic_data/register_attributes_spec.rb +0 -75
@@ -0,0 +1,100 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.trello.com/1/webhooks/5fa8a1e0009b2a6a669e6efa?key=DEVELOPER_PUBLIC_KEY&token=MEMBER_TOKEN
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - "*/*"
12
+ User-Agent:
13
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.6.6p146
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Host:
17
+ - api.trello.com
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ X-Dns-Prefetch-Control:
24
+ - 'off'
25
+ X-Frame-Options:
26
+ - DENY
27
+ X-Download-Options:
28
+ - noopen
29
+ X-Permitted-Cross-Domain-Policies:
30
+ - none
31
+ Referrer-Policy:
32
+ - strict-origin-when-cross-origin
33
+ Surrogate-Control:
34
+ - no-store
35
+ Cache-Control:
36
+ - max-age=0, must-revalidate, no-cache, no-store
37
+ Pragma:
38
+ - no-cache
39
+ Expires:
40
+ - Thu, 01 Jan 1970 00:00:00
41
+ X-Trello-Version:
42
+ - 1.2278.0
43
+ X-Trello-Environment:
44
+ - Production
45
+ Set-Cookie:
46
+ - dsc=set_cookie_dsc; Path=/; Expires=Thu, 12 Nov 2020 02:02:32 GMT; Secure
47
+ Access-Control-Allow-Origin:
48
+ - "*"
49
+ Access-Control-Allow-Methods:
50
+ - GET, PUT, POST, DELETE
51
+ Access-Control-Allow-Headers:
52
+ - Authorization, Accept, Content-Type
53
+ Access-Control-Expose-Headers:
54
+ - x-rate-limit-api-key-interval-ms, x-rate-limit-api-key-max, x-rate-limit-api-key-remaining,
55
+ x-rate-limit-api-token-interval-ms, x-rate-limit-api-token-max, x-rate-limit-api-token-remaining
56
+ X-Rate-Limit-Api-Key-Interval-Ms:
57
+ - '10000'
58
+ X-Rate-Limit-Api-Key-Max:
59
+ - '300'
60
+ X-Rate-Limit-Api-Key-Remaining:
61
+ - '299'
62
+ X-Rate-Limit-Api-Token-Interval-Ms:
63
+ - '10000'
64
+ X-Rate-Limit-Api-Token-Max:
65
+ - '100'
66
+ X-Rate-Limit-Api-Token-Remaining:
67
+ - '99'
68
+ X-Rate-Limit-Member-Interval-Ms:
69
+ - '10000'
70
+ X-Rate-Limit-Member-Max:
71
+ - '200'
72
+ X-Rate-Limit-Member-Remaining:
73
+ - '199'
74
+ X-Server-Time:
75
+ - '1604887352812'
76
+ Content-Type:
77
+ - application/json; charset=utf-8
78
+ Date:
79
+ - Mon, 09 Nov 2020 02:02:32 GMT
80
+ X-Envoy-Upstream-Service-Time:
81
+ - '80'
82
+ Expect-Ct:
83
+ - report-uri="https://web-security-reports.services.atlassian.com/expect-ct-report/trello-edge",
84
+ max-age=86400
85
+ Strict-Transport-Security:
86
+ - max-age=63072000; preload
87
+ X-Content-Type-Options:
88
+ - nosniff
89
+ X-Xss-Protection:
90
+ - 1; mode=block
91
+ Server:
92
+ - globaledge-envoy
93
+ Transfer-Encoding:
94
+ - chunked
95
+ body:
96
+ encoding: ASCII-8BIT
97
+ string: '{"id":"5fa8a1e0009b2a6a669e6efa","description":"test","idModel":"5fa759f1564c6e5bb803c61e","callbackURL":"https://example.com/webhook/trello_callbacks","active":true,"consecutiveFailures":0,"firstConsecutiveFailDate":null}'
98
+ http_version: null
99
+ recorded_at: Mon, 09 Nov 2020 02:02:33 GMT
100
+ recorded_with: VCR 5.1.0
@@ -20,7 +20,7 @@ module Trello
20
20
  it "delegates to Trello.client#find" do
21
21
  expect(client)
22
22
  .to receive(:find)
23
- .with(:checklist, 'abcdef123456789123456789', {})
23
+ .with('checklist', 'abcdef123456789123456789', {})
24
24
 
25
25
  Checklist.find('abcdef123456789123456789')
26
26
  end
@@ -35,41 +35,43 @@ module Trello
35
35
 
36
36
  it 'creates a new record and saves it on Trello', refactor: true do
37
37
  payload = {
38
- name: 'Test Checklist',
39
- desc: '',
40
- card_id: cards_details.first['id']
38
+ name: 'Test Checklist',
39
+ card_id: '5e94fd9443f25a7263b165d0'
41
40
  }
42
41
 
43
- attributes = checklists_details.first.merge(payload).except("idBoard")
44
- result = JSON.generate(attributes)
42
+ result = JSON.generate(payload)
45
43
 
46
-
47
- expected_payload = {name: "Test Checklist", idCard: cards_details.first['id']}
44
+ expected_payload = {
45
+ 'name' => 'Test Checklist',
46
+ 'idCard' => '5e94fd9443f25a7263b165d0'
47
+ }
48
48
 
49
49
  expect(client)
50
50
  .to receive(:post)
51
51
  .with("/checklists", expected_payload)
52
52
  .and_return result
53
53
 
54
- checklist = Checklist.create(attributes)
54
+ checklist = Checklist.create(payload)
55
55
 
56
56
  expect(checklist).to be_a Checklist
57
57
  end
58
58
 
59
59
  it 'initializes all fields from response-like hash' do
60
- checklist_details = checklists_details.first
61
- checklist = Checklist.new(checklist_details)
62
- expect(checklist.id).to eq checklist_details['id']
63
- expect(checklist.name).to eq checklist_details['name']
64
- expect(checklist.description).to eq checklist_details['desc']
65
- expect(checklist.closed).to eq checklist_details['closed']
66
- expect(checklist.position).to eq checklist_details['pos']
67
- expect(checklist.url).to eq checklist_details['url']
68
- expect(checklist.board_id).to eq checklist_details['idBoard']
69
- expect(checklist.card_id).to eq checklist_details['idCard']
70
- expect(checklist.list_id).to eq checklist_details['idList']
71
- expect(checklist.member_ids).to eq checklist_details['idMembers']
72
- expect(checklist.check_items).to eq checklist_details['checkItems']
60
+ checklist = Checklist.new(
61
+ 'id' => 'abcdef123456789123456789',
62
+ 'name' => 'Test Checklist',
63
+ 'pos' => 16384,
64
+ 'idBoard' => 'abcdef123456789123456789',
65
+ 'idCard' => 'abccardid',
66
+ 'checkItems' => { 'id' => 'ghijk987654321' }
67
+ )
68
+
69
+ expect(checklist.id).to eq 'abcdef123456789123456789'
70
+ expect(checklist.name).to eq 'Test Checklist'
71
+ expect(checklist.position).to eq 16384
72
+ expect(checklist.board_id).to eq 'abcdef123456789123456789'
73
+ expect(checklist.card_id).to eq 'abccardid'
74
+ expect(checklist.check_items).to eq({ 'id' => 'ghijk987654321' })
73
75
  end
74
76
 
75
77
  it 'initializes required fields from options-like hash' do
@@ -113,7 +115,7 @@ module Trello
113
115
  result = JSON.generate(checklists_details.first)
114
116
  expect(client)
115
117
  .to receive(:put)
116
- .once.with(expected_resource, payload)
118
+ .once.with(expected_resource, {'name' => expected_new_name})
117
119
  .and_return result
118
120
 
119
121
  checklist.name = expected_new_name
@@ -132,7 +134,7 @@ module Trello
132
134
  expect(client)
133
135
  .to receive(:put)
134
136
  .once
135
- .with(expected_resource, payload)
137
+ .with(expected_resource, {'pos' => expected_new_position})
136
138
  .and_return result
137
139
 
138
140
  checklist.position = expected_new_position
@@ -197,19 +199,6 @@ module Trello
197
199
  end
198
200
  end
199
201
 
200
- context "list" do
201
- before do
202
- allow(client)
203
- .to receive(:get)
204
- .with("/lists/abcdef123456789123456789", {})
205
- .and_return JSON.generate(lists_details.first)
206
- end
207
-
208
- it 'has a list' do
209
- expect(checklist.list).to_not be_nil
210
- end
211
- end
212
-
213
202
  context "making a copy" do
214
203
  let(:client) { Trello.client }
215
204
  let(:copy_options) { { :name => checklist.name, :idCard => checklist.card_id } }
@@ -218,7 +207,7 @@ module Trello
218
207
  before(:each) do
219
208
  allow(client)
220
209
  .to receive(:post)
221
- .with("/checklists", copy_options)
210
+ .with("/checklists", copy_options.stringify_keys)
222
211
  .and_return JSON.generate(copied_checklists_details.first)
223
212
 
224
213
  allow(checklist)
@@ -271,15 +260,10 @@ module Trello
271
260
  expected = {
272
261
  'id' => 'id',
273
262
  'name' => 'name',
274
- 'desc' => 'description',
275
- 'closed' => 'closed',
276
- 'url' => 'url',
277
263
  'checkItems' => 'check_items',
278
264
  'pos' => 'position',
279
265
  'idBoard' => 'board_id',
280
266
  'idCard' => 'card_id',
281
- 'idList' => 'list_id',
282
- 'idMembers' => 'member_ids'
283
267
  }
284
268
 
285
269
  checklist = Checklist.new(expected)
@@ -140,7 +140,7 @@ module Trello
140
140
  it 'custom field item does set the changed fields' do
141
141
  text_item.update_fields(fields)
142
142
 
143
- expect(text_item.value).to eq( { number: '42' } )
143
+ expect(text_item.value).to eq( { 'number' => '42' } )
144
144
  end
145
145
 
146
146
  it 'card has been mark as changed' do
@@ -159,7 +159,7 @@ module Trello
159
159
  expect(text_item.value).to eq(text_field_details['value'])
160
160
  end
161
161
 
162
- it "custom field item hasn't been mark as changed", pending: true do
162
+ it "custom field item hasn't been mark as changed" do
163
163
  text_item.update_fields(fields)
164
164
 
165
165
  expect(text_item.changed?).to be_falsy
@@ -27,8 +27,8 @@ module Trello
27
27
  expect(option.value).to eq custom_field_option_details['value']
28
28
  end
29
29
 
30
- it 'gets its pos' do
31
- expect(option.pos).to eq custom_field_option_details['pos']
30
+ it 'gets its position' do
31
+ expect(option.position).to eq custom_field_option_details['pos']
32
32
  end
33
33
  end
34
34
 
@@ -30,7 +30,7 @@ module Trello
30
30
  expect(custom_field.id).to eq(custom_field_details['id'])
31
31
  expect(custom_field.name).to eq(custom_field_details['name'])
32
32
  expect(custom_field.type).to eq(custom_field_details['type'])
33
- expect(custom_field.pos).to eq(custom_field_details['pos'])
33
+ expect(custom_field.position).to eq(custom_field_details['pos'])
34
34
  expect(custom_field.model_id).to eq(custom_field_details['idModel'])
35
35
  expect(custom_field.model_type).to eq(custom_field_details['modelType'])
36
36
  end
@@ -41,7 +41,7 @@ module Trello
41
41
  expect(custom_field.id).to eq(custom_field_details[:id])
42
42
  expect(custom_field.name).to eq(custom_field_details[:name])
43
43
  expect(custom_field.type).to eq(custom_field_details[:type])
44
- expect(custom_field.pos).to eq(custom_field_details[:pos])
44
+ expect(custom_field.position).to eq(custom_field_details[:pos])
45
45
  expect(custom_field.model_id).to eq(custom_field_details[:model_id])
46
46
  expect(custom_field.model_type).to eq(custom_field_details[:model_type])
47
47
  end
@@ -54,25 +54,36 @@ module Trello
54
54
  expect(custom_field.errors).to include(:id)
55
55
  expect(custom_field.errors).to include(:model_id)
56
56
  expect(custom_field.errors).to include(:model_type)
57
- expect(custom_field.errors).to include(:pos)
57
+ expect(custom_field.errors).to include(:position)
58
58
  expect(custom_field.errors).to include(:type)
59
59
  end
60
60
 
61
61
  it 'creates a new record and saves it on Trello', refactor: true do
62
62
  test_payload = {
63
- name: 'Test Custom Field'
63
+ name: 'Test Custom Field',
64
+ type: 'checkbox',
65
+ model_id: 'abc123',
66
+ model_type: 'board',
67
+ position: 123,
68
+ filed_group: nil
64
69
  }
65
70
 
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}
71
+ result = JSON.generate(test_payload)
72
+
73
+ expected_payload = {
74
+ 'name' => 'Test Custom Field',
75
+ 'pos' => 123,
76
+ 'idModel' => 'abc123',
77
+ 'modelType' => 'board',
78
+ 'type' => 'checkbox'
79
+ }
69
80
 
70
81
  expect(client)
71
82
  .to receive(:post)
72
83
  .with('/customFields', expected_payload)
73
84
  .and_return result
74
85
 
75
- custom_field = CustomField.create(custom_fields_details[1].merge(test_payload))
86
+ custom_field = CustomField.create(test_payload)
76
87
  expect(custom_field).to be_a CustomField
77
88
  end
78
89
  end
@@ -102,11 +113,12 @@ module Trello
102
113
  it 'correctly updates custom field name' do
103
114
  expected_new_name = 'Test Name'
104
115
 
105
- payload = { name: expected_new_name }
116
+ payload = { 'name' => expected_new_name }
106
117
 
107
118
  expect(client)
108
119
  .to receive(:put).once
109
120
  .with('/customFields/abcdef123456789123456789', payload)
121
+ .and_return(JSON.generate(payload))
110
122
 
111
123
  custom_field.name = expected_new_name
112
124
  custom_field.save
@@ -135,7 +147,7 @@ module Trello
135
147
  end
136
148
 
137
149
  it 'gets its position' do
138
- expect(custom_field.pos).to_not be_nil
150
+ expect(custom_field.position).to_not be_nil
139
151
  end
140
152
  end
141
153
 
@@ -196,7 +208,7 @@ module Trello
196
208
  expect(custom_field.model_id).to eq custom_field_detail['idModel']
197
209
  expect(custom_field.model_type).to eq custom_field_detail['modelType']
198
210
  expect(custom_field.name).to eq custom_field_detail['name']
199
- expect(custom_field.pos).to eq custom_field_detail['pos']
211
+ expect(custom_field.position).to eq custom_field_detail['pos']
200
212
  expect(custom_field.type).to eq custom_field_detail['type']
201
213
  end
202
214
  end
@@ -227,7 +239,7 @@ module Trello
227
239
  expect(custom_field.name).to eq(custom_field_detail['name'])
228
240
  end
229
241
 
230
- it "custom field hasn't been mark as changed", pending: true do
242
+ it "custom field hasn't been mark as changed" do
231
243
  custom_field.update_fields(fields)
232
244
 
233
245
  expect(custom_field.changed?).to be_falsy
@@ -244,7 +256,7 @@ module Trello
244
256
  expect(custom_field.model_id).to eq custom_field_detail['idModel']
245
257
  expect(custom_field.model_type).to eq custom_field_detail['modelType']
246
258
  expect(custom_field.name).to eq custom_field_detail['name']
247
- expect(custom_field.pos).to eq custom_field_detail['pos']
259
+ expect(custom_field.position).to eq custom_field_detail['pos']
248
260
  expect(custom_field.type).to eq custom_field_detail['type']
249
261
  end
250
262
 
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Trello::Action#find' do
4
+ include IntegrationHelpers
5
+
6
+ before { setup_trello }
7
+
8
+ it 'find with id and get all fields' do
9
+ VCR.use_cassette('action_find_with_id_and_get_all_fields') do
10
+ action = Trello::Action.find('5f60f07958388d26dc063c30')
11
+ expect(action).to be_a(Trello::Action)
12
+
13
+ expect(action.id).to eq('5f60f07958388d26dc063c30')
14
+ expect(action.creator_id).not_to be_nil
15
+ expect(action.data).not_to be_nil
16
+ expect(action.type).not_to be_nil
17
+ expect(action.date).not_to be_nil
18
+ expect(action.limits).not_to be_nil
19
+ expect(action.display).not_to be_nil
20
+ end
21
+ end
22
+
23
+ end
@@ -10,6 +10,10 @@ module Trello
10
10
  class FakeCard < BasicData
11
11
  end
12
12
  class FakeBoard < BasicData
13
+ schema do
14
+ attribute :id
15
+ end
16
+
13
17
  def update_fields(fields)
14
18
  attributes[:id] = fields[:id]
15
19
  end
@@ -0,0 +1,156 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'BasicData#schema' do
4
+
5
+ around do |example|
6
+ module Trello
7
+ class FakeBoard < BasicData
8
+ schema do
9
+ attribute :id, readonly: true, primary_key: true
10
+ attribute :name
11
+ attribute :description, remote_key: :desc
12
+ attribute :last_activity_date, readonly: true, remote_key: :dateLastActivity, serializer: 'Time'
13
+ attribute :keep_cards_from_source, create_only: true, remote_key: :keepFromSource
14
+ attribute :subscribed, update_only: true, default: true
15
+ attribute :visibility_level, remote_key: 'permissionLevel', class_name: 'BoardPref'
16
+ end
17
+ end
18
+ end
19
+
20
+ example.run
21
+
22
+ Trello.send(:remove_const, 'FakeBoard')
23
+ end
24
+
25
+ let(:attributes) { FakeBoard.schema.attrs }
26
+ let(:stringify_init_params) {{
27
+ 'id' => 99,
28
+ 'name' => 'Test Board',
29
+ 'desc' => 'board desc ...',
30
+ 'dateLastActivity' => '2020-02-20 00:00:00',
31
+ 'keepFromSource' => true,
32
+ 'subscribed' => true
33
+ }}
34
+
35
+ let(:symbolize_init_params) {{
36
+ id: 99,
37
+ name: 'Test Board',
38
+ description: 'board desc ...',
39
+ last_activity_date: Time.new(2020, 2, 20),
40
+ keep_cards_from_source: true,
41
+ subscribed: true
42
+ }}
43
+
44
+ it 'will create 6 attributes' do
45
+ expect(attributes.count).to eq(7)
46
+ end
47
+
48
+ it 'can success parse readonly primary key :id' do
49
+ attribute = attributes[:id]
50
+ expect(attribute.name).to eq(:id)
51
+ expect(attribute.primary_key?).to eq(true)
52
+ expect(attribute.readonly?).to eq(true)
53
+ expect(attribute.remote_key).to eq('id')
54
+ expect(attribute.for_action?(:create)).to eq(false)
55
+ expect(attribute.for_action?(:update)).to eq(true)
56
+ expect(attribute.default).to eq(nil)
57
+ expect(attribute.build_attributes({id: 1, name: 'Test'}, {})).to match_hash_with_indifferent_access({id: 1})
58
+ expect(attribute.build_attributes({'id' => 1, 'name' => 'Text'}, {})).to match_hash_with_indifferent_access({id: 1})
59
+ expect(attribute.build_payload_for_create({ id: 1, name: 'Text' }, {})).to eq({})
60
+ expect(attribute.build_payload_for_update({ id: 1, name: 'Text' }, {})).to eq({ 'id' => 1 })
61
+ end
62
+
63
+ it 'can succes parse attribute :name with default setting' do
64
+ attribute = attributes[:name]
65
+ expect(attribute.name).to eq(:name)
66
+ expect(attribute.primary_key?).to eq(false)
67
+ expect(attribute.readonly?).to eq(false)
68
+ expect(attribute.remote_key).to eq('name')
69
+ expect(attribute.for_action?(:create)).to eq(true)
70
+ expect(attribute.for_action?(:update)).to eq(true)
71
+ expect(attribute.default).to eq(nil)
72
+ expect(attribute.build_attributes({id: 1, name: 'Test'}, {})).to match_hash_with_indifferent_access({name: 'Test'})
73
+ expect(attribute.build_attributes({'id' => 1, 'name' => 'Text'}, {})).to match_hash_with_indifferent_access({name: 'Text'})
74
+ expect(attribute.build_payload_for_create({ id: 1, name: 'Text' }, {})).to eq({ 'name' => 'Text' })
75
+ expect(attribute.build_payload_for_update({ id: 1, name: 'Text' }, {})).to eq({ 'name' => 'Text' })
76
+ end
77
+
78
+ it 'can succes parse attribute :description with diferent remote_key' do
79
+ attribute = attributes[:description]
80
+ expect(attribute.name).to eq(:description)
81
+ expect(attribute.primary_key?).to eq(false)
82
+ expect(attribute.readonly?).to eq(false)
83
+ expect(attribute.remote_key).to eq('desc')
84
+ expect(attribute.for_action?(:create)).to eq(true)
85
+ expect(attribute.for_action?(:update)).to eq(true)
86
+ expect(attribute.default).to eq(nil)
87
+ expect(attribute.build_attributes({id: 1, description: '...'}, {})).to match_hash_with_indifferent_access({description: '...'})
88
+ expect(attribute.build_attributes({'id' => 1, 'desc' => '...'}, {})).to match_hash_with_indifferent_access({description: '...'})
89
+ expect(attribute.build_payload_for_create({ id: 1, description: '...' }, {})).to eq({ 'desc' => '...' })
90
+ expect(attribute.build_payload_for_update({ id: 1, description: '...' }, {})).to eq({ 'desc' => '...' })
91
+ end
92
+
93
+ it 'can success parse attribute :keep_cards_from_source with create_only and remote_key' do
94
+ attribute = attributes[:keep_cards_from_source]
95
+ expect(attribute.name).to eq(:keep_cards_from_source)
96
+ expect(attribute.primary_key?).to eq(false)
97
+ expect(attribute.readonly?).to eq(false)
98
+ expect(attribute.remote_key).to eq('keepFromSource')
99
+ expect(attribute.for_action?(:create)).to eq(true)
100
+ expect(attribute.for_action?(:update)).to eq(false)
101
+ expect(attribute.default).to eq(nil)
102
+ expect(attribute.build_attributes({id: 1, keep_cards_from_source: true}, {})).to match_hash_with_indifferent_access({keep_cards_from_source: true})
103
+ expect(attribute.build_attributes({'id' => 1, 'keepFromSource' => true}, {})).to match_hash_with_indifferent_access({keep_cards_from_source: true})
104
+ expect(attribute.build_payload_for_create({ id: 1, keep_cards_from_source: true }, {})).to eq({ 'keepFromSource' => true })
105
+ expect(attribute.build_payload_for_update({ id: 1, keep_cards_from_source: true }, {})).to eq({})
106
+ end
107
+
108
+ it 'can succes parse attribute :subscribed with update only' do
109
+ attribute = attributes[:subscribed]
110
+ expect(attribute.name).to eq(:subscribed)
111
+ expect(attribute.primary_key?).to eq(false)
112
+ expect(attribute.readonly?).to eq(false)
113
+ expect(attribute.remote_key).to eq('subscribed')
114
+ expect(attribute.for_action?(:create)).to eq(false)
115
+ expect(attribute.for_action?(:update)).to eq(true)
116
+ expect(attribute.default).to eq(true)
117
+ expect(attribute.build_attributes({id: 1, subscribed: true}, {})).to match_hash_with_indifferent_access({subscribed: true})
118
+ expect(attribute.build_attributes({id: 1}, {})).to match_hash_with_indifferent_access({subscribed: true})
119
+ expect(attribute.build_attributes({'id' => 1, 'subscribed' => true}, {})).to match_hash_with_indifferent_access({subscribed: true})
120
+ expect(attribute.build_payload_for_create({ id: 1, subscribed: true }, {})).to eq({})
121
+ expect(attribute.build_payload_for_update({ id: 1, subscribed: true }, {})).to eq({ 'subscribed' => true })
122
+ end
123
+
124
+ it 'can success parse attribute :last_activity_date with specific serializer' do
125
+ attribute = attributes[:last_activity_date]
126
+ expect(attribute.name).to eq(:last_activity_date)
127
+ expect(attribute.primary_key?).to eq(false)
128
+ expect(attribute.readonly?).to eq(true)
129
+ expect(attribute.remote_key).to eq('dateLastActivity')
130
+ expect(attribute.for_action?(:create)).to eq(false)
131
+ expect(attribute.for_action?(:update)).to eq(false)
132
+ expect(attribute.default).to eq(nil)
133
+ expect(attribute.build_attributes({id: 1, last_activity_date: Time.new(2020, 1, 1)}, {})).to match_hash_with_indifferent_access({last_activity_date: Time.new(2020, 1, 1)})
134
+ expect(attribute.build_attributes({id: 1}, {})).to match_hash_with_indifferent_access({last_activity_date: nil})
135
+ expect(attribute.build_attributes({'id' => 1, 'dateLastActivity' => Time.new(2020, 1, 1)}, {})).to match_hash_with_indifferent_access({last_activity_date: Time.new(2020, 1, 1)})
136
+ expect(attribute.build_payload_for_create({ id: 1, last_activity_date: Time.new(2020, 1, 1) }, {})).to eq({})
137
+ expect(attribute.build_payload_for_update({ id: 1, last_activity_date: Time.new(2020, 1, 1) }, {})).to eq({})
138
+ end
139
+
140
+ it 'can success parse attribute :visibility_level with specific class_name' do
141
+ attribute = attributes[:visibility_level]
142
+ expect(attribute.name).to eq(:visibility_level)
143
+ expect(attribute.primary_key?).to eq(false)
144
+ expect(attribute.readonly?).to eq(false)
145
+ expect(attribute.remote_key).to eq('permissionLevel')
146
+ expect(attribute.for_action?(:create)).to eq(true)
147
+ expect(attribute.for_action?(:update)).to eq(true)
148
+ expect(attribute.default).to eq(nil)
149
+ expect(attribute.build_attributes({id: 1, visibility_level: 'org'}, {})).to match_hash_with_indifferent_access({visibility_level: 'org'})
150
+ expect(attribute.build_attributes({id: 1}, {})).to match_hash_with_indifferent_access({visibility_level: nil})
151
+ expect(attribute.build_attributes({'id' => 1, 'prefs' => { 'permissionLevel' => 'org' }}, {})).to match_hash_with_indifferent_access({visibility_level: 'org'})
152
+ expect(attribute.build_payload_for_create({ id: 1, visibility_level: 'org' }, {})).to eq({ 'prefs_permissionLevel' => 'org' })
153
+ expect(attribute.build_payload_for_update({ id: 1, visibility_level: 'org' }, {})).to eq({ 'prefs/permissionLevel' => 'org' })
154
+ end
155
+
156
+ end