ruby-trello 2.2.0 → 2.3.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +49 -10
  3. data/lib/trello.rb +47 -35
  4. data/lib/trello/action.rb +4 -2
  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/basic_data.rb +7 -48
  16. data/lib/trello/board.rb +1 -1
  17. data/lib/trello/card.rb +88 -36
  18. data/lib/trello/custom_field.rb +26 -9
  19. data/lib/trello/custom_field_item.rb +32 -12
  20. data/lib/trello/label.rb +24 -7
  21. data/lib/trello/member.rb +1 -1
  22. data/lib/trello/register_attributes.rb +54 -0
  23. data/spec/action_spec.rb +1 -1
  24. data/spec/card_spec.rb +98 -22
  25. data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
  26. data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
  27. data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
  28. data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
  29. data/spec/cassettes/can_close_bong_a_card.yml +189 -0
  30. data/spec/cassettes/can_get_actions.yml +196 -0
  31. data/spec/cassettes/can_get_attachments.yml +187 -0
  32. data/spec/cassettes/can_get_comments.yml +193 -0
  33. data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
  34. data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
  35. data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
  36. data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
  37. data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
  38. data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
  39. data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
  40. data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
  41. data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
  42. data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
  43. data/spec/cassettes/can_success_create_a_card.yml +99 -0
  44. data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
  45. data/spec/cassettes/can_success_delete_card.yml +185 -0
  46. data/spec/cassettes/can_success_upate_a_card.yml +189 -0
  47. data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
  48. data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
  49. data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
  50. data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
  51. data/spec/cassettes/custom_field_item_save_1.yml +97 -0
  52. data/spec/cassettes/custom_field_item_save_2.yml +281 -0
  53. data/spec/cassettes/get_board_of_card.yml +187 -0
  54. data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
  55. data/spec/cassettes/get_checklists_of_card.yml +187 -0
  56. data/spec/cassettes/get_cover_image_of_card.yml +187 -0
  57. data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
  58. data/spec/cassettes/get_list_of_card.yml +188 -0
  59. data/spec/cassettes/get_lists.yml +187 -0
  60. data/spec/cassettes/get_members_of_card.yml +189 -0
  61. data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
  62. data/spec/cassettes/get_voters_of_card.yml +188 -0
  63. data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
  64. data/spec/cassettes/revote_on_a_card.yml +464 -0
  65. data/spec/custom_field_item_spec.rb +74 -0
  66. data/spec/custom_field_spec.rb +76 -0
  67. data/spec/integration/basic_data/many_spec.rb +123 -0
  68. data/spec/integration/basic_data/one_spec.rb +84 -0
  69. data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
  70. data/spec/integration/board_lists_spec.rb +21 -0
  71. data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
  72. data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
  73. data/spec/integration/card/add_checklist_spec.rb +32 -0
  74. data/spec/integration/card/add_comment_spec.rb +19 -0
  75. data/spec/integration/card/add_memeber_spec.rb +19 -0
  76. data/spec/integration/card/associations/actions_spec.rb +17 -0
  77. data/spec/integration/card/associations/attachments_spec.rb +18 -0
  78. data/spec/integration/card/associations/board_spec.rb +17 -0
  79. data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
  80. data/spec/integration/card/associations/checklists_spec.rb +18 -0
  81. data/spec/integration/card/associations/comments_spec.rb +19 -0
  82. data/spec/integration/card/associations/cover_image_spec.rb +18 -0
  83. data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
  84. data/spec/integration/card/associations/list_spec.rb +16 -0
  85. data/spec/integration/card/associations/members_spec.rb +18 -0
  86. data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
  87. data/spec/integration/card/associations/voters_spec.rb +17 -0
  88. data/spec/integration/card/close!_spec.rb +16 -0
  89. data/spec/integration/card/create_new_check_list_spec.rb +19 -0
  90. data/spec/integration/card/create_spec.rb +50 -0
  91. data/spec/integration/card/delete_spec.rb +16 -0
  92. data/spec/integration/card/find_spec.rb +67 -0
  93. data/spec/integration/card/move_to_board_spec.rb +36 -0
  94. data/spec/integration/card/move_to_list_spec.rb +20 -0
  95. data/spec/integration/card/remove_member_spec.rb +19 -0
  96. data/spec/integration/card/save_spec.rb +61 -0
  97. data/spec/integration/card/update!_spec.rb +53 -0
  98. data/spec/integration/card/vote_spec.rb +50 -0
  99. data/spec/integration/custom_field_item_spec.rb +47 -0
  100. data/spec/label_spec.rb +79 -0
  101. data/spec/spec_helper.rb +48 -23
  102. data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
  103. data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
  104. data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
  105. data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
  106. data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
  107. data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
  108. data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
  109. data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
  110. data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
  111. data/spec/unit/trello/basic_data_spec.rb +54 -0
  112. data/spec/unit/trello/card_spec.rb +103 -0
  113. metadata +185 -6
data/spec/spec_helper.rb CHANGED
@@ -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
@@ -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
@@ -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