ruby-trello 2.2.0 → 3.1.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 (314) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +63 -10
  3. data/lib/trello/action.rb +31 -23
  4. data/lib/trello/association_builder/has_many.rb +17 -0
  5. data/lib/trello/association_builder/has_one.rb +16 -0
  6. data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
  7. data/lib/trello/association_fetcher/has_many/params.rb +56 -0
  8. data/lib/trello/association_fetcher/has_many.rb +26 -0
  9. data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
  10. data/lib/trello/association_fetcher/has_one/params.rb +36 -0
  11. data/lib/trello/association_fetcher/has_one.rb +25 -0
  12. data/lib/trello/association_infer_tool.rb +13 -0
  13. data/lib/trello/association_proxy.rb +1 -1
  14. data/lib/trello/attachment.rb +40 -27
  15. data/lib/trello/basic_data.rb +103 -49
  16. data/lib/trello/board.rb +88 -102
  17. data/lib/trello/card.rb +49 -198
  18. data/lib/trello/checklist.rb +17 -71
  19. data/lib/trello/comment.rb +39 -26
  20. data/lib/trello/cover_image.rb +20 -0
  21. data/lib/trello/custom_field.rb +31 -67
  22. data/lib/trello/custom_field_item.rb +37 -39
  23. data/lib/trello/custom_field_option.rb +40 -13
  24. data/lib/trello/item.rb +27 -16
  25. data/lib/trello/item_state.rb +7 -15
  26. data/lib/trello/json_utils.rb +1 -1
  27. data/lib/trello/label.rb +15 -85
  28. data/lib/trello/label_name.rb +22 -25
  29. data/lib/trello/list.rb +31 -44
  30. data/lib/trello/member.rb +77 -32
  31. data/lib/trello/notification.rb +27 -20
  32. data/lib/trello/organization.rb +53 -25
  33. data/lib/trello/plugin_datum.rb +11 -16
  34. data/lib/trello/schema/attribute/base.rb +79 -0
  35. data/lib/trello/schema/attribute/board_pref.rb +45 -0
  36. data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
  37. data/lib/trello/schema/attribute/default.rb +45 -0
  38. data/lib/trello/schema/attribute_builder.rb +42 -0
  39. data/lib/trello/schema/attribute_registration.rb +47 -0
  40. data/lib/trello/schema/serializer/default.rb +17 -0
  41. data/lib/trello/schema/serializer/labels.rb +23 -0
  42. data/lib/trello/schema/serializer/time.rb +25 -0
  43. data/lib/trello/schema/serializer/webhooks.rb +25 -0
  44. data/lib/trello/schema.rb +31 -0
  45. data/lib/trello/token.rb +15 -12
  46. data/lib/trello/webhook.rb +18 -71
  47. data/lib/trello.rb +57 -39
  48. data/spec/action_spec.rb +2 -3
  49. data/spec/board_spec.rb +43 -103
  50. data/spec/card_spec.rb +143 -66
  51. data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
  52. data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
  53. data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
  54. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  55. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  56. data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
  57. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  58. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  59. data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
  60. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  61. data/spec/cassettes/can_get_actions.yml +196 -0
  62. data/spec/cassettes/can_get_actions_of_board.yml +188 -0
  63. data/spec/cassettes/can_get_actions_of_list.yml +202 -0
  64. data/spec/cassettes/can_get_actions_of_members.yml +199 -0
  65. data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
  66. data/spec/cassettes/can_get_attachments.yml +187 -0
  67. data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
  68. data/spec/cassettes/can_get_boards_of_label.yml +197 -0
  69. data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
  70. data/spec/cassettes/can_get_cards_of_board.yml +193 -0
  71. data/spec/cassettes/can_get_cards_of_list.yml +201 -0
  72. data/spec/cassettes/can_get_cards_of_member.yml +204 -0
  73. data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
  74. data/spec/cassettes/can_get_comments.yml +193 -0
  75. data/spec/cassettes/can_get_comments_board.yml +109 -0
  76. data/spec/cassettes/can_get_comments_card.yml +111 -0
  77. data/spec/cassettes/can_get_comments_list.yml +109 -0
  78. data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
  79. data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
  80. data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
  81. data/spec/cassettes/can_get_labels_of_board.yml +187 -0
  82. data/spec/cassettes/can_get_lists_of_board.yml +187 -0
  83. data/spec/cassettes/can_get_members_of_board.yml +188 -0
  84. data/spec/cassettes/can_get_members_of_organization.yml +200 -0
  85. data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
  86. data/spec/cassettes/can_get_organization_of_board.yml +189 -0
  87. data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
  88. data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
  89. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  90. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  91. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  92. data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
  93. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  94. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  95. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  96. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  97. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  98. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  99. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  100. data/spec/cassettes/can_success_create_a_board.yml +98 -0
  101. data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
  102. data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
  103. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  104. data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
  105. data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
  106. data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
  107. data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
  108. data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
  109. data/spec/cassettes/can_success_create_a_label.yml +102 -0
  110. data/spec/cassettes/can_success_create_a_list.yml +102 -0
  111. data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
  112. data/spec/cassettes/can_success_create_a_organization.yml +104 -0
  113. data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
  114. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  115. data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
  116. data/spec/cassettes/can_success_delete_card.yml +185 -0
  117. data/spec/cassettes/can_success_delete_checklist.yml +284 -0
  118. data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
  119. data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
  120. data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
  121. data/spec/cassettes/can_success_upate_a_board.yml +191 -0
  122. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  123. data/spec/cassettes/can_success_upate_a_list.yml +296 -0
  124. data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
  125. data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
  126. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  127. data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
  128. data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
  129. data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
  130. data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
  131. data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
  132. data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
  133. data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
  134. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  135. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  136. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  137. data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
  138. data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
  139. data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
  140. data/spec/cassettes/comment_delete.yml +331 -0
  141. data/spec/cassettes/comment_find_with_id.yml +116 -0
  142. data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
  143. data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
  144. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  145. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  146. data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
  147. data/spec/cassettes/get_board_of_card.yml +187 -0
  148. data/spec/cassettes/get_board_of_list.yml +197 -0
  149. data/spec/cassettes/get_boards_of_member.yml +207 -0
  150. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  151. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  152. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  153. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  154. data/spec/cassettes/get_list_of_card.yml +188 -0
  155. data/spec/cassettes/get_lists.yml +187 -0
  156. data/spec/cassettes/get_members_of_card.yml +189 -0
  157. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  158. data/spec/cassettes/get_voters_of_card.yml +188 -0
  159. data/spec/cassettes/label_delete.yml +285 -0
  160. data/spec/cassettes/label_find_with_id.yml +100 -0
  161. data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
  162. data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
  163. data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
  164. data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
  165. data/spec/cassettes/notification_find_with_id.yml +103 -0
  166. data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
  167. data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
  168. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  169. data/spec/cassettes/revote_on_a_card.yml +464 -0
  170. data/spec/cassettes/token_find_with_token_string.yml +100 -0
  171. data/spec/cassettes/webhook_delete.yml +286 -0
  172. data/spec/cassettes/webhook_find_with_id.yml +100 -0
  173. data/spec/checklist_spec.rb +27 -43
  174. data/spec/custom_field_item_spec.rb +74 -0
  175. data/spec/custom_field_option_spec.rb +2 -2
  176. data/spec/custom_field_spec.rb +98 -10
  177. data/spec/integration/action/find_spec.rb +23 -0
  178. data/spec/integration/basic_data/many_spec.rb +127 -0
  179. data/spec/integration/basic_data/one_spec.rb +84 -0
  180. data/spec/integration/basic_data/schema_spec.rb +156 -0
  181. data/spec/integration/board/add_member_spec.rb +21 -0
  182. data/spec/integration/board/all_spec.rb +20 -0
  183. data/spec/integration/board/associations/actions_spec.rb +18 -0
  184. data/spec/integration/board/associations/cards_spec.rb +18 -0
  185. data/spec/integration/board/associations/checklists_spec.rb +18 -0
  186. data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
  187. data/spec/integration/board/associations/label_names_spec.rb +17 -0
  188. data/spec/integration/board/associations/labels_spec.rb +18 -0
  189. data/spec/integration/board/associations/lists_spec.rb +18 -0
  190. data/spec/integration/board/associations/members_spec.rb +18 -0
  191. data/spec/integration/board/associations/organization_spec.rb +19 -0
  192. data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
  193. data/spec/integration/board/create_spec.rb +95 -0
  194. data/spec/integration/board/find_card_spec.rb +18 -0
  195. data/spec/integration/board/find_spec.rb +42 -0
  196. data/spec/integration/board/remove_member_spec.rb +21 -0
  197. data/spec/integration/board/save_spec.rb +37 -0
  198. data/spec/integration/board/update!_spec.rb +62 -0
  199. data/spec/integration/board_lists_spec.rb +21 -0
  200. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  201. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  202. data/spec/integration/card/add_checklist_spec.rb +32 -0
  203. data/spec/integration/card/add_comment_spec.rb +19 -0
  204. data/spec/integration/card/add_memeber_spec.rb +19 -0
  205. data/spec/integration/card/associations/actions_spec.rb +17 -0
  206. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  207. data/spec/integration/card/associations/board_spec.rb +17 -0
  208. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  209. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  210. data/spec/integration/card/associations/comments_spec.rb +19 -0
  211. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  212. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  213. data/spec/integration/card/associations/list_spec.rb +16 -0
  214. data/spec/integration/card/associations/members_spec.rb +18 -0
  215. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  216. data/spec/integration/card/associations/voters_spec.rb +17 -0
  217. data/spec/integration/card/close!_spec.rb +16 -0
  218. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  219. data/spec/integration/card/create_spec.rb +84 -0
  220. data/spec/integration/card/delete_spec.rb +16 -0
  221. data/spec/integration/card/find_spec.rb +67 -0
  222. data/spec/integration/card/move_to_board_spec.rb +36 -0
  223. data/spec/integration/card/move_to_list_spec.rb +20 -0
  224. data/spec/integration/card/remove_member_spec.rb +19 -0
  225. data/spec/integration/card/save_spec.rb +61 -0
  226. data/spec/integration/card/update!_spec.rb +53 -0
  227. data/spec/integration/card/vote_spec.rb +50 -0
  228. data/spec/integration/checklist/add_item_spec.rb +20 -0
  229. data/spec/integration/checklist/create_spec.rb +23 -0
  230. data/spec/integration/checklist/delete_spec.rb +17 -0
  231. data/spec/integration/checklist/find_spec.rb +22 -0
  232. data/spec/integration/checklist/update!_spec.rb +21 -0
  233. data/spec/integration/checklist/update_item_state_spec.rb +20 -0
  234. data/spec/integration/comment/association/board_spec.rb +17 -0
  235. data/spec/integration/comment/association/card_spec.rb +17 -0
  236. data/spec/integration/comment/association/list_spec.rb +17 -0
  237. data/spec/integration/comment/delete_spec.rb +20 -0
  238. data/spec/integration/comment/find_spec.rb +17 -0
  239. data/spec/integration/custom_field/association/board_spec.rb +18 -0
  240. data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
  241. data/spec/integration/custom_field/create_spec.rb +29 -0
  242. data/spec/integration/custom_field/find_spec.rb +41 -0
  243. data/spec/integration/custom_field/update!_spec.rb +25 -0
  244. data/spec/integration/custom_field_item_spec.rb +47 -0
  245. data/spec/integration/custom_field_option/create_spec.rb +23 -0
  246. data/spec/integration/custom_field_option/delete_spec.rb +19 -0
  247. data/spec/integration/custom_field_option/find_spec.rb +21 -0
  248. data/spec/integration/label/association/board_spec.rb +18 -0
  249. data/spec/integration/label/create_spec.rb +23 -0
  250. data/spec/integration/label/delete_spec.rb +21 -0
  251. data/spec/integration/label/find_spec.rb +20 -0
  252. data/spec/integration/label/update!_spec.rb +25 -0
  253. data/spec/integration/list/archive_all_cards_spec.rb +20 -0
  254. data/spec/integration/list/associations/actions_spec.rb +18 -0
  255. data/spec/integration/list/associations/board_spec.rb +18 -0
  256. data/spec/integration/list/associations/cards_spec.rb +18 -0
  257. data/spec/integration/list/create_spec.rb +44 -0
  258. data/spec/integration/list/find_spec.rb +37 -0
  259. data/spec/integration/list/move_all_cards_spec.rb +31 -0
  260. data/spec/integration/list/save_spec.rb +40 -0
  261. data/spec/integration/list/update!_spec.rb +43 -0
  262. data/spec/integration/member/associations/actions_spec.rb +17 -0
  263. data/spec/integration/member/associations/boards_spec.rb +18 -0
  264. data/spec/integration/member/associations/cards_spec.rb +18 -0
  265. data/spec/integration/member/associations/notifications_spec.rb +18 -0
  266. data/spec/integration/member/associations/organizations_spec.rb +18 -0
  267. data/spec/integration/member/find_spec.rb +39 -0
  268. data/spec/integration/member/update!_spec.rb +18 -0
  269. data/spec/integration/notification/find_spec.rb +27 -0
  270. data/spec/integration/organization/associations/actions_spec.rb +18 -0
  271. data/spec/integration/organization/associations/boards_spec.rb +18 -0
  272. data/spec/integration/organization/associations/members_spec.rb +18 -0
  273. data/spec/integration/organization/create_spec.rb +23 -0
  274. data/spec/integration/organization/find_spec.rb +37 -0
  275. data/spec/integration/organization/update!_spec.rb +28 -0
  276. data/spec/integration/token/find_spec.rb +24 -0
  277. data/spec/integration/webhook/create_spec.rb +27 -0
  278. data/spec/integration/webhook/delete_spec.rb +21 -0
  279. data/spec/integration/webhook/find_spec.rb +22 -0
  280. data/spec/integration/webhook/update!_spec.rb +24 -0
  281. data/spec/item_spec.rb +2 -2
  282. data/spec/label_spec.rb +105 -28
  283. data/spec/list_spec.rb +32 -14
  284. data/spec/notification_spec.rb +3 -3
  285. data/spec/organization_spec.rb +6 -5
  286. data/spec/spec_helper.rb +70 -37
  287. data/spec/token_spec.rb +10 -11
  288. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  289. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  290. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  291. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  292. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  293. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  294. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  295. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  296. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  297. data/spec/unit/trello/basic_data_spec.rb +113 -0
  298. data/spec/unit/trello/board/new_spec.rb +370 -0
  299. data/spec/unit/trello/board/save_spec.rb +49 -0
  300. data/spec/unit/trello/board/update_fields_spec.rb +129 -0
  301. data/spec/unit/trello/board/update_spec.rb +197 -0
  302. data/spec/unit/trello/card_spec.rb +103 -0
  303. data/spec/unit/trello/member/new_spec.rb +62 -0
  304. data/spec/unit/trello/member/update_fields_spec.rb +80 -0
  305. data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
  306. data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
  307. data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
  308. data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
  309. data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
  310. data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
  311. data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
  312. data/spec/unit/trello/schema_spec.rb +25 -0
  313. data/spec/webhook_spec.rb +23 -7
  314. metadata +556 -33
data/spec/label_spec.rb CHANGED
@@ -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(:label, 'abcdef123456789123456789', {})
23
+ .with('label', 'abcdef123456789123456789', {})
24
24
 
25
25
  Label.find('abcdef123456789123456789')
26
26
  end
@@ -43,7 +43,6 @@ module Trello
43
43
  expect(label.color).to eq details['color']
44
44
  expect(label.name).to eq details['name']
45
45
  expect(label.id).to eq details['id']
46
- expect(label.uses).to eq details['uses']
47
46
  expect(label.board_id).to eq details['idBoard']
48
47
  end
49
48
 
@@ -71,14 +70,16 @@ module Trello
71
70
 
72
71
  result = JSON.generate(cards_details.first.merge(payload.merge(idBoard: boards_details.first['id'])))
73
72
 
74
- expected_payload = {name: "Test Label", color: nil, idBoard: "abcdef123456789123456789" }
73
+ expected_payload = {'name' => 'Test Label', 'color' => 'yellow', 'idBoard' => 'abcdef123456789123456789' }
75
74
 
76
- expect(client)
75
+ expect(Label.client)
77
76
  .to receive(:post)
78
- .with("/labels", expected_payload)
77
+ .with('/labels', expected_payload)
79
78
  .and_return result
80
79
 
81
- label = Label.create(label_details.first.merge(payload.merge(board_id: boards_details.first['id'])))
80
+ params = label_details.first.merge(payload.merge(board_id: boards_details.first['id']))
81
+ params.delete('id')
82
+ label = Label.create params
82
83
 
83
84
  expect(label).to be_a Label
84
85
  end
@@ -89,13 +90,19 @@ module Trello
89
90
  expected_new_name = "xxx"
90
91
 
91
92
  payload = {
92
- name: expected_new_name,
93
+ 'name' => expected_new_name,
93
94
  }
94
95
 
95
96
  expect(client)
96
97
  .to receive(:put)
97
98
  .once
98
99
  .with("/labels/abcdef123456789123456789", payload)
100
+ .and_return({
101
+ "id" => "abcdef123456789123456789",
102
+ "idBoard" => "5e70f5bed3f34a49e2f11409",
103
+ "name" => "xxx",
104
+ "color" => "purple"
105
+ }.to_json)
99
106
 
100
107
  label.name = expected_new_name
101
108
  label.save
@@ -105,13 +112,19 @@ module Trello
105
112
  expected_new_color = "purple"
106
113
 
107
114
  payload = {
108
- color: expected_new_color,
115
+ 'color' => expected_new_color
109
116
  }
110
117
 
111
118
  expect(client)
112
119
  .to receive(:put)
113
120
  .once
114
121
  .with("/labels/abcdef123456789123456789", payload)
122
+ .and_return({
123
+ "id" => "abcdef123456789123456789",
124
+ "idBoard" => "5e70f5bed3f34a49e2f11409",
125
+ "name" => "",
126
+ "color" => "purple"
127
+ }.to_json)
115
128
 
116
129
  label.color = expected_new_color
117
130
  label.save
@@ -121,26 +134,19 @@ module Trello
121
134
  %w(green yellow orange red purple blue sky lime pink black).each do |color|
122
135
  allow(client)
123
136
  .to receive(:put)
124
- .with("/labels/abcdef123456789123456789", {color: color})
125
- .and_return "not important"
137
+ .with("/labels/abcdef123456789123456789", {'color' => color})
138
+ .and_return({
139
+ "id" => "abcdef123456789123456789",
140
+ "idBoard" => "5e70f5bed3f34a49e2f11409",
141
+ "name" => "",
142
+ "color" => color
143
+ }.to_json)
126
144
 
127
145
  label.color = color
128
146
  label.save
129
147
  expect(label.errors).to be_empty
130
148
  end
131
149
  end
132
-
133
- it "throws an error when trying to update a label with an unknown colour" do
134
- allow(client)
135
- .to receive(:put)
136
- .with("/labels/abcdef123456789123456789", {})
137
- .and_return "not important"
138
-
139
- label.color = 'mauve'
140
- label.save
141
-
142
- expect(label.errors.full_messages.to_sentence).to eq("Label color 'mauve' does not exist")
143
- end
144
150
  end
145
151
 
146
152
  context "deleting" do
@@ -162,10 +168,6 @@ module Trello
162
168
  expect(label.name).to_not be_nil
163
169
  end
164
170
 
165
- it "gets its usage" do
166
- expect(label.uses).to_not be_nil
167
- end
168
-
169
171
  it "gets its color" do
170
172
  expect(label.color).to_not be_nil
171
173
  end
@@ -188,8 +190,7 @@ module Trello
188
190
  'id' => 'id',
189
191
  'name' => 'name',
190
192
  'color' => 'color',
191
- 'idBoard' => 'board_id',
192
- 'uses' => 'uses'
193
+ 'idBoard' => 'board_id'
193
194
  }
194
195
 
195
196
  label = Label.new(expected)
@@ -201,5 +202,81 @@ module Trello
201
202
  end
202
203
  end
203
204
  end
205
+
206
+ describe '#update_fields' do
207
+ let(:label_detail) {{
208
+ 'id' => 'id',
209
+ 'name' => 'name',
210
+ 'color' => 'color',
211
+ 'idBoard' => 'board_id'
212
+ }}
213
+ let(:label) { Label.new(label_detail) }
214
+
215
+ context 'when the fields argument is empty' do
216
+ let(:fields) { {} }
217
+
218
+ it 'card does not set any fields' do
219
+ label.update_fields(fields)
220
+
221
+ expect(label.id).to eq label_detail['id']
222
+ expect(label.name).to eq label_detail['name']
223
+ expect(label.color).to eq label_detail['color']
224
+ expect(label.board_id).to eq label_detail['idBoard']
225
+ end
226
+ end
227
+
228
+ context 'when the fields argument has at least one field' do
229
+ context 'and the field does changed' do
230
+ let(:fields) { { name: 'Awesome Name' } }
231
+
232
+ it 'label does set the changed fields' do
233
+ label.update_fields(fields)
234
+
235
+ expect(label.name).to eq('Awesome Name')
236
+ end
237
+
238
+ it 'label has been mark as changed' do
239
+ label.update_fields(fields)
240
+
241
+ expect(label.changed?).to be_truthy
242
+ end
243
+ end
244
+
245
+ context "and the field doesn't changed" do
246
+ let(:fields) { { name: label_detail['name'] } }
247
+
248
+ it "label attributes doesn't changed" do
249
+ label.update_fields(fields)
250
+
251
+ expect(label.name).to eq(label_detail['name'])
252
+ end
253
+
254
+ it "label hasn't been mark as changed" do
255
+ label.update_fields(fields)
256
+
257
+ expect(label.changed?).to be_falsy
258
+ end
259
+ end
260
+
261
+ context "and the field isn't a correct attributes of the label" do
262
+ let(:fields) { { abc: 'abc' } }
263
+
264
+ it "label attributes doesn't changed" do
265
+ label.update_fields(fields)
266
+
267
+ expect(label.id).to eq label_detail['id']
268
+ expect(label.name).to eq label_detail['name']
269
+ expect(label.color).to eq label_detail['color']
270
+ expect(label.board_id).to eq label_detail['idBoard']
271
+ end
272
+
273
+ it "label hasn't been mark as changed" do
274
+ label.update_fields(fields)
275
+
276
+ expect(label.changed?).to be_falsy
277
+ end
278
+ end
279
+ end
280
+ end
204
281
  end
205
282
  end
data/spec/list_spec.rb CHANGED
@@ -84,11 +84,10 @@ module Trello
84
84
  result = JSON.generate(payload)
85
85
 
86
86
  expected_payload = {
87
- name: 'Test List',
88
- closed: false,
89
- idBoard: 'abcdef123456789123456789',
90
- pos: 42,
91
- idListSource: 'abcdef123456789'
87
+ 'name' => 'Test List',
88
+ 'pos' => 42,
89
+ 'idBoard' => 'abcdef123456789123456789',
90
+ 'idListSource' => 'abcdef123456789'
92
91
  }
93
92
 
94
93
  expect(client)
@@ -105,15 +104,14 @@ module Trello
105
104
  expected_new_name = 'xxx'
106
105
 
107
106
  payload = {
108
- name: expected_new_name,
109
- closed: false,
110
- pos: list.pos
107
+ 'name' => expected_new_name
111
108
  }
112
109
 
113
110
  expect(client)
114
111
  .to receive(:put)
115
112
  .once
116
113
  .with('/lists/abcdef123456789123456789', payload)
114
+ .and_return({}.to_s)
117
115
 
118
116
  list.name = expected_new_name
119
117
  list.save
@@ -122,15 +120,14 @@ module Trello
122
120
  it 'updates position' do
123
121
  new_position = 42
124
122
  payload = {
125
- name: list.name,
126
- closed: list.closed,
127
- pos: new_position
123
+ 'pos' => new_position
128
124
  }
129
125
 
130
126
  expect(client)
131
127
  .to receive(:put)
132
128
  .once
133
129
  .with('/lists/abcdef123456789123456789', payload)
130
+ .and_return({}.to_s)
134
131
 
135
132
  list.pos = new_position
136
133
  list.save
@@ -220,10 +217,9 @@ module Trello
220
217
  .to receive(:put)
221
218
  .once
222
219
  .with('/lists/abcdef123456789123456789', {
223
- name: list.name,
224
- closed: true,
225
- pos: list.pos
220
+ 'closed' => true
226
221
  })
222
+ .and_return({}.to_s)
227
223
 
228
224
  list.close!
229
225
  end
@@ -249,5 +245,27 @@ module Trello
249
245
  end
250
246
  end
251
247
  end
248
+
249
+ describe '#move_to_board' do
250
+ let(:board) { Trello::Board.new(id: 'someid') }
251
+ context 'given the destination board parameter is a Trello::Board instance' do
252
+ it 'moves to the destination board' do
253
+ expect(client)
254
+ .to receive(:put)
255
+ .with("/lists/#{list.id}/idBoard", value: 'someid')
256
+
257
+ list.move_to_board(board)
258
+ end
259
+ end
260
+ context 'given the destination board parameter is an id string' do
261
+ it 'moves to the destination board' do
262
+ expect(client)
263
+ .to receive(:put)
264
+ .with("/lists/#{list.id}/idBoard", value: 'someid')
265
+
266
+ list.move_to_board(board.id)
267
+ end
268
+ end
269
+ end
252
270
  end
253
271
  end
@@ -82,7 +82,7 @@ module Trello
82
82
  .with("/members/#{user_details['id']}", {})
83
83
  .and_return user_payload
84
84
 
85
- expect(notification.member_creator.id).to eq user_details['id']
85
+ expect(notification.creator.id).to eq user_details['id']
86
86
  end
87
87
  end
88
88
 
@@ -115,7 +115,7 @@ module Trello
115
115
  end
116
116
 
117
117
  it "gets the member creator id" do
118
- expect(notification.member_creator_id).to eq notification_details['idMemberCreator']
118
+ expect(notification.creator_id).to eq notification_details['idMemberCreator']
119
119
  end
120
120
  end
121
121
 
@@ -127,7 +127,7 @@ module Trello
127
127
  'type' => 'type',
128
128
  'date' => 'date',
129
129
  'data' => 'data',
130
- 'idMemberCreator' => 'member_creator_id'
130
+ 'idMemberCreator' => 'creator_id'
131
131
  }
132
132
 
133
133
  notification = Notification.new(expected)
@@ -47,14 +47,15 @@ module Trello
47
47
  'id' => 'id',
48
48
  'name' => 'name',
49
49
  'displayName' => 'display_name',
50
+ 'descData' => 'desc_data',
51
+ 'website' => 'website',
52
+ 'teamType' => 'team_type',
50
53
  'desc' => 'description',
51
54
  'url' => 'url',
52
- 'invited' => 'invited',
53
- 'website' => 'website',
54
55
  'logoHash' => 'logo_hash',
55
- 'billableMemberCount' => 'billable_member_count',
56
- 'activeBillableMemberCount' => 'active_billable_member_count',
57
- 'memberships' => 'memberships'
56
+ 'logoUrl' => 'logo_url',
57
+ 'products' => 'products',
58
+ 'powerUps' => 'power_ups'
58
59
  }
59
60
 
60
61
  organization = Organization.new(expected)
data/spec/spec_helper.rb CHANGED
@@ -1,36 +1,47 @@
1
- require 'rubygems'
1
+ require 'bundler/setup'
2
+ require 'dotenv/load'
3
+ require 'trello'
4
+ require 'webmock/rspec'
5
+ require 'stringio'
6
+ require 'vcr'
2
7
 
3
- unless defined? Rubinius
4
- require 'simplecov'
5
- SimpleCov.start
6
- end
8
+ require 'pry-byebug' if RUBY_ENGINE != 'jruby'
7
9
 
8
- begin
9
- require 'pry-byebug'
10
- rescue LoadError
11
- end
10
+ VCR.configure do |config|
11
+ config.default_cassette_options = { match_requests_on: %i[uri method body] }
12
+ config.cassette_library_dir = 'spec/cassettes'
13
+ config.hook_into :webmock
12
14
 
13
- # Set up gems listed in the Gemfile.
14
- begin
15
- ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
16
- require 'bundler'
17
- Bundler.setup
18
- rescue Bundler::GemNotFound => e
19
- STDERR.puts e.message
20
- STDERR.puts 'Try running `bundle install`.'
21
- exit!
22
- end
15
+ config.filter_sensitive_data('DEVELOPER_PUBLIC_KEY') do |interaction|
16
+ CGI.parse(URI.parse(interaction.request.uri).query)['key'].first
17
+ end
18
+ config.filter_sensitive_data('MEMBER_TOKEN') do |interaction|
19
+ CGI.parse(URI.parse(interaction.request.uri).query)['token'].first
20
+ end
21
+ config.filter_sensitive_data('set_cookie_dsc') do |interaction|
22
+ set_cookie_headers = interaction.response.headers['Set-Cookie']
23
23
 
24
- Bundler.require(:spec)
24
+ if set_cookie_headers
25
+ set_cookie_headers.first.scan(/dsc=(\w+)/).flatten.first
26
+ end
27
+ end
25
28
 
26
- require 'trello'
27
- require 'webmock/rspec'
28
- require 'stringio'
29
+ uri_without_credentials_matcher = lambda do |match_request, coming_request|
30
+ without_public_key = -> (uri) { uri.sub(/key=\w+/, 'key=DEVELOPER_PUBLIC_KEY') }
31
+ without_member_token = -> (uri) { uri.sub(/token=\w+/, 'token=MEMBER_TOKEN') }
32
+ without_credentials = -> (request) { without_public_key.call(without_member_token.call(request.uri)) }
33
+
34
+ without_credentials.call(match_request) == without_credentials.call(coming_request)
35
+ end
36
+
37
+ config.default_cassette_options[:match_requests_on] = [:method, uri_without_credentials_matcher]
38
+ end
29
39
 
30
40
  Trello.logger = Logger.new(StringIO.new)
31
41
 
32
42
  RSpec.configure do |rspec|
33
43
  rspec.filter_run_excluding broken: true
44
+ rspec.filter_run_when_matching focus: true
34
45
 
35
46
  rspec.before :each do
36
47
  Trello.reset!
@@ -42,6 +53,41 @@ RSpec.configure do |rspec|
42
53
  example.run
43
54
  $VERBOSE = verbose
44
55
  end
56
+
57
+ rspec.failure_color = :magenta
58
+ rspec.tty = true
59
+ rspec.color = true
60
+ end
61
+
62
+ RSpec::Expectations.configuration.on_potential_false_positives = :nothing
63
+
64
+ module IntegrationHelpers
65
+ def setup_trello
66
+ Trello.configure do |config|
67
+ config.developer_public_key = ENV['TRELLO_DEVELOPER_PUBLIC_KEY'] || 'developerpublickey'
68
+ config.member_token = ENV['TRELLO_MEMBER_TOKEN'] || 'membertoken'
69
+ end
70
+ end
71
+ end
72
+
73
+ RSpec::Matchers.define :match_hash_with_indifferent_access do |expected|
74
+ match do |actual|
75
+ actual.with_indifferent_access == expected.with_indifferent_access
76
+ end
77
+
78
+ failure_message do |actual|
79
+ <<~EOF
80
+ expected: #{expected}
81
+ got: #{actual}
82
+ EOF
83
+ end
84
+
85
+ failure_message_when_negated do |actual|
86
+ <<~EOF
87
+ expected: value != #{expected}
88
+ got: #{actual}
89
+ EOF
90
+ end
45
91
  end
46
92
 
47
93
  module Helpers
@@ -319,20 +365,7 @@ module Helpers
319
365
  {
320
366
  'id' => '4ee7e59ae582acdec8000291',
321
367
  'name' => 'publicorg',
322
- 'desc' => 'This is a test organization',
323
- 'members' => [{
324
- 'id' => '4ee7df3ce582acdec80000b2',
325
- 'username' => 'alicetester',
326
- 'fullName' => 'Alice Tester'
327
- }, {
328
- 'id' => '4ee7df74e582acdec80000b6',
329
- 'username' => 'davidtester',
330
- 'fullName' => 'David Tester'
331
- }, {
332
- 'id' => '4ee7e2e1e582acdec8000112',
333
- 'username' => 'edtester',
334
- 'fullName' => 'Ed Tester'
335
- }]
368
+ 'desc' => 'This is a test organization'
336
369
  }
337
370
  end
338
371
 
data/spec/token_spec.rb CHANGED
@@ -69,20 +69,19 @@ module Trello
69
69
 
70
70
  describe "#update_fields" do
71
71
  it "does not set any fields when the fields argument is empty" do
72
- expected = {
73
- 'id' => 'id',
74
- 'idMember' => 'member_id',
75
- 'permissions' => 'permissions',
76
- 'webhooks' => 'webhooks'
77
- }
78
-
79
- token = Token.new(expected)
72
+ token = Token.new({
73
+ 'id' => 'aaa',
74
+ 'idMember' => 'ccc',
75
+ 'permissions' => {},
76
+ 'webhooks' => []
77
+ })
80
78
 
81
79
  token.update_fields({})
82
80
 
83
- expected.each do |key, value|
84
- expect(token.send(value)).to eq expected[key]
85
- end
81
+ expect(token.id).to eq('aaa')
82
+ expect(token.member_id).to eq('ccc')
83
+ expect(token.permissions).to eq({})
84
+ expect(token.webhooks).to eq([])
86
85
  end
87
86
  end
88
87
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationBuilder::HasMany do
4
+
5
+ describe '.build' do
6
+ around do |example|
7
+ class FakeBoard; end
8
+
9
+ example.run
10
+
11
+ Object.send(:remove_const, 'FakeBoard')
12
+ end
13
+
14
+ it 'build has many finder method' do
15
+ Trello::AssociationBuilder::HasMany.build(FakeBoard, 'boards', {})
16
+
17
+ expect(FakeBoard.new.respond_to?(:boards)).to eq(true)
18
+ end
19
+
20
+ it 'the finder method return result from Trello::AssociationFetcher' do
21
+ fake_board = FakeBoard.new
22
+ has_many_fetcher = instance_double(Trello::AssociationFetcher::HasMany)
23
+ allow(Trello::AssociationFetcher::HasMany)
24
+ .to receive(:new)
25
+ .with(fake_board, 'boards', {})
26
+ .and_return(has_many_fetcher)
27
+
28
+ result = double('result')
29
+ allow(has_many_fetcher).to receive(:fetch).with(a: 1, b: 2).and_return(result)
30
+
31
+ Trello::AssociationBuilder::HasMany.build(FakeBoard, 'boards', {})
32
+ expect(fake_board.boards(a: 1, b: 2)).to eq(result)
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationBuilder::HasOne do
4
+
5
+ describe '.build' do
6
+ around do |example|
7
+ class FakeBoard; end
8
+
9
+ example.run
10
+
11
+ Object.send(:remove_const, 'FakeBoard')
12
+ end
13
+
14
+ it 'build has one finder method' do
15
+ Trello::AssociationBuilder::HasOne.build(FakeBoard, 'organization', {})
16
+
17
+ expect(FakeBoard.new.respond_to?(:organization)).to eq(true)
18
+ end
19
+
20
+ it 'the finder method return result from Trello::AssociationFetcher' do
21
+ fake_board = FakeBoard.new
22
+ has_one_fetcher = instance_double(Trello::AssociationFetcher::HasOne)
23
+ allow(Trello::AssociationFetcher::HasOne)
24
+ .to receive(:new)
25
+ .with(fake_board, 'organization', {})
26
+ .and_return(has_one_fetcher)
27
+
28
+ result = double('result')
29
+ allow(has_one_fetcher).to receive(:fetch).and_return(result)
30
+
31
+ Trello::AssociationBuilder::HasOne.build(FakeBoard, 'organization', {})
32
+ expect(fake_board.organization).to eq(result)
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationFetcher::HasMany::Fetch do
4
+
5
+ describe '.execute' do
6
+ let(:client) { instance_double(Trello::Client) }
7
+ let(:association_class) { double('Association Class') }
8
+ let(:association_owner) { double('association_owner', client: client) }
9
+ let(:fetch_path) { '/test' }
10
+ let(:filter_params) { { a: 1 } }
11
+ let(:resources) { double('resources') }
12
+ let(:result) { double('result') }
13
+
14
+ let(:params) { instance_double('params',
15
+ association_class: association_class,
16
+ association_owner: association_owner,
17
+ fetch_path: fetch_path,
18
+ filter_params: filter_params
19
+ ) }
20
+
21
+ before do
22
+ allow(Trello).to receive(:client).and_return(client)
23
+ allow(client)
24
+ .to receive(:find_many)
25
+ .with(association_class, fetch_path, filter_params)
26
+ .and_return(resources)
27
+ allow(Trello::MultiAssociation)
28
+ .to receive(:new)
29
+ .with(association_owner, resources)
30
+ .and_return(double('multi-association', proxy: result))
31
+ end
32
+
33
+ it 'return the result from Trello.client and MultiAssociation' do
34
+ expect(Trello::AssociationFetcher::HasMany::Fetch.execute(params)).to eq(result)
35
+ end
36
+ end
37
+
38
+ end