gooddata 0.6.51 → 0.6.52
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/.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
|