gooddata 0.6.51 → 0.6.52
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +13 -1
- data/CONTRIBUTING.md +25 -0
- data/PULL_REQUEST_TEMPLATE.md +5 -0
- data/README.md +7 -4
- data/gooddata.gemspec +2 -3
- data/lib/gooddata.rb +1 -0
- data/lib/gooddata/bricks/base_downloader.rb +6 -6
- data/lib/gooddata/bricks/middleware/aws_middleware.rb +15 -5
- data/lib/gooddata/bricks/middleware/dwh_middleware.rb +15 -3
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +13 -4
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +3 -0
- data/lib/gooddata/exceptions/no_project_error.rb +5 -1
- data/lib/gooddata/goodzilla/goodzilla.rb +7 -6
- data/lib/gooddata/helpers/data_helper.rb +4 -4
- data/lib/gooddata/helpers/global_helpers_params.rb +61 -39
- data/lib/gooddata/lcm/actions/apply_custom_maql.rb +9 -0
- data/lib/gooddata/lcm/actions/associate_clients.rb +23 -4
- data/lib/gooddata/lcm/actions/collect_attrs.rb +56 -0
- data/lib/gooddata/lcm/actions/collect_ca_metrics.rb +53 -0
- data/lib/gooddata/lcm/actions/collect_clients.rb +25 -3
- data/lib/gooddata/lcm/actions/collect_meta.rb +83 -0
- data/lib/gooddata/lcm/actions/collect_segment_clients.rb +12 -4
- data/lib/gooddata/lcm/actions/collect_segments.rb +4 -4
- data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +74 -0
- data/lib/gooddata/lcm/actions/create_segment_masters.rb +16 -30
- data/lib/gooddata/lcm/actions/ensure_release_table.rb +0 -3
- data/lib/gooddata/lcm/actions/ensure_segments.rb +1 -4
- data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +5 -5
- data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +8 -5
- data/lib/gooddata/lcm/actions/hello_world.rb +0 -3
- data/lib/gooddata/lcm/actions/import_object_collections.rb +60 -0
- data/lib/gooddata/lcm/actions/print_actions.rb +0 -3
- data/lib/gooddata/lcm/actions/print_modes.rb +0 -3
- data/lib/gooddata/lcm/actions/print_types.rb +1 -4
- data/lib/gooddata/lcm/actions/provision_clients.rb +5 -5
- data/lib/gooddata/lcm/actions/purge_clients.rb +4 -10
- data/lib/gooddata/lcm/actions/segments_filter.rb +0 -6
- data/lib/gooddata/lcm/actions/synchronize_attribute_drillpaths.rb +8 -4
- data/lib/gooddata/lcm/actions/synchronize_cas.rb +61 -0
- data/lib/gooddata/lcm/actions/synchronize_clients.rb +9 -3
- data/lib/gooddata/lcm/actions/synchronize_color_palette.rb +13 -5
- data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +71 -17
- data/lib/gooddata/lcm/actions/synchronize_label_types.rb +8 -5
- data/lib/gooddata/lcm/actions/synchronize_ldm.rb +17 -8
- data/lib/gooddata/lcm/actions/synchronize_meta.rb +0 -3
- data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +9 -4
- data/lib/gooddata/lcm/actions/synchronize_processes.rb +9 -5
- data/lib/gooddata/lcm/actions/synchronize_schedules.rb +15 -5
- data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +61 -0
- data/lib/gooddata/lcm/actions/update_release_table.rb +0 -3
- data/lib/gooddata/lcm/helpers/tags_helper.rb +35 -0
- data/lib/gooddata/lcm/lcm.rb +22 -4
- data/lib/gooddata/lcm/lcm2.rb +66 -13
- data/lib/gooddata/lcm/types/complex/update_preference.rb +1 -1
- data/lib/gooddata/mixins/md_finders.rb +4 -2
- data/lib/gooddata/mixins/md_object_indexer.rb +13 -3
- data/lib/gooddata/mixins/md_object_query.rb +8 -2
- data/lib/gooddata/models/blueprint/date_dimension.rb +6 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +41 -11
- data/lib/gooddata/models/blueprint/project_builder.rb +20 -0
- data/lib/gooddata/models/blueprint/to_wire.rb +7 -0
- data/lib/gooddata/models/client.rb +6 -0
- data/lib/gooddata/models/domain.rb +6 -6
- data/lib/gooddata/models/from_wire.rb +5 -1
- data/lib/gooddata/models/metadata.rb +55 -9
- data/lib/gooddata/models/metadata/attribute.rb +19 -4
- data/lib/gooddata/models/metadata/dashboard.rb +15 -3
- data/lib/gooddata/models/metadata/dataset.rb +5 -2
- data/lib/gooddata/models/metadata/dimension.rb +4 -1
- data/lib/gooddata/models/metadata/fact.rb +9 -2
- data/lib/gooddata/models/metadata/folder.rb +4 -1
- data/lib/gooddata/models/metadata/metric.rb +11 -3
- data/lib/gooddata/models/metadata/report.rb +7 -2
- data/lib/gooddata/models/metadata/report_definition.rb +11 -4
- data/lib/gooddata/models/metadata/scheduled_mail.rb +4 -1
- data/lib/gooddata/models/metadata/variable.rb +7 -2
- data/lib/gooddata/models/model.rb +14 -3
- data/lib/gooddata/models/process.rb +10 -9
- data/lib/gooddata/models/project.rb +134 -36
- data/lib/gooddata/models/project_creator.rb +43 -20
- data/lib/gooddata/models/report_data_result.rb +6 -2
- data/lib/gooddata/models/schedule.rb +6 -3
- data/lib/gooddata/models/subscription.rb +8 -1
- data/lib/gooddata/models/user_filters/user_filter.rb +1 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +18 -4
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +3 -1
- data/lib/gooddata/rest/client.rb +4 -6
- data/lib/gooddata/rest/connection.rb +10 -2
- data/lib/gooddata/version.rb +1 -1
- data/spec/data/blueprints/test_blueprint.json +1 -0
- data/spec/data/wire_models/test_blueprint.json +3 -0
- data/spec/data/workspace_table.csv +3 -0
- data/spec/environment/development.rb +4 -1
- data/spec/environment/environment.rb +1 -1
- data/spec/environment/staging.rb +5 -1
- data/spec/environment/testing.rb +5 -2
- data/spec/integration/blueprint_with_ca_spec.rb +56 -0
- data/spec/integration/clients_spec.rb +21 -0
- data/spec/integration/command_datawarehouse_spec.rb +7 -1
- data/spec/integration/create_from_template_spec.rb +9 -3
- data/spec/integration/project_spec.rb +7 -0
- data/spec/integration/segments_spec.rb +0 -53
- data/spec/integration/subscription_spec.rb +29 -4
- data/spec/integration/urn_date_dim_spec.rb +53 -0
- data/spec/integration/user_filters_spec.rb +6 -0
- data/spec/integration/variables_spec.rb +1 -2
- data/spec/spec_helper.rb +5 -30
- data/spec/unit/actions/collect_clients_spec.rb +38 -0
- data/spec/unit/actions/collect_meta_spec.rb +87 -0
- data/spec/unit/actions/collect_segment_clients_spec.rb +40 -0
- data/spec/unit/actions/collect_tagged_objects_spec.rb +110 -0
- data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +51 -0
- data/spec/unit/bricks/middleware/aws_middelware_spec.rb +55 -1
- data/spec/unit/bricks/middleware/logger_middleware_spec.rb +15 -0
- data/spec/unit/helpers/data_helper_spec.rb +3 -5
- data/spec/unit/helpers/global_helpers_spec.rb +29 -0
- data/spec/unit/helpers_spec.rb +18 -1
- data/spec/unit/models/blueprint/project_blueprint_spec.rb +1 -23
- data/spec/unit/models/domain_spec.rb +19 -0
- data/spec/unit/models/metadata_spec.rb +34 -0
- data/spec/unit/models/schedule_spec.rb +31 -0
- data/spec/unit/models/to_manifest_spec.rb +10 -2
- data/spec/unit/models/unit_project_spec.rb +6 -1
- data/spec/unit/rest/polling_spec.rb +13 -1
- metadata +49 -31
@@ -21,7 +21,14 @@ describe GoodData::Subscription, :constraint => 'slow' do
|
|
21
21
|
|
22
22
|
it 'should be able to create a subscription' do
|
23
23
|
begin
|
24
|
-
subscription = GoodData::Subscription.create(
|
24
|
+
subscription = GoodData::Subscription.create(
|
25
|
+
client: @client,
|
26
|
+
project: ProjectHelper::PROJECT_ID,
|
27
|
+
channels: @channel,
|
28
|
+
message: 'hello world',
|
29
|
+
process: ProcessHelper::PROCESS_ID,
|
30
|
+
project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
|
31
|
+
)
|
25
32
|
expect(subscription.title).to eq ConnectionHelper::DEFAULT_USERNAME
|
26
33
|
expect(subscription.channels).to eq [@channel.uri]
|
27
34
|
expect(subscription.message).to eq 'hello world'
|
@@ -34,7 +41,13 @@ describe GoodData::Subscription, :constraint => 'slow' do
|
|
34
41
|
|
35
42
|
it 'should be able to edit a subscription' do
|
36
43
|
begin
|
37
|
-
subscription = GoodData::Subscription.create(
|
44
|
+
subscription = GoodData::Subscription.create(
|
45
|
+
client: @client,
|
46
|
+
project: ProjectHelper::PROJECT_ID,
|
47
|
+
channels: @channel,
|
48
|
+
process: ProcessHelper::PROCESS_ID,
|
49
|
+
project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
|
50
|
+
)
|
38
51
|
expect(subscription.title).to eq ConnectionHelper::DEFAULT_USERNAME
|
39
52
|
|
40
53
|
subscription.title = 'My title'
|
@@ -49,7 +62,13 @@ describe GoodData::Subscription, :constraint => 'slow' do
|
|
49
62
|
it 'should be able to list all subscriptions' do
|
50
63
|
begin
|
51
64
|
expect(GoodData::Subscription.all(project: ProjectHelper::PROJECT_ID, client: @client)).to eq []
|
52
|
-
subscription = GoodData::Subscription.create(
|
65
|
+
subscription = GoodData::Subscription.create(
|
66
|
+
client: @client,
|
67
|
+
project: ProjectHelper::PROJECT_ID,
|
68
|
+
channels: @channel,
|
69
|
+
process: ProcessHelper::PROCESS_ID,
|
70
|
+
project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
|
71
|
+
)
|
53
72
|
expect(GoodData::Subscription.all(project: ProjectHelper::PROJECT_ID, client: @client)).to eq [subscription]
|
54
73
|
ensure
|
55
74
|
subscription && subscription.delete
|
@@ -57,7 +76,13 @@ describe GoodData::Subscription, :constraint => 'slow' do
|
|
57
76
|
end
|
58
77
|
|
59
78
|
it 'should be able to delete a subscription' do
|
60
|
-
subscription = GoodData::Subscription.create(
|
79
|
+
subscription = GoodData::Subscription.create(
|
80
|
+
client: @client,
|
81
|
+
project: ProjectHelper::PROJECT_ID,
|
82
|
+
channels: @channel,
|
83
|
+
process: ProcessHelper::PROCESS_ID,
|
84
|
+
project_events: GoodData::Subscription::PROCESS_SUCCESS_EVENT
|
85
|
+
)
|
61
86
|
subscription.delete
|
62
87
|
end
|
63
88
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require 'gooddata'
|
8
|
+
|
9
|
+
describe "Blueprint now support urn in date dimension", :constraint => 'slow' do
|
10
|
+
before(:all) do
|
11
|
+
@client = ConnectionHelper.create_default_connection
|
12
|
+
|
13
|
+
@blueprint = GoodData::Model::ProjectBlueprint.build("My project from blueprint") do |p|
|
14
|
+
p.add_date_dimension('created_on', urn: 'urn:pe:date')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
after(:all) do
|
19
|
+
@client && @client.disconnect
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'project creates from blueprint contains urn in date dimension' do
|
23
|
+
before(:all) do
|
24
|
+
@project = @client.create_project_from_blueprint(@blueprint, token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
|
25
|
+
end
|
26
|
+
|
27
|
+
after(:all) do
|
28
|
+
@project && @project.delete
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should have urn in date dimension' do
|
32
|
+
expect(@project.datasets.find(&:date_dimension?).content['urn']).to eq 'urn:pe:date'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'blueprint contains urn in date dimension' do
|
36
|
+
expect(@project.blueprint.date_dimensions.first.urn).to eq 'urn:pe:date'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'merging blueprint' do
|
41
|
+
before do
|
42
|
+
@new_bp = GoodData::Model::ProjectBlueprint.build("update") do |p|
|
43
|
+
p.add_date_dimension('created_on', urn: 'urn:stonegate:date')
|
44
|
+
end
|
45
|
+
|
46
|
+
@blueprint = @blueprint.merge(@new_bp)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'update urn' do
|
50
|
+
expect(@blueprint.date_dimensions.first.urn).to eq 'urn:stonegate:date'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -133,6 +133,12 @@ describe "User filters implementation", :constraint => 'slow' do
|
|
133
133
|
expect(@project.data_permissions.count).to eq 0
|
134
134
|
end
|
135
135
|
|
136
|
+
it 'should drop the filter when none of filter values is found' do
|
137
|
+
filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, '%^&*( nonexistent value']]
|
138
|
+
@project.add_data_permissions(filters, ignore_missing_values: true)
|
139
|
+
expect(@project.data_permissions.count).to eq 0
|
140
|
+
end
|
141
|
+
|
136
142
|
it "should add a filter with nonexistent values when asked" do
|
137
143
|
filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, '%^&*( nonexistent value', 'jirka@gooddata.com']]
|
138
144
|
@project.add_data_permissions(filters, ignore_missing_values: true)
|
@@ -146,8 +146,7 @@ describe "Variables implementation", :constraint => 'slow' do
|
|
146
146
|
filters = [[ConnectionHelper::DEFAULT_USERNAME, @label.uri, "NONEXISTENT1", "NONEXISTENT2", "NONEXISTENT3"]]
|
147
147
|
@project.add_variable_permissions(filters, @variable, ignore_missing_values: true)
|
148
148
|
# expect(metric.execute).to eq 9
|
149
|
-
expect(@variable.user_values.
|
150
|
-
.to eq [[ConnectionHelper::DEFAULT_USERNAME, "TRUE"]]
|
149
|
+
expect(@variable.user_values.count).to eq 0
|
151
150
|
|
152
151
|
@project.add_variable_permissions(filters, @variable, ignore_missing_values: true, restrict_if_missing_all_values: true)
|
153
152
|
# expect(metric.execute).to eq nil
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,11 @@ require 'pmap'
|
|
9
9
|
require 'rspec'
|
10
10
|
require 'pathname'
|
11
11
|
require 'webmock/rspec'
|
12
|
+
require 'gooddata'
|
13
|
+
|
14
|
+
logger = Logger.new(STDOUT)
|
15
|
+
logger.level = Logger::WARN
|
16
|
+
GoodData.logger = logger
|
12
17
|
|
13
18
|
WebMock.disable!
|
14
19
|
|
@@ -43,36 +48,6 @@ RSpec.configure do |config|
|
|
43
48
|
config.filter_run_excluding :broken => true
|
44
49
|
|
45
50
|
config.fail_fast = false
|
46
|
-
|
47
|
-
config.before(:all) do
|
48
|
-
# TODO: Move this to some method.
|
49
|
-
# TODO Make more intelligent so two test suites can run at the same time.
|
50
|
-
# ConnectionHelper.create_default_connection
|
51
|
-
# users = GoodData::Domain.users(ConnectionHelper::DEFAULT_DOMAIN)
|
52
|
-
# users.pmap do |user|
|
53
|
-
# user.delete if user.email != ConnectionHelper::DEFAULT_USERNAME
|
54
|
-
# end
|
55
|
-
|
56
|
-
# TODO: Fully setup global environment
|
57
|
-
# $stdout.sync=true
|
58
|
-
# $stderr.sync=true
|
59
|
-
|
60
|
-
GoodData.logging_off
|
61
|
-
GoodData.stats_off
|
62
|
-
end
|
63
|
-
|
64
|
-
config.after(:all) do
|
65
|
-
# TODO: Fully setup global environment
|
66
|
-
end
|
67
|
-
|
68
|
-
config.before(:suite) do
|
69
|
-
# TODO: Setup test project
|
70
|
-
GoodData.logging_off
|
71
|
-
end
|
72
|
-
|
73
|
-
config.after(:suite) do
|
74
|
-
# TODO: Delete test project
|
75
|
-
end
|
76
51
|
end
|
77
52
|
|
78
53
|
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require 'gooddata/lcm/actions/collect_clients'
|
8
|
+
require 'gooddata/lcm/lcm2'
|
9
|
+
|
10
|
+
describe GoodData::LCM2::CollectClients do
|
11
|
+
let(:data_source) { double(:data_source) }
|
12
|
+
let(:input_data) { double(:input_data) }
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(GoodData::Helpers::DataSource).to receive(:new)
|
16
|
+
.and_return(data_source)
|
17
|
+
allow(data_source).to receive(:realize)
|
18
|
+
.and_return('spec/data/workspace_table.csv')
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when segments is specified' do
|
22
|
+
let(:params) do
|
23
|
+
params = {
|
24
|
+
segments: [{ segment_id: 'segment_foo' }],
|
25
|
+
input_source: {}
|
26
|
+
}
|
27
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'collects all clients' do
|
31
|
+
result = subject.class.call(params)
|
32
|
+
expected = [{ client: 'client_foo',
|
33
|
+
segment_id: 'segment_foo',
|
34
|
+
title: nil }]
|
35
|
+
expect(result[:results]).to eq(expected)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require 'gooddata/lcm/actions/collect_meta'
|
8
|
+
require 'gooddata/lcm/lcm2'
|
9
|
+
|
10
|
+
describe GoodData::LCM2::CollectMeta do
|
11
|
+
let(:development_client) { double('development_client') }
|
12
|
+
let(:dashboard) { double('dashboard', uri: 'tagged/dashboard/uri') }
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(development_client).to receive(:projects).and_return({})
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when no production tag configured' do
|
19
|
+
let(:params) do
|
20
|
+
params = {
|
21
|
+
development_client: development_client,
|
22
|
+
synchronize: [{ from: 'project_id' }]
|
23
|
+
}
|
24
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'retrieves all dashboards' do
|
28
|
+
expect(GoodData::Dashboard).to receive(:all).and_return({})
|
29
|
+
subject.class.call(params)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when global production tag configured' do
|
34
|
+
let(:params) do
|
35
|
+
params = {
|
36
|
+
development_client: development_client,
|
37
|
+
synchronize: [{ from: 'project_id' }],
|
38
|
+
production_tag: 'production_tag'
|
39
|
+
}
|
40
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'retrieves dashboards by the specified tag' do
|
44
|
+
expect(GoodData::Dashboard).to receive(:find_by_tag)
|
45
|
+
.with(['production_tag'], any_args)
|
46
|
+
.and_return({})
|
47
|
+
subject.class.call(params)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when segment-specific production tag configured' do
|
52
|
+
let(:params) do
|
53
|
+
params = {
|
54
|
+
development_client: development_client,
|
55
|
+
synchronize: [{ from: 'project_id' }],
|
56
|
+
segments: [{ production_tag: 'segment_production_tag' }, {}]
|
57
|
+
}
|
58
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'retrieves dashboards by the specified tag' do
|
62
|
+
expect(GoodData::Dashboard).to receive(:find_by_tag)
|
63
|
+
.with(['segment_production_tag'], any_args)
|
64
|
+
.and_return({})
|
65
|
+
subject.class.call(params)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when both global and segment-specific production tags configured' do
|
70
|
+
let(:params) do
|
71
|
+
params = {
|
72
|
+
development_client: development_client,
|
73
|
+
synchronize: [{ from: 'project_id' }],
|
74
|
+
segments: [{ production_tag: 'segment_production_tag' }, {}],
|
75
|
+
production_tag: 'production_tag'
|
76
|
+
}
|
77
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'preffers segment-specific tags' do
|
81
|
+
expect(GoodData::Dashboard).to receive(:find_by_tag)
|
82
|
+
.with(%w(segment_production_tag), any_args)
|
83
|
+
.and_return({})
|
84
|
+
subject.class.call(params)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require 'gooddata/lcm/actions/collect_segment_clients'
|
8
|
+
require 'gooddata/lcm/lcm2'
|
9
|
+
|
10
|
+
describe GoodData::LCM2::CollectSegmentClients do
|
11
|
+
let(:gdc_gd_client) { double('gdc_gd_client') }
|
12
|
+
let(:domain) { double('domain') }
|
13
|
+
let(:segment) { double('segment') }
|
14
|
+
let(:segments) { [segment] }
|
15
|
+
let(:client) { double('client') }
|
16
|
+
let(:clients) { [client] }
|
17
|
+
|
18
|
+
context 'when client has no project in segments' do
|
19
|
+
let(:params) do
|
20
|
+
params = {
|
21
|
+
gdc_gd_client: gdc_gd_client,
|
22
|
+
synchronize: [{}],
|
23
|
+
segments: [{}]
|
24
|
+
}
|
25
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
26
|
+
end
|
27
|
+
|
28
|
+
before do
|
29
|
+
allow(gdc_gd_client).to receive(:domain).and_return(domain)
|
30
|
+
allow(domain).to receive(:segments).and_return(segments)
|
31
|
+
allow(segment).to receive(:clients).and_return(clients)
|
32
|
+
allow(client).to receive(:project?).and_return(false)
|
33
|
+
allow(client).to receive(:client_id).and_return('my_client_id')
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'raise error' do
|
37
|
+
expect { subject.class.call(params) }.to raise_error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
|
7
|
+
require 'gooddata/lcm/actions/collect_tagged_objects'
|
8
|
+
require 'gooddata/lcm/lcm2'
|
9
|
+
|
10
|
+
shared_examples 'a tagged object collector' do
|
11
|
+
it 'collects tagged objects' do
|
12
|
+
result = subject.class.call(params)
|
13
|
+
expected = {
|
14
|
+
results: [{ project: 'some_development_project_id',
|
15
|
+
transfer_uri: 'tagged1' },
|
16
|
+
{ project: 'some_development_project_id',
|
17
|
+
transfer_uri: 'tagged2' }],
|
18
|
+
params: {
|
19
|
+
synchronize: [{
|
20
|
+
from: 'some_development_project_id',
|
21
|
+
transfer_uris: tagged_objects
|
22
|
+
}]
|
23
|
+
}
|
24
|
+
}
|
25
|
+
expect(result).to eq(expected)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'finds projects by the specified tags' do
|
29
|
+
expect(development_project).to receive(:find_by_tag)
|
30
|
+
.with(['production_tag'])
|
31
|
+
subject.class.call(params)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe GoodData::LCM2::CollectTaggedObjects do
|
36
|
+
let(:development_client) { double('development_client') }
|
37
|
+
|
38
|
+
context 'when no production tags configured' do
|
39
|
+
let(:params) do
|
40
|
+
params = {
|
41
|
+
development_client: development_client,
|
42
|
+
synchronize: [{}],
|
43
|
+
segments: [{}]
|
44
|
+
}
|
45
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
46
|
+
end
|
47
|
+
|
48
|
+
before do
|
49
|
+
allow(development_client).to receive(:projects).and_return({})
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns an empty array' do
|
53
|
+
result = subject.class.call(params)
|
54
|
+
expect(result).to be_empty
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when global production tags configured' do
|
59
|
+
let(:tagged_objects) { %w(tagged1 tagged2) }
|
60
|
+
let(:development_project) { double('development_project') }
|
61
|
+
|
62
|
+
before do
|
63
|
+
allow(development_project).to receive(:find_by_tag)
|
64
|
+
.and_return(tagged_objects)
|
65
|
+
allow(development_client).to receive(:projects)
|
66
|
+
.and_return(development_project)
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when segment-specific production tags specified' do
|
70
|
+
let(:params) do
|
71
|
+
params = {
|
72
|
+
development_client: development_client,
|
73
|
+
synchronize: [{ from: 'some_development_project_id' }],
|
74
|
+
segments: [{ production_tag: 'production_tag' }, {}]
|
75
|
+
}
|
76
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
77
|
+
end
|
78
|
+
|
79
|
+
it_behaves_like 'a tagged object collector'
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when global production tags specified' do
|
83
|
+
let(:params) do
|
84
|
+
params = {
|
85
|
+
development_client: development_client,
|
86
|
+
synchronize: [{ from: 'some_development_project_id' }],
|
87
|
+
segments: [{}],
|
88
|
+
production_tag: 'production_tag'
|
89
|
+
}
|
90
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
91
|
+
end
|
92
|
+
|
93
|
+
it_behaves_like 'a tagged object collector'
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when both global and segment-specific production tags specified' do
|
97
|
+
let(:params) do
|
98
|
+
params = {
|
99
|
+
development_client: development_client,
|
100
|
+
synchronize: [{ from: 'some_development_project_id' }],
|
101
|
+
segments: [{ production_tag: 'production_tag' }, {}],
|
102
|
+
production_tag: 'global_production_tag'
|
103
|
+
}
|
104
|
+
GoodData::LCM2.convert_to_smart_hash(params)
|
105
|
+
end
|
106
|
+
|
107
|
+
it_behaves_like 'a tagged object collector'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|