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.
- checksums.yaml +4 -4
- data/README.md +49 -10
- data/lib/trello.rb +47 -35
- data/lib/trello/action.rb +4 -2
- data/lib/trello/association_builder/has_many.rb +17 -0
- data/lib/trello/association_builder/has_one.rb +16 -0
- data/lib/trello/association_fetcher/has_many.rb +26 -0
- data/lib/trello/association_fetcher/has_many/fetch.rb +47 -0
- data/lib/trello/association_fetcher/has_many/params.rb +56 -0
- data/lib/trello/association_fetcher/has_one.rb +25 -0
- data/lib/trello/association_fetcher/has_one/fetch.rb +49 -0
- data/lib/trello/association_fetcher/has_one/params.rb +36 -0
- data/lib/trello/association_infer_tool.rb +13 -0
- data/lib/trello/association_proxy.rb +1 -1
- data/lib/trello/basic_data.rb +7 -48
- data/lib/trello/board.rb +1 -1
- data/lib/trello/card.rb +88 -36
- data/lib/trello/custom_field.rb +26 -9
- data/lib/trello/custom_field_item.rb +32 -12
- data/lib/trello/label.rb +24 -7
- data/lib/trello/member.rb +1 -1
- data/lib/trello/register_attributes.rb +54 -0
- data/spec/action_spec.rb +1 -1
- data/spec/card_spec.rb +98 -22
- data/spec/cassettes/can_add_a_file_from_url_on_a_card.yml +189 -0
- data/spec/cassettes/can_add_a_file_on_a_card.yml +200 -0
- data/spec/cassettes/can_add_a_member_to_a_card.yml +190 -0
- data/spec/cassettes/can_add_label_on_a_card.yml +281 -0
- data/spec/cassettes/can_close_bong_a_card.yml +189 -0
- data/spec/cassettes/can_get_actions.yml +196 -0
- data/spec/cassettes/can_get_attachments.yml +187 -0
- data/spec/cassettes/can_get_comments.yml +193 -0
- data/spec/cassettes/can_move_a_card_to_another_board_with_specific_list.yml +373 -0
- data/spec/cassettes/can_move_a_card_to_another_board_without_specific_list.yml +281 -0
- data/spec/cassettes/can_move_a_card_to_another_list.yml +281 -0
- data/spec/cassettes/can_remove_a_member_from_a_card.yml +185 -0
- data/spec/cassettes/can_remove_an_attachment_on_a_card.yml +277 -0
- data/spec/cassettes/can_remove_an_upvote_on_a_card.yml +465 -0
- data/spec/cassettes/can_remove_label_on_a_card.yml +279 -0
- data/spec/cassettes/can_success_add_comment_to_a_card.yml +196 -0
- data/spec/cassettes/can_success_copy_checklist_to_a_card.yml +281 -0
- data/spec/cassettes/can_success_copy_checklist_to_a_card_without_name_pos.yml +281 -0
- data/spec/cassettes/can_success_create_a_card.yml +99 -0
- data/spec/cassettes/can_success_create_new_checklist_to_a_card.yml +189 -0
- data/spec/cassettes/can_success_delete_card.yml +185 -0
- data/spec/cassettes/can_success_upate_a_card.yml +189 -0
- data/spec/cassettes/can_success_update_bong_a_card.yml +191 -0
- data/spec/cassettes/can_upvote_on_a_card.yml +469 -0
- data/spec/cassettes/card_find_with_id_and_get_all_fields.yml +95 -0
- data/spec/cassettes/card_find_with_id_and_get_specific_fields.yml +96 -0
- data/spec/cassettes/custom_field_item_save_1.yml +97 -0
- data/spec/cassettes/custom_field_item_save_2.yml +281 -0
- data/spec/cassettes/get_board_of_card.yml +187 -0
- data/spec/cassettes/get_check_item_states_of_card.yml +188 -0
- data/spec/cassettes/get_checklists_of_card.yml +187 -0
- data/spec/cassettes/get_cover_image_of_card.yml +187 -0
- data/spec/cassettes/get_custom_field_items_of_card.yml +187 -0
- data/spec/cassettes/get_list_of_card.yml +188 -0
- data/spec/cassettes/get_lists.yml +187 -0
- data/spec/cassettes/get_members_of_card.yml +189 -0
- data/spec/cassettes/get_plugin_data_of_card.yml +187 -0
- data/spec/cassettes/get_voters_of_card.yml +188 -0
- data/spec/cassettes/remove_upvote_on_a_card_when_have_not_voted.yml +366 -0
- data/spec/cassettes/revote_on_a_card.yml +464 -0
- data/spec/custom_field_item_spec.rb +74 -0
- data/spec/custom_field_spec.rb +76 -0
- data/spec/integration/basic_data/many_spec.rb +123 -0
- data/spec/integration/basic_data/one_spec.rb +84 -0
- data/spec/integration/basic_data/register_attributes_spec.rb +75 -0
- data/spec/integration/board_lists_spec.rb +21 -0
- data/spec/integration/card/add_and_remove_attachment_spec.rb +45 -0
- data/spec/integration/card/add_and_remove_label_spec.rb +35 -0
- data/spec/integration/card/add_checklist_spec.rb +32 -0
- data/spec/integration/card/add_comment_spec.rb +19 -0
- data/spec/integration/card/add_memeber_spec.rb +19 -0
- data/spec/integration/card/associations/actions_spec.rb +17 -0
- data/spec/integration/card/associations/attachments_spec.rb +18 -0
- data/spec/integration/card/associations/board_spec.rb +17 -0
- data/spec/integration/card/associations/check_item_states_spec.rb +17 -0
- data/spec/integration/card/associations/checklists_spec.rb +18 -0
- data/spec/integration/card/associations/comments_spec.rb +19 -0
- data/spec/integration/card/associations/cover_image_spec.rb +18 -0
- data/spec/integration/card/associations/custom_field_items_spec.rb +18 -0
- data/spec/integration/card/associations/list_spec.rb +16 -0
- data/spec/integration/card/associations/members_spec.rb +18 -0
- data/spec/integration/card/associations/plugin_data_spec.rb +18 -0
- data/spec/integration/card/associations/voters_spec.rb +17 -0
- data/spec/integration/card/close!_spec.rb +16 -0
- data/spec/integration/card/create_new_check_list_spec.rb +19 -0
- data/spec/integration/card/create_spec.rb +50 -0
- data/spec/integration/card/delete_spec.rb +16 -0
- data/spec/integration/card/find_spec.rb +67 -0
- data/spec/integration/card/move_to_board_spec.rb +36 -0
- data/spec/integration/card/move_to_list_spec.rb +20 -0
- data/spec/integration/card/remove_member_spec.rb +19 -0
- data/spec/integration/card/save_spec.rb +61 -0
- data/spec/integration/card/update!_spec.rb +53 -0
- data/spec/integration/card/vote_spec.rb +50 -0
- data/spec/integration/custom_field_item_spec.rb +47 -0
- data/spec/label_spec.rb +79 -0
- data/spec/spec_helper.rb +48 -23
- data/spec/unit/trello/association_builder/has_many_spec.rb +36 -0
- data/spec/unit/trello/association_builder/has_one_spec.rb +36 -0
- data/spec/unit/trello/association_fetcher/has_many/fetch_spec.rb +38 -0
- data/spec/unit/trello/association_fetcher/has_many/params_spec.rb +107 -0
- data/spec/unit/trello/association_fetcher/has_many_spec.rb +50 -0
- data/spec/unit/trello/association_fetcher/has_one/fetch_spec.rb +51 -0
- data/spec/unit/trello/association_fetcher/has_one/params_spec.rb +81 -0
- data/spec/unit/trello/association_fetcher/has_one_spec.rb +49 -0
- data/spec/unit/trello/association_infer_tool_spec.rb +41 -0
- data/spec/unit/trello/basic_data_spec.rb +54 -0
- data/spec/unit/trello/card_spec.rb +103 -0
- metadata +185 -6
data/spec/spec_helper.rb
CHANGED
@@ -1,36 +1,46 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'dotenv/load'
|
3
|
+
require 'trello'
|
4
|
+
require 'webmock/rspec'
|
5
|
+
require 'stringio'
|
6
|
+
require 'vcr'
|
2
7
|
|
3
|
-
|
4
|
-
require 'simplecov'
|
5
|
-
SimpleCov.start
|
6
|
-
end
|
8
|
+
require 'pry-byebug' if RUBY_ENGINE != 'jruby'
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
10
|
+
VCR.configure do |config|
|
11
|
+
config.cassette_library_dir = 'spec/cassettes'
|
12
|
+
config.hook_into :webmock
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
23
|
+
if set_cookie_headers
|
24
|
+
set_cookie_headers.first.scan(/dsc=(\w+)/).flatten.first
|
25
|
+
end
|
26
|
+
end
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|