ruby-trello 2.0.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +106 -17
  3. data/lib/trello.rb +47 -34
  4. data/lib/trello/action.rb +10 -8
  5. data/lib/trello/association_builder/has_many.rb +17 -0
  6. data/lib/trello/association_builder/has_one.rb +16 -0
  7. data/lib/trello/association_fetcher/has_many.rb +26 -0
  8. data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
  9. data/lib/trello/association_fetcher/has_many/params.rb +56 -0
  10. data/lib/trello/association_fetcher/has_one.rb +25 -0
  11. data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
  12. data/lib/trello/association_fetcher/has_one/params.rb +36 -0
  13. data/lib/trello/association_infer_tool.rb +13 -0
  14. data/lib/trello/association_proxy.rb +1 -1
  15. data/lib/trello/attachment.rb +13 -10
  16. data/lib/trello/basic_data.rb +16 -49
  17. data/lib/trello/board.rb +17 -3
  18. data/lib/trello/card.rb +103 -38
  19. data/lib/trello/checklist.rb +14 -13
  20. data/lib/trello/client.rb +1 -1
  21. data/lib/trello/comment.rb +4 -4
  22. data/lib/trello/custom_field.rb +131 -0
  23. data/lib/trello/custom_field_item.rb +98 -0
  24. data/lib/trello/custom_field_option.rb +22 -0
  25. data/lib/trello/error.rb +12 -0
  26. data/lib/trello/item.rb +7 -7
  27. data/lib/trello/item_state.rb +3 -3
  28. data/lib/trello/label.rb +30 -12
  29. data/lib/trello/label_name.rb +10 -10
  30. data/lib/trello/list.rb +6 -6
  31. data/lib/trello/member.rb +10 -9
  32. data/lib/trello/notification.rb +6 -6
  33. data/lib/trello/organization.rb +11 -11
  34. data/lib/trello/plugin_datum.rb +6 -6
  35. data/lib/trello/register_attributes.rb +54 -0
  36. data/lib/trello/token.rb +6 -5
  37. data/lib/trello/webhook.rb +5 -5
  38. data/spec/action_spec.rb +22 -1
  39. data/spec/basic_data_spec.rb +58 -0
  40. data/spec/board_spec.rb +28 -2
  41. data/spec/card_spec.rb +183 -8
  42. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  43. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  44. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  45. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  46. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  47. data/spec/cassettes/can_get_actions.yml +196 -0
  48. data/spec/cassettes/can_get_attachments.yml +187 -0
  49. data/spec/cassettes/can_get_comments.yml +193 -0
  50. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  51. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  52. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  53. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  54. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  55. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  56. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  57. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  58. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  59. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  60. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  61. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  62. data/spec/cassettes/can_success_delete_card.yml +185 -0
  63. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  64. data/spec/cassettes/can_success_update_bong_a_board.yml +283 -0
  65. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  66. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  67. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  68. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  69. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  70. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  71. data/spec/cassettes/get_board_of_card.yml +187 -0
  72. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  73. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  74. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  75. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  76. data/spec/cassettes/get_list_of_card.yml +188 -0
  77. data/spec/cassettes/get_lists.yml +187 -0
  78. data/spec/cassettes/get_members_of_card.yml +189 -0
  79. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  80. data/spec/cassettes/get_voters_of_card.yml +188 -0
  81. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  82. data/spec/cassettes/revote_on_a_card.yml +464 -0
  83. data/spec/checklist_spec.rb +39 -3
  84. data/spec/client_spec.rb +5 -1
  85. data/spec/custom_field_item_spec.rb +192 -0
  86. data/spec/custom_field_option_spec.rb +49 -0
  87. data/spec/custom_field_spec.rb +261 -0
  88. data/spec/integration/basic_data/many_spec.rb +123 -0
  89. data/spec/integration/basic_data/one_spec.rb +84 -0
  90. data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
  91. data/spec/integration/board/update!_spec.rb +31 -0
  92. data/spec/integration/board_lists_spec.rb +21 -0
  93. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  94. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  95. data/spec/integration/card/add_checklist_spec.rb +32 -0
  96. data/spec/integration/card/add_comment_spec.rb +19 -0
  97. data/spec/integration/card/add_memeber_spec.rb +19 -0
  98. data/spec/integration/card/associations/actions_spec.rb +17 -0
  99. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  100. data/spec/integration/card/associations/board_spec.rb +17 -0
  101. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  102. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  103. data/spec/integration/card/associations/comments_spec.rb +19 -0
  104. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  105. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  106. data/spec/integration/card/associations/list_spec.rb +16 -0
  107. data/spec/integration/card/associations/members_spec.rb +18 -0
  108. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  109. data/spec/integration/card/associations/voters_spec.rb +17 -0
  110. data/spec/integration/card/close!_spec.rb +16 -0
  111. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  112. data/spec/integration/card/create_spec.rb +50 -0
  113. data/spec/integration/card/delete_spec.rb +16 -0
  114. data/spec/integration/card/find_spec.rb +67 -0
  115. data/spec/integration/card/move_to_board_spec.rb +36 -0
  116. data/spec/integration/card/move_to_list_spec.rb +20 -0
  117. data/spec/integration/card/remove_member_spec.rb +19 -0
  118. data/spec/integration/card/save_spec.rb +61 -0
  119. data/spec/integration/card/update!_spec.rb +53 -0
  120. data/spec/integration/card/vote_spec.rb +50 -0
  121. data/spec/integration/custom_field_item_spec.rb +47 -0
  122. data/spec/item_spec.rb +20 -0
  123. data/spec/label_spec.rb +99 -0
  124. data/spec/list_spec.rb +21 -0
  125. data/spec/member_spec.rb +23 -0
  126. data/spec/notification_spec.rb +21 -0
  127. data/spec/organization_spec.rb +26 -0
  128. data/spec/spec_helper.rb +96 -23
  129. data/spec/token_spec.rb +19 -0
  130. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  131. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  132. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  133. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  134. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  135. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  136. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  137. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  138. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  139. data/spec/unit/trello/basic_data_spec.rb +54 -0
  140. data/spec/unit/trello/card_spec.rb +103 -0
  141. data/spec/webhook_spec.rb +20 -0
  142. metadata +224 -30
@@ -132,5 +132,28 @@ module Trello
132
132
  expect { member.id = '42' }.to raise_error NoMethodError
133
133
  end
134
134
  end
135
+
136
+ describe "#update_fields" do
137
+ it "does not set any fields when the fields argument is empty" do
138
+ expected = {
139
+ 'id' => 'id',
140
+ 'fullName' => 'full_name',
141
+ 'email' => 'email',
142
+ 'username' => 'username',
143
+ 'initials' => 'initials',
144
+ 'avatarHash' => 'avatar_id',
145
+ 'bio' => 'bio',
146
+ 'url' => 'url'
147
+ }
148
+
149
+ member = Member.new(expected)
150
+
151
+ member.update_fields({})
152
+
153
+ expected.each do |key, value|
154
+ expect(member.send(value)).to eq expected[key]
155
+ end
156
+ end
157
+ end
135
158
  end
136
159
  end
@@ -118,5 +118,26 @@ module Trello
118
118
  expect(notification.member_creator_id).to eq notification_details['idMemberCreator']
119
119
  end
120
120
  end
121
+
122
+ describe "#update_fields" do
123
+ it "does not set any fields when the fields argument is empty" do
124
+ expected = {
125
+ 'id' => 'id',
126
+ 'unread' => 'unread',
127
+ 'type' => 'type',
128
+ 'date' => 'date',
129
+ 'data' => 'data',
130
+ 'idMemberCreator' => 'member_creator_id'
131
+ }
132
+
133
+ notification = Notification.new(expected)
134
+
135
+ notification.update_fields({})
136
+
137
+ expected.each do |key, value|
138
+ expect(notification.send(value)).to eq expected[key]
139
+ end
140
+ end
141
+ end
121
142
  end
122
143
  end
@@ -40,6 +40,32 @@ module Trello
40
40
  expect(organization.actions.count).to be > 0
41
41
  end
42
42
  end
43
+
44
+ describe "#update_fields" do
45
+ it "does not set any fields when the fields argument is empty" do
46
+ expected = {
47
+ 'id' => 'id',
48
+ 'name' => 'name',
49
+ 'displayName' => 'display_name',
50
+ 'desc' => 'description',
51
+ 'url' => 'url',
52
+ 'invited' => 'invited',
53
+ 'website' => 'website',
54
+ 'logoHash' => 'logo_hash',
55
+ 'billableMemberCount' => 'billable_member_count',
56
+ 'activeBillableMemberCount' => 'active_billable_member_count',
57
+ 'memberships' => 'memberships'
58
+ }
59
+
60
+ organization = Organization.new(expected)
61
+
62
+ organization.update_fields({})
63
+
64
+ expected.each do |key, value|
65
+ expect(organization.send(value)).to eq expected[key]
66
+ end
67
+ end
68
+ end
43
69
  end
44
70
  end
45
71
 
@@ -1,36 +1,46 @@
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.cassette_library_dir = 'spec/cassettes'
12
+ config.hook_into :webmock
12
13
 
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
14
+ config.filter_sensitive_data('DEVELOPER_PUBLIC_KEY') do |interaction|
15
+ CGI.parse(URI.parse(interaction.request.uri).query)['key'].first
16
+ end
17
+ config.filter_sensitive_data('MEMBER_TOKEN') do |interaction|
18
+ CGI.parse(URI.parse(interaction.request.uri).query)['token'].first
19
+ end
20
+ config.filter_sensitive_data('set_cookie_dsc') do |interaction|
21
+ set_cookie_headers = interaction.response.headers['Set-Cookie']
23
22
 
24
- Bundler.require(:spec)
23
+ if set_cookie_headers
24
+ set_cookie_headers.first.scan(/dsc=(\w+)/).flatten.first
25
+ end
26
+ end
25
27
 
26
- require 'trello'
27
- require 'webmock/rspec'
28
- require 'stringio'
28
+ uri_without_credentials_matcher = lambda do |match_request, coming_request|
29
+ without_public_key = -> (uri) { uri.sub(/key=\w+/, 'key=DEVELOPER_PUBLIC_KEY') }
30
+ without_member_token = -> (uri) { uri.sub(/token=\w+/, 'token=MEMBER_TOKEN') }
31
+ without_credentials = -> (request) { without_public_key.call(without_member_token.call(request.uri)) }
32
+
33
+ without_credentials.call(match_request) == without_credentials.call(coming_request)
34
+ end
35
+
36
+ config.default_cassette_options[:match_requests_on] = [:method, uri_without_credentials_matcher]
37
+ end
29
38
 
30
39
  Trello.logger = Logger.new(StringIO.new)
31
40
 
32
41
  RSpec.configure do |rspec|
33
42
  rspec.filter_run_excluding broken: true
43
+ rspec.filter_run_when_matching focus: true
34
44
 
35
45
  rspec.before :each do
36
46
  Trello.reset!
@@ -42,6 +52,21 @@ RSpec.configure do |rspec|
42
52
  example.run
43
53
  $VERBOSE = verbose
44
54
  end
55
+
56
+ rspec.failure_color = :magenta
57
+ rspec.tty = true
58
+ rspec.color = true
59
+ end
60
+
61
+ RSpec::Expectations.configuration.on_potential_false_positives = :nothing
62
+
63
+ module IntegrationHelpers
64
+ def setup_trello
65
+ Trello.configure do |config|
66
+ config.developer_public_key = ENV['TRELLO_DEVELOPER_PUBLIC_KEY'] || 'developerpublickey'
67
+ config.member_token = ENV['TRELLO_MEMBER_TOKEN'] || 'membertoken'
68
+ end
69
+ end
45
70
  end
46
71
 
47
72
  module Helpers
@@ -425,6 +450,54 @@ module Helpers
425
450
  JSON.generate(label_name_details)
426
451
  end
427
452
 
453
+ def custom_fields_details
454
+ [
455
+ {
456
+ 'id' => 'abcdef123456789123456789',
457
+ 'name' => 'Priority',
458
+ 'idModel' => 'abc123',
459
+ 'type' => 'checkbox',
460
+ 'pos' => 123,
461
+ 'modelType' => 'board'
462
+ },
463
+ {
464
+ id: 'abcdef123456789123456789',
465
+ name: 'Priority',
466
+ model_id: 'abc123',
467
+ type: 'checkbox',
468
+ pos: 123,
469
+ model_type: 'board'
470
+ }
471
+ ]
472
+ end
473
+
474
+ def custom_fields_payload
475
+ JSON.generate(custom_fields_details.first)
476
+ end
477
+
478
+ def custom_field_option_details
479
+ {
480
+ '_id' => 'abcdefgh12345678',
481
+ 'value' => {'text' => 'Low Priority'},
482
+ 'color' => 'green',
483
+ 'pos' => 1
484
+ }
485
+ end
486
+
487
+ def custom_field_item_details
488
+ {
489
+ 'id' => 'abcdefg1234567',
490
+ 'value' => { 'text' => 'hello world' },
491
+ 'idModel' => 'abcdef123456789123456789',
492
+ 'idCustomField' => 'abcdef123456789123456789',
493
+ 'modelType' => 'card'
494
+ }
495
+ end
496
+
497
+ def custom_field_items_payload
498
+ JSON.generate(custom_field_item_details)
499
+ end
500
+
428
501
  def webhooks_payload
429
502
  JSON.generate(webhooks_details)
430
503
  end
@@ -66,5 +66,24 @@ module Trello
66
66
  expect(token.member).to eq Member.find('abcdef123456789123456789')
67
67
  end
68
68
  end
69
+
70
+ describe "#update_fields" do
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)
80
+
81
+ token.update_fields({})
82
+
83
+ expected.each do |key, value|
84
+ expect(token.send(value)).to eq expected[key]
85
+ end
86
+ end
87
+ end
69
88
  end
70
89
  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
@@ -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