ruby-trello 2.0.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 (305) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +61 -10
  3. data/lib/trello.rb +57 -36
  4. data/lib/trello/action.rb +31 -23
  5. data/lib/trello/association_builder/has_many.rb +17 -0
  6. data/lib/trello/association_builder/has_one.rb +16 -0
  7. data/lib/trello/association_fetcher/has_many.rb +26 -0
  8. data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
  9. data/lib/trello/association_fetcher/has_many/params.rb +56 -0
  10. data/lib/trello/association_fetcher/has_one.rb +25 -0
  11. data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
  12. data/lib/trello/association_fetcher/has_one/params.rb +36 -0
  13. data/lib/trello/association_infer_tool.rb +13 -0
  14. data/lib/trello/association_proxy.rb +1 -1
  15. data/lib/trello/attachment.rb +40 -27
  16. data/lib/trello/basic_data.rb +112 -50
  17. data/lib/trello/board.rb +91 -101
  18. data/lib/trello/card.rb +53 -200
  19. data/lib/trello/checklist.rb +17 -71
  20. data/lib/trello/comment.rb +32 -22
  21. data/lib/trello/cover_image.rb +20 -0
  22. data/lib/trello/custom_field.rb +78 -0
  23. data/lib/trello/custom_field_item.rb +76 -0
  24. data/lib/trello/custom_field_option.rb +49 -0
  25. data/lib/trello/item.rb +27 -16
  26. data/lib/trello/item_state.rb +7 -15
  27. data/lib/trello/json_utils.rb +1 -1
  28. data/lib/trello/label.rb +15 -84
  29. data/lib/trello/label_name.rb +22 -25
  30. data/lib/trello/list.rb +31 -44
  31. data/lib/trello/member.rb +77 -31
  32. data/lib/trello/notification.rb +27 -20
  33. data/lib/trello/organization.rb +53 -25
  34. data/lib/trello/plugin_datum.rb +11 -16
  35. data/lib/trello/schema.rb +31 -0
  36. data/lib/trello/schema/attribute/base.rb +79 -0
  37. data/lib/trello/schema/attribute/board_pref.rb +45 -0
  38. data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
  39. data/lib/trello/schema/attribute/default.rb +45 -0
  40. data/lib/trello/schema/attribute_builder.rb +42 -0
  41. data/lib/trello/schema/attribute_registration.rb +47 -0
  42. data/lib/trello/schema/serializer/default.rb +17 -0
  43. data/lib/trello/schema/serializer/labels.rb +23 -0
  44. data/lib/trello/schema/serializer/time.rb +25 -0
  45. data/lib/trello/schema/serializer/webhooks.rb +25 -0
  46. data/lib/trello/token.rb +15 -12
  47. data/lib/trello/webhook.rb +18 -71
  48. data/spec/action_spec.rb +2 -3
  49. data/spec/basic_data_spec.rb +58 -0
  50. data/spec/board_spec.rb +53 -100
  51. data/spec/card_spec.rb +177 -66
  52. data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
  53. data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
  54. data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
  55. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  56. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  57. data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
  58. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  59. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  60. data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
  61. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  62. data/spec/cassettes/can_get_actions.yml +196 -0
  63. data/spec/cassettes/can_get_actions_of_board.yml +188 -0
  64. data/spec/cassettes/can_get_actions_of_list.yml +202 -0
  65. data/spec/cassettes/can_get_actions_of_members.yml +199 -0
  66. data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
  67. data/spec/cassettes/can_get_attachments.yml +187 -0
  68. data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
  69. data/spec/cassettes/can_get_boards_of_label.yml +197 -0
  70. data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
  71. data/spec/cassettes/can_get_cards_of_board.yml +193 -0
  72. data/spec/cassettes/can_get_cards_of_list.yml +201 -0
  73. data/spec/cassettes/can_get_cards_of_member.yml +204 -0
  74. data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
  75. data/spec/cassettes/can_get_comments.yml +193 -0
  76. data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
  77. data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
  78. data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
  79. data/spec/cassettes/can_get_labels_of_board.yml +187 -0
  80. data/spec/cassettes/can_get_lists_of_board.yml +187 -0
  81. data/spec/cassettes/can_get_members_of_board.yml +188 -0
  82. data/spec/cassettes/can_get_members_of_organization.yml +200 -0
  83. data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
  84. data/spec/cassettes/can_get_organization_of_board.yml +189 -0
  85. data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
  86. data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
  87. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  88. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  89. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  90. data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
  91. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  92. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  93. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  94. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  95. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  96. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  97. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  98. data/spec/cassettes/can_success_create_a_board.yml +98 -0
  99. data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
  100. data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
  101. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  102. data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
  103. data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
  104. data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
  105. data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
  106. data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
  107. data/spec/cassettes/can_success_create_a_label.yml +102 -0
  108. data/spec/cassettes/can_success_create_a_list.yml +102 -0
  109. data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
  110. data/spec/cassettes/can_success_create_a_organization.yml +104 -0
  111. data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
  112. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  113. data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
  114. data/spec/cassettes/can_success_delete_card.yml +185 -0
  115. data/spec/cassettes/can_success_delete_checklist.yml +284 -0
  116. data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
  117. data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
  118. data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
  119. data/spec/cassettes/can_success_upate_a_board.yml +191 -0
  120. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  121. data/spec/cassettes/can_success_upate_a_list.yml +296 -0
  122. data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
  123. data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
  124. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  125. data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
  126. data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
  127. data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
  128. data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
  129. data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
  130. data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
  131. data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
  132. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  133. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  134. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  135. data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
  136. data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
  137. data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
  138. data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
  139. data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
  140. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  141. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  142. data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
  143. data/spec/cassettes/get_board_of_card.yml +187 -0
  144. data/spec/cassettes/get_board_of_list.yml +197 -0
  145. data/spec/cassettes/get_boards_of_member.yml +207 -0
  146. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  147. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  148. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  149. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  150. data/spec/cassettes/get_list_of_card.yml +188 -0
  151. data/spec/cassettes/get_lists.yml +187 -0
  152. data/spec/cassettes/get_members_of_card.yml +189 -0
  153. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  154. data/spec/cassettes/get_voters_of_card.yml +188 -0
  155. data/spec/cassettes/label_delete.yml +285 -0
  156. data/spec/cassettes/label_find_with_id.yml +100 -0
  157. data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
  158. data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
  159. data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
  160. data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
  161. data/spec/cassettes/notification_find_with_id.yml +103 -0
  162. data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
  163. data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
  164. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  165. data/spec/cassettes/revote_on_a_card.yml +464 -0
  166. data/spec/cassettes/token_find_with_token_string.yml +100 -0
  167. data/spec/cassettes/webhook_delete.yml +286 -0
  168. data/spec/cassettes/webhook_find_with_id.yml +100 -0
  169. data/spec/checklist_spec.rb +27 -43
  170. data/spec/custom_field_item_spec.rb +192 -0
  171. data/spec/custom_field_option_spec.rb +49 -0
  172. data/spec/custom_field_spec.rb +273 -0
  173. data/spec/integration/action/find_spec.rb +23 -0
  174. data/spec/integration/basic_data/many_spec.rb +127 -0
  175. data/spec/integration/basic_data/one_spec.rb +84 -0
  176. data/spec/integration/basic_data/schema_spec.rb +156 -0
  177. data/spec/integration/board/add_member_spec.rb +21 -0
  178. data/spec/integration/board/all_spec.rb +20 -0
  179. data/spec/integration/board/associations/actions_spec.rb +18 -0
  180. data/spec/integration/board/associations/cards_spec.rb +18 -0
  181. data/spec/integration/board/associations/checklists_spec.rb +18 -0
  182. data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
  183. data/spec/integration/board/associations/label_names_spec.rb +17 -0
  184. data/spec/integration/board/associations/labels_spec.rb +18 -0
  185. data/spec/integration/board/associations/lists_spec.rb +18 -0
  186. data/spec/integration/board/associations/members_spec.rb +18 -0
  187. data/spec/integration/board/associations/organization_spec.rb +19 -0
  188. data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
  189. data/spec/integration/board/create_spec.rb +95 -0
  190. data/spec/integration/board/find_card_spec.rb +18 -0
  191. data/spec/integration/board/find_spec.rb +42 -0
  192. data/spec/integration/board/remove_member_spec.rb +21 -0
  193. data/spec/integration/board/save_spec.rb +37 -0
  194. data/spec/integration/board/update!_spec.rb +62 -0
  195. data/spec/integration/board_lists_spec.rb +21 -0
  196. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  197. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  198. data/spec/integration/card/add_checklist_spec.rb +32 -0
  199. data/spec/integration/card/add_comment_spec.rb +19 -0
  200. data/spec/integration/card/add_memeber_spec.rb +19 -0
  201. data/spec/integration/card/associations/actions_spec.rb +17 -0
  202. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  203. data/spec/integration/card/associations/board_spec.rb +17 -0
  204. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  205. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  206. data/spec/integration/card/associations/comments_spec.rb +19 -0
  207. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  208. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  209. data/spec/integration/card/associations/list_spec.rb +16 -0
  210. data/spec/integration/card/associations/members_spec.rb +18 -0
  211. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  212. data/spec/integration/card/associations/voters_spec.rb +17 -0
  213. data/spec/integration/card/close!_spec.rb +16 -0
  214. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  215. data/spec/integration/card/create_spec.rb +84 -0
  216. data/spec/integration/card/delete_spec.rb +16 -0
  217. data/spec/integration/card/find_spec.rb +67 -0
  218. data/spec/integration/card/move_to_board_spec.rb +36 -0
  219. data/spec/integration/card/move_to_list_spec.rb +20 -0
  220. data/spec/integration/card/remove_member_spec.rb +19 -0
  221. data/spec/integration/card/save_spec.rb +61 -0
  222. data/spec/integration/card/update!_spec.rb +53 -0
  223. data/spec/integration/card/vote_spec.rb +50 -0
  224. data/spec/integration/checklist/add_item_spec.rb +20 -0
  225. data/spec/integration/checklist/create_spec.rb +23 -0
  226. data/spec/integration/checklist/delete_spec.rb +17 -0
  227. data/spec/integration/checklist/find_spec.rb +22 -0
  228. data/spec/integration/checklist/update!_spec.rb +21 -0
  229. data/spec/integration/checklist/update_item_state_spec.rb +20 -0
  230. data/spec/integration/custom_field/association/board_spec.rb +18 -0
  231. data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
  232. data/spec/integration/custom_field/create_spec.rb +29 -0
  233. data/spec/integration/custom_field/find_spec.rb +41 -0
  234. data/spec/integration/custom_field/update!_spec.rb +25 -0
  235. data/spec/integration/custom_field_item_spec.rb +47 -0
  236. data/spec/integration/custom_field_option/create_spec.rb +23 -0
  237. data/spec/integration/custom_field_option/delete_spec.rb +19 -0
  238. data/spec/integration/custom_field_option/find_spec.rb +21 -0
  239. data/spec/integration/label/association/board_spec.rb +18 -0
  240. data/spec/integration/label/create_spec.rb +23 -0
  241. data/spec/integration/label/delete_spec.rb +21 -0
  242. data/spec/integration/label/find_spec.rb +20 -0
  243. data/spec/integration/label/update!_spec.rb +25 -0
  244. data/spec/integration/list/archive_all_cards_spec.rb +20 -0
  245. data/spec/integration/list/associations/actions_spec.rb +18 -0
  246. data/spec/integration/list/associations/board_spec.rb +18 -0
  247. data/spec/integration/list/associations/cards_spec.rb +18 -0
  248. data/spec/integration/list/create_spec.rb +44 -0
  249. data/spec/integration/list/find_spec.rb +37 -0
  250. data/spec/integration/list/move_all_cards_spec.rb +31 -0
  251. data/spec/integration/list/save_spec.rb +40 -0
  252. data/spec/integration/list/update!_spec.rb +43 -0
  253. data/spec/integration/member/associations/actions_spec.rb +17 -0
  254. data/spec/integration/member/associations/boards_spec.rb +18 -0
  255. data/spec/integration/member/associations/cards_spec.rb +18 -0
  256. data/spec/integration/member/associations/notifications_spec.rb +18 -0
  257. data/spec/integration/member/associations/organizations_spec.rb +18 -0
  258. data/spec/integration/member/find_spec.rb +39 -0
  259. data/spec/integration/member/update!_spec.rb +18 -0
  260. data/spec/integration/notification/find_spec.rb +27 -0
  261. data/spec/integration/organization/associations/actions_spec.rb +18 -0
  262. data/spec/integration/organization/associations/boards_spec.rb +18 -0
  263. data/spec/integration/organization/associations/members_spec.rb +18 -0
  264. data/spec/integration/organization/create_spec.rb +23 -0
  265. data/spec/integration/organization/find_spec.rb +37 -0
  266. data/spec/integration/organization/update!_spec.rb +28 -0
  267. data/spec/integration/token/find_spec.rb +24 -0
  268. data/spec/integration/webhook/create_spec.rb +27 -0
  269. data/spec/integration/webhook/delete_spec.rb +21 -0
  270. data/spec/integration/webhook/find_spec.rb +22 -0
  271. data/spec/integration/webhook/update!_spec.rb +24 -0
  272. data/spec/item_spec.rb +2 -2
  273. data/spec/label_spec.rb +105 -28
  274. data/spec/list_spec.rb +32 -14
  275. data/spec/notification_spec.rb +3 -3
  276. data/spec/organization_spec.rb +6 -5
  277. data/spec/spec_helper.rb +118 -37
  278. data/spec/token_spec.rb +10 -11
  279. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  280. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  281. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  282. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  283. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  284. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  285. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  286. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  287. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  288. data/spec/unit/trello/basic_data_spec.rb +113 -0
  289. data/spec/unit/trello/board/new_spec.rb +370 -0
  290. data/spec/unit/trello/board/save_spec.rb +49 -0
  291. data/spec/unit/trello/board/update_fields_spec.rb +129 -0
  292. data/spec/unit/trello/board/update_spec.rb +197 -0
  293. data/spec/unit/trello/card_spec.rb +103 -0
  294. data/spec/unit/trello/member/new_spec.rb +62 -0
  295. data/spec/unit/trello/member/update_fields_spec.rb +80 -0
  296. data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
  297. data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
  298. data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
  299. data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
  300. data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
  301. data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
  302. data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
  303. data/spec/unit/trello/schema_spec.rb +25 -0
  304. data/spec/webhook_spec.rb +23 -7
  305. metadata +542 -29
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationFetcher::HasMany::Params do
4
+
5
+ let(:params) { Trello::AssociationFetcher::HasMany::Params.new(
6
+ association_owner: association_owner,
7
+ association_name: association_name,
8
+ association_options: association_options,
9
+ filter: filter
10
+ ) }
11
+
12
+ let(:association_owner) { double('owner', id: 1) }
13
+ let(:association_name) { 'cards' }
14
+ let(:association_options) { { filter: :all } }
15
+ let(:filter) { { a: 1 } }
16
+
17
+ describe '.association_class' do
18
+ context 'when explicit set :via in association_options' do
19
+ let(:association_options) { { via: Trello::Board } }
20
+
21
+ it 'return the value under the :via key' do
22
+ expect(params.association_class).to eq(Trello::Board)
23
+ end
24
+ end
25
+
26
+ context 'when does not set :via in association_options' do
27
+ before do
28
+ allow(Trello::AssociationInferTool)
29
+ .to receive(:infer_class_on_name)
30
+ .with(association_name)
31
+ .and_return(Trello::Card)
32
+ end
33
+
34
+ it 'return association_class use AssociationInferTool' do
35
+ expect(params.association_class).to eq(Trello::Card)
36
+ end
37
+ end
38
+ end
39
+
40
+ describe '.association_owner' do
41
+ it 'return association_owner directly' do
42
+ expect(params.association_owner).to eq(association_owner)
43
+ end
44
+ end
45
+
46
+ describe '.fetch_path' do
47
+ context 'when explicit set :in, :path in association_options' do
48
+ let(:association_options) { { in: 'boards', path: 'cards' } }
49
+
50
+ it 'use them to generate fetch_path - formula: ":in/owner_id/:path"' do
51
+ expect(params.fetch_path).to eq('/boards/1/cards')
52
+ end
53
+ end
54
+
55
+ context 'when does not set :in, :path in association_options' do
56
+ let(:association_owner) { double('owner', id: 1, class: Trello::Member) }
57
+ before do
58
+ allow(Trello::AssociationInferTool)
59
+ .to receive(:infer_restful_resource_on_class)
60
+ .with(Trello::Member)
61
+ .and_return('members')
62
+ end
63
+
64
+ it 'will generate fetch_path use AssociationInferTool' do
65
+ expect(params.fetch_path).to eq('/members/1/cards')
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '.filter_params' do
71
+ context 'when filter and default_filer are both nil' do
72
+ let(:association_options) { nil }
73
+ let(:filter) { nil }
74
+
75
+ it 'return a empty hash' do
76
+ expect(params.filter_params).to eq({})
77
+ end
78
+ end
79
+
80
+ context 'when filter is nil' do
81
+ let(:association_options) { { filter: :all } }
82
+ let(:filter) { nil }
83
+
84
+ it 'return default filter' do
85
+ expect(params.filter_params).to eq({ filter: :all })
86
+ end
87
+ end
88
+
89
+ context 'when default filter is nil' do
90
+ let(:association_options) { nil }
91
+ let(:filter) { { a: 1 } }
92
+
93
+ it 'return filter' do
94
+ expect(params.filter_params).to eq({ a: 1 })
95
+ end
96
+ end
97
+
98
+ context 'when both filter and default_filter exists' do
99
+ let(:association_options) { { filter: :all } }
100
+ let(:filter) { { a: 1, filter: :open } }
101
+
102
+ it 'return the result from merge filter on default_filter' do
103
+ expect(params.filter_params).to eq({a: 1, filter: :open})
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationFetcher::HasMany do
4
+
5
+ describe '#new' do
6
+ let(:board) { instance_double(Trello::Board) }
7
+ let(:has_many) {
8
+ Trello::AssociationFetcher::HasMany.new(board, 'cards', {filter: :all})
9
+ }
10
+
11
+ it 'has model_class attribute' do
12
+ expect(has_many.model).to eq(board)
13
+ end
14
+
15
+ it 'has name attribute' do
16
+ expect(has_many.name).to eq('cards')
17
+ end
18
+
19
+ it 'has options attribute' do
20
+ expect(has_many.options).to eq({filter: :all})
21
+ end
22
+ end
23
+
24
+ describe '.fetch' do
25
+ let(:board) { instance_double(Trello::Board) }
26
+ let(:params) { instance_double(Trello::AssociationFetcher::HasMany::Params) }
27
+ let(:fetch_result) { double('fetch result') }
28
+ let(:has_many_fetcher) {
29
+ Trello::AssociationFetcher::HasMany.new(board, 'cards', {filter: :all})
30
+ }
31
+
32
+ it 'return the result from HasMany::Fetch and HasMany::Params' do
33
+ expect(Trello::AssociationFetcher::HasMany::Params)
34
+ .to receive(:new)
35
+ .with(
36
+ association_owner: board,
37
+ association_name: 'cards',
38
+ association_options: { filter: :all },
39
+ filter: { a: 1 }
40
+ ).and_return(params)
41
+ expect(Trello::AssociationFetcher::HasMany::Fetch)
42
+ .to receive(:execute)
43
+ .with(params)
44
+ .and_return(fetch_result)
45
+
46
+ expect(has_many_fetcher.fetch(a: 1)).to eq(fetch_result)
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationFetcher::HasOne::Fetch do
4
+
5
+ describe '.execute' do
6
+ let(:client) { instance_double(Trello::Client) }
7
+ let(:association_owner) { double('association_owner', client: client) }
8
+ let(:association_restful_id) { 1 }
9
+ let(:association_class) { double('association_class') }
10
+ let(:result) { double('result') }
11
+
12
+ let(:params) { instance_double('params',
13
+ association_owner: association_owner,
14
+ association_restful_name: association_restful_name,
15
+ association_restful_id: association_restful_id,
16
+ association_class: association_class
17
+ )}
18
+
19
+ context 'when association_restful_name exists' do
20
+ let(:association_restful_name) { 'organizations' }
21
+
22
+ before do
23
+ allow(Trello).to receive(:client).and_return(client)
24
+ allow(client)
25
+ .to receive(:find)
26
+ .with(association_restful_name, association_restful_id)
27
+ .and_return(result)
28
+ end
29
+
30
+ it 'return the result from Trello.client' do
31
+ expect(Trello::AssociationFetcher::HasOne::Fetch.execute(params)).to eq(result)
32
+ end
33
+ end
34
+
35
+ context 'when association_restful_name does not exist' do
36
+ let(:association_restful_name) { nil }
37
+
38
+ before do
39
+ allow(association_class)
40
+ .to receive(:find)
41
+ .with(association_restful_id)
42
+ .and_return(result)
43
+ end
44
+
45
+ it 'return the result from association_class' do
46
+ expect(Trello::AssociationFetcher::HasOne::Fetch.execute(params)).to eq(result)
47
+ end
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationFetcher::HasOne::Params do
4
+
5
+ let(:params) { Trello::AssociationFetcher::HasOne::Params.new(
6
+ association_owner: association_owner,
7
+ association_name: association_name,
8
+ association_options: association_options,
9
+ )}
10
+
11
+ let(:association_owner) { double('owner', id: 1, organization_id: 9) }
12
+ let(:association_name) { 'organization' }
13
+ let(:association_options) { { using: :organization_id } }
14
+
15
+ describe 'association_class' do
16
+ context 'when explicit set :via in association_options' do
17
+ let(:association_options) { { via: Trello::Organization } }
18
+
19
+ it 'return the value under the :via key' do
20
+ expect(params.association_class).to eq(Trello::Organization)
21
+ end
22
+ end
23
+
24
+ context 'when does not set :via in association_options' do
25
+ before do
26
+ allow(Trello::AssociationInferTool)
27
+ .to receive(:infer_class_on_name)
28
+ .with(association_name)
29
+ .and_return(Trello::Organization)
30
+ end
31
+
32
+ it 'return association_class use AssociationInferTool' do
33
+ expect(params.association_class).to eq(Trello::Organization)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe 'association_owner' do
39
+ it 'return association_owner directly' do
40
+ expect(params.association_owner).to eq(association_owner)
41
+ end
42
+ end
43
+
44
+ describe 'association_restful_name' do
45
+ context 'when explicit set :path in association_options' do
46
+ let(:association_options) { { path: :organizations } }
47
+
48
+ it 'return :path directly' do
49
+ expect(params.association_restful_name).to eq(:organizations)
50
+ end
51
+ end
52
+
53
+ context 'when does not set :path in association_options' do
54
+ let(:association_options) { {} }
55
+
56
+ it 'return nil' do
57
+ expect(params.association_restful_name).to eq(nil)
58
+ end
59
+ end
60
+ end
61
+
62
+ describe 'association_restful_id' do
63
+ context 'when explicit set :using in association_options' do
64
+ let(:association_options) { { using: :organization_id } }
65
+
66
+ it 'return the result from association_owner.<using> directly' do
67
+ expect(params.association_restful_id).to eq(9)
68
+ end
69
+ end
70
+
71
+ context 'when does not set :using in association_options' do
72
+ let(:association_options) { {} }
73
+
74
+ it 'return the result from association_owner.id directly' do
75
+ expect(params.association_restful_id).to eq(1)
76
+ end
77
+ end
78
+ end
79
+
80
+
81
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationFetcher::HasOne do
4
+
5
+ describe '#new' do
6
+ let(:board) { instance_double(Trello::Board) }
7
+ let(:has_one) {
8
+ Trello::AssociationFetcher::HasOne.new(board, 'organization', { using: :test_id })
9
+ }
10
+
11
+ it 'has model attribute' do
12
+ expect(has_one.model).to eq(board)
13
+ end
14
+
15
+ it 'has name attribute' do
16
+ expect(has_one.name).to eq('organization')
17
+ end
18
+
19
+ it 'has options attribute' do
20
+ expect(has_one.options).to eq({ using: :test_id })
21
+ end
22
+ end
23
+
24
+ describe '.fetch' do
25
+ let(:board) { instance_double(Trello::Board) }
26
+ let(:params) { instance_double(Trello::AssociationFetcher::HasOne::Params) }
27
+ let(:fetch_result) { double('fetch result') }
28
+ let(:has_one_fetcher) {
29
+ Trello::AssociationFetcher::HasOne.new(board, 'organization', { using: :test_id })
30
+ }
31
+
32
+ it 'return result from HasOne::Fetch and HasOne::Params' do
33
+ expect(Trello::AssociationFetcher::HasOne::Params)
34
+ .to receive(:new)
35
+ .with(
36
+ association_owner: board,
37
+ association_name: 'organization',
38
+ association_options: { using: :test_id }
39
+ ).and_return(params)
40
+ expect(Trello::AssociationFetcher::HasOne::Fetch)
41
+ .to receive(:execute)
42
+ .with(params)
43
+ .and_return(fetch_result)
44
+
45
+ expect(has_one_fetcher.fetch).to eq(fetch_result)
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::AssociationInferTool do
4
+
5
+ describe '.infer_restful_resource_on_class' do
6
+ let(:infer) { lambda { |klass|
7
+ Trello::AssociationInferTool.infer_restful_resource_on_class(klass)
8
+ } }
9
+
10
+ it 'can infer boards on Trello::Board' do
11
+ expect(infer.call(Trello::Board)).to eq('boards')
12
+ end
13
+
14
+ it 'can infer cards on Trello::Card' do
15
+ expect(infer.call(Trello::Card)).to eq('cards')
16
+ end
17
+
18
+ it 'can infer members on Trello::Member' do
19
+ expect(infer.call(Trello::Member)).to eq('members')
20
+ end
21
+ end
22
+
23
+ describe '.infer_class_on_name' do
24
+ let(:infer) { lambda { |association_name|
25
+ Trello::AssociationInferTool.infer_class_on_name(association_name)
26
+ } }
27
+
28
+ it 'can infer Trello::Board on boards' do
29
+ expect(infer.call('boards')).to eq(Trello::Board)
30
+ end
31
+
32
+ it 'can infer Trello::Card on cards' do
33
+ expect(infer.call('cards')).to eq(Trello::Card)
34
+ end
35
+
36
+ it 'can infer Trello::Member on members' do
37
+ expect(infer.call('members')).to eq(Trello::Member)
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Trello::BasicData do
4
+
5
+ describe '.schema' do
6
+ around do |example|
7
+ module Trello
8
+ class FakeCard < BasicData
9
+ end
10
+ end
11
+
12
+ example.run
13
+
14
+ Trello.send(:remove_const, 'FakeCard')
15
+ end
16
+
17
+ before { allow(Trello::FakeCard).to receive(:register_attrs) }
18
+
19
+ it 'call instance_eval on a schema instance' do
20
+ expect_any_instance_of(Trello::Schema).to receive(:instance_eval)
21
+
22
+ Trello::FakeCard.class_eval do
23
+ schema do
24
+ 'PlaceHolder'
25
+ end
26
+ end
27
+ end
28
+
29
+ it 'call register_attrs on model' do
30
+ allow_any_instance_of(Trello::Schema).to receive(:instance_eval)
31
+ expect(Trello::FakeCard).to receive(:register_attrs)
32
+
33
+ Trello::FakeCard.class_eval do
34
+ schema do
35
+ 'PlaceHolder'
36
+ end
37
+ end
38
+ end
39
+
40
+ it 'return the @schema if it exist' do
41
+ Trello::FakeCard.class_eval do
42
+ schema do
43
+ 'PlaceHolder'
44
+ end
45
+ end
46
+
47
+ expect(Trello::Schema).not_to receive(:new)
48
+ expect(Trello::FakeCard.schema).to be_a(Trello::Schema)
49
+ end
50
+ end
51
+
52
+ describe '.register_attrs' do
53
+ around do |example|
54
+ module Trello
55
+ class FakeCard < BasicData
56
+ end
57
+ end
58
+
59
+ example.run
60
+
61
+ Trello.send(:remove_const, 'FakeCard')
62
+ end
63
+
64
+ let(:attribute_1) { double('attribute 1') }
65
+ let(:attribute_2) { double('attribute 2') }
66
+ let(:attribute_3) { double('attribute 3') }
67
+
68
+ let(:schema) { double('Trello::Schema',
69
+ attrs: {
70
+ name: attribute_1,
71
+ desc: attribute_2,
72
+ url: attribute_3
73
+ }
74
+ ) }
75
+
76
+ before { allow(Trello::FakeCard).to receive(:schema).and_return(schema) }
77
+
78
+ it 'will call register on each attributes' do
79
+ expect(attribute_1).to receive(:register).with(Trello::FakeCard)
80
+ expect(attribute_2).to receive(:register).with(Trello::FakeCard)
81
+ expect(attribute_3).to receive(:register).with(Trello::FakeCard)
82
+
83
+ Trello::FakeCard.register_attrs
84
+ end
85
+ end
86
+
87
+ describe '.many' do
88
+ let(:association_name) { 'cards' }
89
+ let(:association_options) { { test: 'test' } }
90
+
91
+ it 'call build on AssociationBuilder::HasMany' do
92
+ expect(Trello::AssociationBuilder::HasMany)
93
+ .to receive(:build)
94
+ .with(Trello::BasicData, association_name, association_options)
95
+
96
+ Trello::BasicData.many(association_name, association_options)
97
+ end
98
+ end
99
+
100
+ describe '.one' do
101
+ let(:association_name) { 'card' }
102
+ let(:association_options) { { path: 'test' } }
103
+
104
+ it 'call build on AssociationBuilder::HasOne' do
105
+ expect(Trello::AssociationBuilder::HasOne)
106
+ .to receive(:build)
107
+ .with(Trello::BasicData, association_name, association_options)
108
+
109
+ Trello::BasicData.one(association_name, association_options)
110
+ end
111
+ end
112
+
113
+ end