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
@@ -0,0 +1,349 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'Trello::Schema::Attribute::Base' do
4
+
5
+ let(:attribute) { Trello::Schema::Attribute::Base.new(name: name, options: options, serializer: serializer) }
6
+
7
+ describe '#name' do
8
+ let(:options) { nil }
9
+ let(:serializer) { Trello::Schema::Serializer::Default }
10
+
11
+ context 'when name is a symbol' do
12
+ let(:name) { :name }
13
+
14
+ it 'directly return the name' do
15
+ expect(attribute.name).to eq(:name)
16
+ end
17
+ end
18
+
19
+ context 'when name is a string' do
20
+ let(:name) { 'name' }
21
+
22
+ it 'directly return the symbolize name' do
23
+ expect(attribute.name).to eq(:name)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe '#primary_key?' do
29
+ let(:name) { :name }
30
+ let(:serializer) { Trello::Schema::Serializer::Default }
31
+
32
+ context 'when explict pass primary_key' do
33
+ let(:options) { { primary_key: true } }
34
+
35
+ it 'direct return the primary_key value' do
36
+ expect(attribute.primary_key?).to eq(true)
37
+ end
38
+ end
39
+
40
+ context 'when does not explict pass primary_key' do
41
+ let(:options) { nil }
42
+
43
+ it 'return false' do
44
+ expect(attribute.primary_key?).to eq(false)
45
+ end
46
+ end
47
+ end
48
+
49
+ describe '#readlonly?' do
50
+ let(:name) { :name }
51
+ let(:serializer) { Trello::Schema::Serializer::Default }
52
+
53
+ context 'when does not explict pass readonly parameter' do
54
+ let(:options) { nil }
55
+
56
+ it 'return false' do
57
+ expect(attribute.readonly?).to eq(false)
58
+ end
59
+ end
60
+
61
+ context 'when does explict pass readonly parameter' do
62
+ context 'and readonly is true' do
63
+ let(:options) { { readonly: true } }
64
+
65
+ it 'return true' do
66
+ expect(attribute.readonly?).to eq(true)
67
+ end
68
+ end
69
+
70
+ context 'and readonly is false' do
71
+ let(:options) { { readonly: false } }
72
+
73
+ it 'return false' do
74
+ expect(attribute.readonly?).to eq(false)
75
+ end
76
+ end
77
+
78
+ context 'and readonly is not a boolean' do
79
+ let(:options) { { readonly: 'other' } }
80
+
81
+ it 'return false' do
82
+ expect(attribute.readonly?).to eq(false)
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ describe '#update_only?' do
89
+ let(:name) { :name }
90
+ let(:serializer) { Trello::Schema::Serializer::Default }
91
+
92
+ context 'when does not explict pass update_only parameter' do
93
+ let(:options) { nil }
94
+
95
+ it 'return false' do
96
+ expect(attribute.update_only?).to eq(false)
97
+ end
98
+ end
99
+
100
+ context 'when does explict pass update_only parameter' do
101
+ context 'and update_only is true' do
102
+ let(:options) { { update_only: true } }
103
+
104
+ it 'return true' do
105
+ expect(attribute.update_only?).to eq(true)
106
+ end
107
+ end
108
+
109
+ context 'and update_only is false' do
110
+ let(:options) { { update_only: false } }
111
+
112
+ it 'return false' do
113
+ expect(attribute.update_only?).to eq(false)
114
+ end
115
+ end
116
+
117
+ context 'and update_only is not a boolean' do
118
+ let(:options) { { update_only: 'other' } }
119
+
120
+ it 'return false' do
121
+ expect(attribute.update_only?).to eq(false)
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ describe '#create_only?' do
128
+ let(:name) { :name }
129
+ let(:serializer) { Trello::Schema::Serializer::Default }
130
+
131
+ context 'when does not explict pass create_only parameter' do
132
+ let(:options) { nil }
133
+
134
+ it 'return false' do
135
+ expect(attribute.create_only?).to eq(false)
136
+ end
137
+ end
138
+
139
+ context 'when does explict pass create_only parameter' do
140
+ context 'and create_only is true' do
141
+ let(:options) { { create_only: true } }
142
+
143
+ it 'return true' do
144
+ expect(attribute.create_only?).to eq(true)
145
+ end
146
+ end
147
+
148
+ context 'and create_only is false' do
149
+ let(:options) { { create_only: false } }
150
+
151
+ it 'return false' do
152
+ expect(attribute.create_only?).to eq(false)
153
+ end
154
+ end
155
+
156
+ context 'and create_only is not a boolean' do
157
+ let(:options) { { create_only: 'other' } }
158
+
159
+ it 'return false' do
160
+ expect(attribute.create_only?).to eq(false)
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ describe '#for_action?' do
167
+ let(:name) { :name }
168
+ let(:serializer) { Trello::Schema::Serializer::Default }
169
+
170
+ context 'when it is a primary_key' do
171
+ let(:options) { { primary_key: true } }
172
+
173
+ context 'pass in :create' do
174
+ it 'return false' do
175
+ expect(attribute.for_action?(:create)).to eq(false)
176
+ end
177
+ end
178
+
179
+ context 'pass in :update' do
180
+ it 'return true' do
181
+ expect(attribute.for_action?(:update)).to eq(true)
182
+ end
183
+ end
184
+ end
185
+
186
+ context 'when it is a update_only attribute' do
187
+ let(:options) { { update_only: true } }
188
+
189
+ context 'pass in :create' do
190
+ it 'return false' do
191
+ expect(attribute.for_action?(:create)).to eq(false)
192
+ end
193
+ end
194
+
195
+ context 'pass in :update' do
196
+ it 'return true' do
197
+ expect(attribute.for_action?(:update)).to eq(true)
198
+ end
199
+ end
200
+ end
201
+
202
+ context 'when it is a create_only attribute' do
203
+ let(:options) { { create_only: true } }
204
+
205
+ context 'pass in :create' do
206
+ it 'return true' do
207
+ expect(attribute.for_action?(:create)).to eq(true)
208
+ end
209
+ end
210
+
211
+ context 'pass in :update' do
212
+ it 'return false' do
213
+ expect(attribute.for_action?(:update)).to eq(false)
214
+ end
215
+ end
216
+ end
217
+
218
+ context 'when it is a readonly attribute' do
219
+ context 'and it is a primary_key' do
220
+ let(:options) { { readonly: true, primary_key: true } }
221
+
222
+ context 'pass in :create' do
223
+ it 'return false' do
224
+ expect(attribute.for_action?(:create)).to eq(false)
225
+ end
226
+ end
227
+
228
+ context 'pass in :update' do
229
+ it 'return true' do
230
+ expect(attribute.for_action?(:update)).to eq(true)
231
+ end
232
+ end
233
+ end
234
+
235
+ context 'and it is not a primary_key' do
236
+ let(:options) { { readonly: true } }
237
+
238
+ context 'pass in :create' do
239
+ it 'return false' do
240
+ expect(attribute.for_action?(:create)).to eq(false)
241
+ end
242
+ end
243
+
244
+ context 'pass in :update' do
245
+ it 'return false' do
246
+ expect(attribute.for_action?(:update)).to eq(false)
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+
253
+ describe '#remote_key' do
254
+ let(:name) { :date_create_utc }
255
+ let(:serializer) { double('serializer') }
256
+
257
+ context 'when explict pass in remote_key' do
258
+ context 'and remote_key is a string' do
259
+ let(:options) { { remote_key: 'dateCreateUTC' } }
260
+
261
+ it 'directly return the stringify remote_key' do
262
+ expect(attribute.remote_key).to eq('dateCreateUTC')
263
+ end
264
+ end
265
+
266
+ context 'and remote_key is a symbol' do
267
+ let(:options) { { remote_key: :dateCreateUTC } }
268
+
269
+ it 'directly return the stringify remote_key' do
270
+ expect(attribute.remote_key).to eq('dateCreateUTC')
271
+ end
272
+ end
273
+ end
274
+
275
+ context 'when does not explict pass in remote_key' do
276
+ let(:options) { {} }
277
+
278
+ it 'return the stringify name' do
279
+ expect(attribute.remote_key).to eq('date_create_utc')
280
+ end
281
+ end
282
+ end
283
+
284
+ describe '#default' do
285
+ let(:name) { :closed }
286
+ let(:serializer) { double('serializer') }
287
+
288
+ context 'when explicit pass in default' do
289
+ let(:options) { { default: false } }
290
+
291
+ it 'directly return the default value' do
292
+ expect(attribute.default).to eq(false)
293
+ end
294
+ end
295
+
296
+ context 'when does not explict pass in default' do
297
+ let(:options) { {} }
298
+
299
+ it 'return nil' do
300
+ expect(attribute.default).to eq(nil)
301
+ end
302
+ end
303
+ end
304
+
305
+ describe '#build_attributes' do
306
+ let(:name) { :date_create_utc }
307
+ let(:serializer) { double('serializer') }
308
+ let(:options) { nil }
309
+
310
+ it 'will raise exception' do
311
+ expect{ attribute.build_attributes({}, {}) }.to raise_error('Need override')
312
+ end
313
+ end
314
+
315
+ describe '#build_payload_for_create' do
316
+ let(:name) { :date_create_utc }
317
+ let(:serializer) { double('serializer') }
318
+ let(:options) { nil }
319
+
320
+ it 'will raise exception' do
321
+ expect{ attribute.build_payload_for_create({}, {}) }.to raise_error('Need override')
322
+ end
323
+ end
324
+
325
+ describe '#build_payload_for_update' do
326
+ let(:name) { :date_create_utc }
327
+ let(:serializer) { double('serializer') }
328
+ let(:options) { nil }
329
+
330
+ it 'will raise exception' do
331
+ expect{ attribute.build_payload_for_update({}, {}) }.to raise_error('Need override')
332
+ end
333
+ end
334
+
335
+ describe '#register' do
336
+ let(:name) { :date_create_utc }
337
+ let(:serializer) { double('serializer') }
338
+ let(:options) { nil }
339
+
340
+ let(:board_klass) { double('Trello::Board') }
341
+
342
+ it 'call register on AttributeRegistration' do
343
+ expect(Trello::Schema::AttributeRegistration).to receive(:register).with(board_klass, attribute)
344
+
345
+ attribute.register(board_klass)
346
+ end
347
+ end
348
+
349
+ end
@@ -0,0 +1,208 @@
1
+
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe 'Trello::Schema::Attribute::BoardPref' do
5
+
6
+ let(:attribute) { Trello::Schema::Attribute::BoardPref.new(name: name, options: options, serializer: serializer) }
7
+
8
+ describe '#build_attributes' do
9
+ let(:name) { :visibility_level }
10
+ let(:options) { { remote_key: :permissionLevel } }
11
+ let(:serializer) { double('serializer') }
12
+ let(:default) { nil }
13
+
14
+ before do
15
+ allow(serializer)
16
+ .to receive(:deserialize)
17
+ .with(raw_value, default)
18
+ .and_return(deserialize_result)
19
+ end
20
+
21
+ let(:build_attributes) { attribute.build_attributes(params, attributes) }
22
+ let(:attributes) { { name: 'John' } }
23
+
24
+ context 'when prefs and name key are both missing' do
25
+ let(:raw_value) { nil }
26
+ let(:deserialize_result) { nil }
27
+ let(:params) { {} }
28
+
29
+ it 'deserialize and set the attribute to nil' do
30
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
31
+ end
32
+ end
33
+
34
+ context "when params's key prefs exits" do
35
+ context 'and target key is missing' do
36
+ let(:raw_value) { nil }
37
+ let(:deserialize_result) { nil }
38
+ let(:params) { { 'prefs' => {} } }
39
+
40
+ it 'deserialize and set the attribute to nil' do
41
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
42
+ end
43
+ end
44
+
45
+ context 'and target value is nil' do
46
+ let(:raw_value) { nil }
47
+ let(:deserialize_result) { nil }
48
+ let(:params) { { 'prefs' => { 'permissionLevel' => nil } } }
49
+
50
+ it 'deserialize and set the attribute to nil' do
51
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
52
+ end
53
+ end
54
+
55
+ context 'and target value is false' do
56
+ let(:raw_value) { false }
57
+ let(:deserialize_result) { false }
58
+ let(:params) { { 'prefs' => { 'permissionLevel' => false } } }
59
+
60
+ it 'deserialize and set the attribute to false' do
61
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: false })
62
+ end
63
+ end
64
+
65
+ context 'and target value is not nil or false' do
66
+ let(:raw_value) { 'org' }
67
+ let(:deserialize_result) { 'org' }
68
+ let(:params) { { 'prefs' => { 'permissionLevel' => 'org' } } }
69
+
70
+ it 'deserialize and set the attribute' do
71
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: 'org' })
72
+ end
73
+ end
74
+ end
75
+
76
+ context "when params's key prefs does not exits" do
77
+ context 'and target value is nil' do
78
+ let(:raw_value) { nil }
79
+ let(:deserialize_result) { nil }
80
+ let(:params) { { visibility_level: nil } }
81
+
82
+ it 'get and deserialize that value and set to attributes with symbolize name' do
83
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
84
+ end
85
+ end
86
+
87
+ context 'and target value is false' do
88
+ let(:raw_value) { false }
89
+ let(:deserialize_result) { false }
90
+ let(:params) { { visibility_level: false } }
91
+
92
+ it 'get and deserialize that value and set to attributes with symbolize name' do
93
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: false })
94
+ end
95
+ end
96
+
97
+ context 'and target value is not nil or false ' do
98
+ let(:raw_value) { 'org' }
99
+ let(:deserialize_result) { 'org' }
100
+ let(:params) { { visibility_level: 'org' } }
101
+
102
+ it 'get and deserialize that value and set to attributes with symbolize name' do
103
+ expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: 'org' })
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#build_payload_for_create' do
110
+ let(:name) { :visibility_level }
111
+ let(:options) { { remote_key: :permissionLevel } }
112
+ let(:serializer) { double('serializer') }
113
+ let(:default) { nil }
114
+
115
+ before do
116
+ allow(serializer)
117
+ .to receive(:serialize)
118
+ .with('org')
119
+ .and_return('org')
120
+ end
121
+
122
+ let(:build_attributes) { attribute.build_payload_for_create(attributes, payload) }
123
+ let(:payload) { { 'name' => 'John' } }
124
+
125
+
126
+ context 'when attribute is for action create' do
127
+
128
+ context 'when attribute value is nil' do
129
+ let(:attributes) { { visibility_level: nil } }
130
+
131
+ it "won't put it in payload" do
132
+ expect(build_attributes).to eq({ 'name' => 'John' })
133
+ end
134
+ end
135
+
136
+ context 'when attributes does not contain the attribute key' do
137
+ let(:attributes) { {} }
138
+
139
+ it "won't put it in payload" do
140
+ expect(build_attributes).to eq({ 'name' => 'John' })
141
+ end
142
+ end
143
+
144
+ context 'when attribute value is normal' do
145
+ let(:attributes) { { visibility_level: 'org' } }
146
+
147
+ it 'get and serialize that value and set to payload with stringify name' do
148
+ expect(build_attributes).to eq({ 'name' => 'John', 'prefs_permissionLevel' => 'org' })
149
+ end
150
+ end
151
+ end
152
+
153
+ context 'when attribute is not for action create' do
154
+ let(:options) { { remote_key: :permissionLevel, update_only: true } }
155
+ let(:attributes) { { visibility_level: 'org' } }
156
+
157
+ it "won't put it in payload" do
158
+ expect(build_attributes).to eq({ 'name' => 'John' })
159
+ end
160
+ end
161
+ end
162
+
163
+ describe '#build_payload_for_update' do
164
+ let(:name) { :visibility_level }
165
+ let(:serializer) { double('serializer') }
166
+ let(:default) { nil }
167
+
168
+ before do
169
+ allow(serializer)
170
+ .to receive(:serialize)
171
+ .with('org')
172
+ .and_return('org')
173
+ end
174
+
175
+ let(:build_attributes) { attribute.build_payload_for_update(attributes, payload) }
176
+ let(:payload) { { 'name' => 'John' } }
177
+
178
+ context 'when attribute is for action create' do
179
+ let(:options) { { remote_key: :permissionLevel } }
180
+
181
+ context 'when attributes does not contain the attribute key' do
182
+ let(:attributes) { {} }
183
+
184
+ it "won't put it in payload" do
185
+ expect(build_attributes).to eq({ 'name' => 'John' })
186
+ end
187
+ end
188
+
189
+ context 'when attribute value is normal' do
190
+ let(:attributes) { { visibility_level: 'org' } }
191
+
192
+ it 'get and serialize that value and set to payload with stringify name' do
193
+ expect(build_attributes).to eq({ 'name' => 'John', 'prefs/permissionLevel' => 'org' })
194
+ end
195
+ end
196
+ end
197
+
198
+ context 'when attribute is not for action update' do
199
+ let(:options) { { remote_key: :permissionLevel, create_only: true } }
200
+ let(:attributes) { { visibility_level: 'org' } }
201
+
202
+ it "won't put it in payload" do
203
+ expect(build_attributes).to eq({ 'name' => 'John' })
204
+ end
205
+ end
206
+ end
207
+
208
+ end