gooddata 0.6.53 → 0.6.54

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +5 -5
  2. data/.flayignore +6 -0
  3. data/.gitignore +1 -0
  4. data/.pronto.yml +3 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +4 -1
  7. data/CHANGELOG.md +18 -0
  8. data/CONTRIBUTING.md +14 -1
  9. data/DEPENDENCIES.md +324 -253
  10. data/Dockerfile.jruby +5 -7
  11. data/Dockerfile.ruby +8 -8
  12. data/Rakefile +24 -0
  13. data/ci.rake +47 -0
  14. data/docker-compose.yml +34 -0
  15. data/gooddata.gemspec +8 -2
  16. data/lib/gooddata/bricks/middleware/restforce_middleware.rb +0 -3
  17. data/lib/gooddata/helpers/data_helper.rb +10 -7
  18. data/lib/gooddata/helpers/global_helpers_params.rb +8 -3
  19. data/lib/gooddata/lcm/actions/apply_custom_maql.rb +2 -1
  20. data/lib/gooddata/lcm/actions/associate_clients.rb +10 -1
  21. data/lib/gooddata/lcm/actions/collect_client_projects.rb +78 -0
  22. data/lib/gooddata/lcm/actions/collect_clients.rb +20 -6
  23. data/lib/gooddata/lcm/actions/collect_data_product.rb +62 -0
  24. data/lib/gooddata/lcm/actions/collect_dynamic_schedule_params.rb +62 -0
  25. data/lib/gooddata/lcm/actions/{collect_attrs.rb → collect_ldm_objects.rb} +3 -3
  26. data/lib/gooddata/lcm/actions/collect_meta.rb +6 -3
  27. data/lib/gooddata/lcm/actions/collect_segment_clients.rb +2 -1
  28. data/lib/gooddata/lcm/actions/collect_segments.rb +6 -7
  29. data/lib/gooddata/lcm/actions/collect_tagged_objects.rb +7 -4
  30. data/lib/gooddata/lcm/actions/create_segment_masters.rb +7 -3
  31. data/lib/gooddata/lcm/actions/ensure_data_product.rb +53 -0
  32. data/lib/gooddata/lcm/actions/ensure_technical_users_domain.rb +6 -2
  33. data/lib/gooddata/lcm/actions/ensure_technical_users_project.rb +30 -18
  34. data/lib/gooddata/lcm/actions/execute_schedules.rb +128 -0
  35. data/lib/gooddata/lcm/actions/provision_clients.rb +32 -21
  36. data/lib/gooddata/lcm/actions/purge_clients.rb +25 -39
  37. data/lib/gooddata/lcm/actions/rename_existing_client_projects.rb +70 -0
  38. data/lib/gooddata/lcm/actions/segments_filter.rb +6 -0
  39. data/lib/gooddata/lcm/actions/synchronize_cas.rb +11 -0
  40. data/lib/gooddata/lcm/actions/synchronize_clients.rb +2 -1
  41. data/lib/gooddata/lcm/actions/synchronize_etls_in_segment.rb +34 -15
  42. data/lib/gooddata/lcm/actions/synchronize_ldm.rb +10 -1
  43. data/lib/gooddata/lcm/actions/synchronize_new_segments.rb +2 -1
  44. data/lib/gooddata/lcm/actions/synchronize_processes.rb +4 -7
  45. data/lib/gooddata/lcm/actions/synchronize_tag_objects.rb +8 -5
  46. data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +224 -0
  47. data/lib/gooddata/lcm/actions/synchronize_user_groups.rb +53 -0
  48. data/lib/gooddata/lcm/actions/synchronize_users.rb +324 -0
  49. data/lib/gooddata/lcm/dsl/type_dsl.rb +1 -0
  50. data/lib/gooddata/lcm/helpers/check_helper.rb +4 -0
  51. data/lib/gooddata/lcm/helpers/tags_helper.rb +4 -3
  52. data/lib/gooddata/lcm/lcm2.rb +33 -1
  53. data/lib/gooddata/lcm/types/complex/segment.rb +3 -0
  54. data/lib/gooddata/lcm/types/complex/update_preference.rb +8 -2
  55. data/lib/gooddata/lcm/types/special/array.rb +1 -3
  56. data/lib/gooddata/lcm/types/special/enum.rb +1 -3
  57. data/lib/gooddata/mixins/md_id_to_uri.rb +0 -1
  58. data/lib/gooddata/mixins/md_json.rb +2 -2
  59. data/lib/gooddata/models/blueprint/project_blueprint.rb +15 -0
  60. data/lib/gooddata/models/blueprint/to_wire.rb +1 -0
  61. data/lib/gooddata/models/client.rb +21 -9
  62. data/lib/gooddata/models/data_product.rb +149 -0
  63. data/lib/gooddata/models/domain.rb +26 -72
  64. data/lib/gooddata/models/from_wire.rb +2 -0
  65. data/lib/gooddata/models/metadata/report.rb +9 -3
  66. data/lib/gooddata/models/metadata/report_definition.rb +2 -2
  67. data/lib/gooddata/models/model.rb +1 -1
  68. data/lib/gooddata/models/process.rb +4 -0
  69. data/lib/gooddata/models/project.rb +58 -35
  70. data/lib/gooddata/models/project_creator.rb +13 -0
  71. data/lib/gooddata/models/segment.rb +63 -16
  72. data/lib/gooddata/models/style_setting.rb +2 -15
  73. data/lib/gooddata/models/user_group.rb +2 -0
  74. data/lib/gooddata/rest/connection.rb +32 -9
  75. data/lib/gooddata/rest/object_factory.rb +0 -25
  76. data/lib/gooddata/version.rb +1 -1
  77. data/spec/data/blueprints/invalid_blueprint.json +2 -2
  78. data/spec/data/blueprints/test_project_model_spec.json +1 -1
  79. data/spec/data/dynamic_schedule_params_table.csv +7 -0
  80. data/spec/data/workspace_table.csv +3 -3
  81. data/spec/environment/staging.rb +3 -3
  82. data/spec/integration/ads_output_stage_spec.rb +0 -10
  83. data/spec/integration/clients_spec.rb +1 -1
  84. data/spec/{unit → integration}/commands/command_projects_spec.rb +0 -0
  85. data/spec/{unit → integration}/core/connection_spec.rb +0 -0
  86. data/spec/{unit → integration}/core/logging_spec.rb +0 -0
  87. data/spec/{unit → integration}/core/project_spec.rb +0 -0
  88. data/spec/integration/date_dim_switch_spec.rb +13 -0
  89. data/spec/integration/full_process_schedule_spec.rb +2 -2
  90. data/spec/integration/helpers_spec.rb +16 -0
  91. data/spec/integration/lcm_spec.rb +12 -2
  92. data/spec/integration/mixins/id_to_uri_spec.rb +44 -0
  93. data/spec/integration/models/data_product_spec.rb +71 -0
  94. data/spec/{unit → integration}/models/domain_spec.rb +2 -2
  95. data/spec/{unit → integration}/models/invitation_spec.rb +0 -0
  96. data/spec/{unit → integration}/models/membership_spec.rb +0 -0
  97. data/spec/{unit → integration}/models/params_spec.rb +0 -0
  98. data/spec/{unit → integration}/models/profile_spec.rb +0 -0
  99. data/spec/{unit → integration}/models/project_role_spec.rb +0 -0
  100. data/spec/integration/models/project_spec.rb +225 -0
  101. data/spec/{unit → integration}/models/schedule_spec.rb +0 -0
  102. data/spec/{unit → integration}/models/unit_project_spec.rb +0 -0
  103. data/spec/integration/project_spec.rb +40 -5
  104. data/spec/integration/segments_spec.rb +27 -26
  105. data/spec/integration/user_filters_spec.rb +1 -1
  106. data/spec/spec_helper.rb +15 -19
  107. data/spec/unit/actions/associate_clients_spec.rb +47 -0
  108. data/spec/unit/actions/collect_client_projects_spec.rb +47 -0
  109. data/spec/unit/actions/collect_clients_spec.rb +27 -0
  110. data/spec/unit/actions/collect_data_product_spec.rb +64 -0
  111. data/spec/unit/actions/collect_dynamic_schedule_params_spec.rb +56 -0
  112. data/spec/unit/actions/collect_meta_spec.rb +4 -4
  113. data/spec/unit/actions/collect_segment_clients_spec.rb +44 -3
  114. data/spec/unit/actions/collect_tagged_objects_spec.rb +20 -4
  115. data/spec/unit/actions/create_segment_masters_spec.rb +64 -0
  116. data/spec/unit/actions/ensure_data_product_spec.rb +38 -0
  117. data/spec/unit/actions/ensure_technical_users_domain_spec.rb +51 -0
  118. data/spec/unit/actions/ensure_technical_users_project_spec.rb +72 -0
  119. data/spec/unit/actions/execute_schedules_spec.rb +94 -0
  120. data/spec/unit/actions/provision_clients_spec.rb +45 -0
  121. data/spec/unit/actions/purge_clients_spec.rb +47 -0
  122. data/spec/unit/actions/rename_existing_client_projects_spec.rb +54 -0
  123. data/spec/unit/actions/segments_filter_spec.rb +46 -0
  124. data/spec/unit/actions/shared_examples_for_user_actions.rb +10 -0
  125. data/spec/unit/actions/synchronize_cas_spec.rb +58 -0
  126. data/spec/unit/actions/synchronize_etls_in_segment_spec.rb +174 -13
  127. data/spec/unit/actions/synchronize_ldm_spec.rb +57 -0
  128. data/spec/unit/actions/synchronize_user_filters_spec.rb +142 -0
  129. data/spec/unit/actions/synchronize_user_groups_spec.rb +49 -0
  130. data/spec/unit/actions/synchronize_users_spec.rb +76 -0
  131. data/spec/unit/helpers/data_helper_spec.rb +17 -0
  132. data/spec/unit/helpers/global_helpers_spec.rb +16 -0
  133. data/spec/unit/helpers_spec.rb +0 -6
  134. data/spec/unit/models/blueprint/project_blueprint_spec.rb +21 -4
  135. data/spec/unit/models/project_creator_spec.rb +16 -0
  136. data/spec/unit/models/project_spec.rb +66 -197
  137. metadata +202 -100
  138. data/PULL_REQUEST_TEMPLATE.md +0 -5
  139. data/lib/gooddata/bricks/middleware/params_inspect_middleware.rb +0 -21
@@ -35,14 +35,7 @@ module GoodData
35
35
  end
36
36
  uri = STYLE_SETTING_PATH % project.pid
37
37
  data_to_send = GoodData::Helpers.deep_dup(EMPTY_OBJECT).tap do |d|
38
- d['styleSettings']['chartPalette'] = colors
39
- .each_with_index
40
- .map do |color, index|
41
- {
42
- 'guid' => "guid#{index + 1}",
43
- 'fill' => GoodData::Helpers.stringify_keys(color)
44
- }
45
- end
38
+ d['styleSettings']['chartPalette'] = colors.map { |color| GoodData::Helpers.stringify_keys(color) }
46
39
  end
47
40
  style = client.create(StyleSetting, data_to_send)
48
41
  client.put(uri, data_to_send)
@@ -59,13 +52,7 @@ module GoodData
59
52
  def initialize(json)
60
53
  super
61
54
  @json = json
62
- @colors = (json ? data['chartPalette'] : []).map do |color|
63
- {
64
- r: color['fill']['r'],
65
- g: color['fill']['g'],
66
- b: color['fill']['b']
67
- }
68
- end
55
+ @colors = json ? data['chartPalette'] : []
69
56
  end
70
57
 
71
58
  def empty?
@@ -67,6 +67,8 @@ module GoodData
67
67
  d['userGroup']['content']['project'] = data[:project].uri
68
68
  end
69
69
 
70
+ client = data[:project].client
71
+
70
72
  group = client.create(GoodData::UserGroup, GoodData::Helpers.stringify_keys(new_data))
71
73
  group.project = data[:project]
72
74
  group
@@ -505,7 +505,13 @@ module GoodData
505
505
  :verify_ssl => verify_ssl,
506
506
  :headers => @webdav_headers.merge(:x_gdc_authtt => headers[:x_gdc_authtt]),
507
507
  :payload => File.new(filename, 'rb'))
508
- request.execute
508
+
509
+ begin
510
+ request.execute
511
+ rescue => e
512
+ GoodData.logger.error("Error when uploading file #{filename}", e)
513
+ raise e
514
+ end
509
515
  end
510
516
 
511
517
  def format_error(e, params = {})
@@ -575,7 +581,6 @@ ERR
575
581
  merge_headers! response.headers
576
582
  content_type = response.headers[:content_type]
577
583
  return response if process == false
578
-
579
584
  if content_type == 'application/json' || content_type == 'application/json;charset=UTF-8'
580
585
  result = response.to_str == '""' ? {} : MultiJson.load(response.to_str)
581
586
  GoodData.rest_logger.debug "Request ID: #{response.headers[:x_gdc_request]} - Response: #{result.inspect}"
@@ -591,6 +596,10 @@ ERR
591
596
  elsif response.code == 204
592
597
  result = nil
593
598
  GoodData.rest_logger.debug 'Response: 204 no content'
599
+ elsif response.code == 200 && content_type.nil? && response.body.empty?
600
+ result = nil
601
+ # TMA-696
602
+ GoodData.rest_logger.warn 'Got response status 200 but no content-type and body.'
594
603
  else
595
604
  fail "Unsupported response content type '%s':\n%s" % [content_type, response.to_str[0..127]]
596
605
  end
@@ -633,21 +642,35 @@ ERR
633
642
  ['/gdc/account/domains/{id}/users?login={login}', %r{/gdc/account/domains/[\w\d-]+/users\?login=[^&$]+}],
634
643
  ['/gdc/account/domains/{id}', %r{/gdc/account/domains/[\w\d-]+}],
635
644
 
636
- ['/gdc/app/projects/{id}/execute', %r{/gdc/app/projects/[\w]+/execute}],
645
+ ['/gdc/projects/{id}/execute', %r{/gdc/projects/[\w]+/execute}],
637
646
 
638
647
  ['/gdc/datawarehouse/instances/{id}', %r{/gdc/datawarehouse/instances/[\w]+}],
639
648
  ['/gdc/datawarehouse/executions/{id}', %r{/gdc/datawarehouse/executions/[\w]+}],
640
649
 
641
650
  ['/gdc/domains/{id}/segments/{segment}/synchronizeClients/results/{result}/details?offset={offset}&limit={limit}',
642
- %r{/gdc/domains/[\w]+/segments/[\w-]+/synchronizeClients/results/[\w]+/details/\?offset=[\d]+&limit=[\d]+}],
643
- ['/gdc/domains/{id}/segments/{segment}/synchronizeClients/results/{result}', %r{/gdc/domains/[\w]+/segments/[\w-]+/synchronizeClients/results/[\w]+}],
644
- ['/gdc/domains/{id}/segments/{segment}/', %r{/gdc/domains/[\w]+/segments/[\w-]+/}],
645
- ['/gdc/domains/{id}/segments/{segment}', %r{/gdc/domains/[\w]+/segments/[\w-]+}],
646
- ['/gdc/domains/{id}/clients?segment={segment}', %r{/gdc/domains/[\w]+/clients\?segment=[\w-]+}],
647
- ['/gdc/domains/{id}/', %r{/gdc/domains/[\w]+/}],
651
+ %r{/gdc/domains/[\w-]+/segments/[\w-]+/synchronizeClients/results/[\w]+/details/\?offset=[\d]+&limit=[\d]+}],
652
+ ['/gdc/domains/{id}/segments/{segment}/synchronizeClients/results/{result}',
653
+ %r{/gdc/domains/[\w-]+/segments/[\w-]+/synchronizeClients/results/[\w]+}],
654
+ ['/gdc/domains/{id}/segments/{segment}/', %r{/gdc/domains/[\w-]+/segments/[\w-]+/}],
655
+ ['/gdc/domains/{id}/segments/{segment}', %r{/gdc/domains/[\w-]+/segments/[\w-]+}],
656
+ ['/gdc/domains/{id}/clients?segment={segment}', %r{/gdc/domains/[\w-]+/clients\?segment=[\w-]+}],
657
+ ['/gdc/domains/{id}/clients/{client_id}/settings/lcm.title', %r{/gdc/domains/[\w-]+/clients/[\w-]+/settings/lcm.title}],
658
+ ['/gdc/domains/{id}/clients/{client_id}/settings/lcm.token', %r{/gdc/domains/[\w-]+/clients/[\w-]+/settings/lcm.token}],
659
+ ['/gdc/domains/{id}/clients/{client_id}', %r{/gdc/domains/[\w-]+/clients/[\w-]+}],
660
+ ['/gdc/domains/{id}/provisionClientProjects/results/{result}/details?offset={offset}&limit={limit}',
661
+ %r{/gdc/domains/[\w-]+/provisionClientProjects/results/[\w]+/details/\?offset=[\d]+&limit=[\d]+}],
662
+ ['/gdc/domains/{id}/provisionClientProjects/results/{result}', %r{/gdc/domains/[\w-]+/provisionClientProjects/results/[\w]+}],
663
+ ['/gdc/domains/{id}/provisionClientProjects', %r{/gdc/domains/[\w-]+/provisionClientProjects}],
664
+ ['/gdc/domains/{id}/updateClients', %r{/gdc/domains/[\w-]+/updateClients}],
665
+ ['/gdc/domains/{id}/', %r{/gdc/domains/[\w-]+/}],
648
666
 
649
667
  ['/gdc/exporter/result/{id}/{id}', %r{/gdc/exporter/result/[\w]+/[\w]+}],
650
668
 
669
+ ['/gdc/internal/lcm/domains/{id}/dataproducts/{data_product}/segments/{segment}/syncProcesses/{process}',
670
+ %r{/gdc/internal/lcm/domains/[\w-]+/dataproducts/[\w-]+/segments/[\w-]+/syncProcesses/[\w]+}],
671
+ ['/gdc/internal/lcm/domains/{id}/dataproducts/{data_product}/segments/{segment}/syncProcesses',
672
+ %r{/gdc/internal/lcm/domains/[\w-]+/dataproducts/[\w-]+/segments/[\w-]+/syncProcesses}],
673
+
651
674
  ['/gdc/internal/projects/{id}/objects/setPermissions', %r{/gdc/internal/projects/[\w]+/objects/setPermissions}],
652
675
 
653
676
  ['/gdc/md/{id}/variables/item/{id}', %r{/gdc/md/[\w]+/variables/item/[\d]+}],
@@ -18,25 +18,6 @@ module GoodData
18
18
  attr_accessor :objects
19
19
  attr_accessor :resources
20
20
 
21
- #################################
22
- # Class methods
23
- #################################
24
- class << self
25
- # Gets list of all GoodData::Rest::Object subclasses
26
- #
27
- # @return [Array<GoodData::Rest::Object>] Subclasses of GoodData::Rest::Object
28
- def objects
29
- ObjectSpace.each_object(Class).select { |klass| klass < GoodData::Rest::Object }
30
- end
31
-
32
- # Gets list of all GoodData::Rest::Resource subclasses
33
- #
34
- # @return [Array<GoodData::Rest::Resource>] Subclasses of GoodData::Rest::Resource
35
- def resources
36
- ObjectSpace.each_object(Class).select { |klass| klass < GoodData::Rest::Resource }
37
- end
38
- end
39
-
40
21
  # Initializes instance of factory
41
22
  #
42
23
  # @param connection [GoodData::Rest::Connection] Connection used by factory
@@ -48,12 +29,6 @@ module GoodData
48
29
 
49
30
  # Set connection used by factory
50
31
  @connection = @client.connection
51
-
52
- # Initialize internal factory map of GoodData::Rest::Object instances
53
- @objects = ObjectFactory.objects
54
-
55
- # Initialize internal factory map of GoodData::Rest::Resource instances
56
- @resources = ObjectFactory.resources
57
32
  end
58
33
 
59
34
  def create(type, data = {}, opts = {})
@@ -6,7 +6,7 @@
6
6
 
7
7
  # GoodData Module
8
8
  module GoodData
9
- VERSION = '0.6.53'
9
+ VERSION = '0.6.54'
10
10
 
11
11
  class << self
12
12
  # Version
@@ -22,11 +22,11 @@
22
22
  },
23
23
  {
24
24
  "type": "attribute",
25
- "id" : "some_attr_id"
25
+ "id" : "some_attr_id(hello)"
26
26
  },
27
27
  {
28
28
  "type": "label",
29
- "id" : "some_attr_label_id",
29
+ "id" : "some_label_id",
30
30
  "reference": "some_attr_id",
31
31
  "name": "email",
32
32
  "gd_data_type": "VARCHAR(128)",
@@ -30,7 +30,7 @@
30
30
  "id" : "some_attr_label_id",
31
31
  "reference": "some_attr_id",
32
32
  "column_name": "repo_name",
33
- "gd_data_type": "VARCHAR(128)",
33
+ "gd_data_type": "VARCHAR(10000)",
34
34
  "title": "Repository Name"
35
35
  }
36
36
  ]
@@ -0,0 +1,7 @@
1
+ client_id,param_name,param_value,schedule_title
2
+ client_1,MODE,mode_a,rollout
3
+ client_1,MODE,mode_e,
4
+ client_2,MODE,mode_b,provisioning
5
+ client_1,MODE,mode_c,release
6
+ client_1,MODE,mode_x,
7
+ ,MODE,mode_all,
@@ -1,3 +1,3 @@
1
- client_id,segment_id,project_title
2
- client_foo,segment_foo,project_foo
3
- client_bar,segment_bar,project_bar
1
+ client_id,segment_id,project_title,project_id
2
+ client_foo,segment_foo,project_foo,123456
3
+ client_bar,segment_bar,project_bar,
@@ -7,15 +7,15 @@
7
7
  module GoodData
8
8
  module Environment
9
9
  module ConnectionHelper
10
- encrypted_token = 'YC+foKO2M8rIfB5gxF/sVvop5dRA7d/zLO/zzUlBr9ZimnoYe' \
11
- 'LFyAqU20U4k\ncRYb\n'
10
+ encrypted_token = "YC+foKO2M8rIfB5gxF/sVvop5dRA7d/zLO/zzUlBr9ZimnoYe" \
11
+ "LFyAqU20U4k\ncRYb\n"
12
12
  key = ENV['GD_SPEC_PASSWORD'] || ENV['BIA_ENCRYPTION_KEY']
13
13
  token = GoodData::Helpers.decrypt(encrypted_token, key)
14
14
  set_const :GD_PROJECT_TOKEN, token
15
15
  set_const :DEFAULT_DOMAIN, 'staging-lcm-prod'
16
16
  set_const :DEFAULT_SERVER, 'https://staging-lcm-prod.intgdc.com'
17
17
  set_const :DEFAULT_USER_URL, '/gdc/account/profile/e306b64fb4178785c9cf29c29b5e498a'
18
- set_const :STAGING_URI, 'https://ea-di.staging.intgdc.com/uploads/'
18
+ set_const :STAGING_URI, 'https://staging-lcm-prod.intgdc.com/gdc/uploads/'
19
19
  end
20
20
 
21
21
  module ProcessHelper
@@ -9,16 +9,6 @@ require 'gooddata'
9
9
  describe GoodData::AdsOutputStage, :constraint => 'slow' do
10
10
  before(:all) do
11
11
  @client = ConnectionHelper.create_default_connection
12
-
13
- # try to delete all posible ads
14
- GoodData::DataWarehouse.all.map do |ads|
15
- begin
16
- ads.delete
17
- rescue => e
18
- puts "Cannot delete ads #{ads.id}. Reason: #{e.message}"
19
- end
20
- end
21
-
22
12
  @ads = GoodData::DataWarehouse.create(client: @client, title: 'Test ADS', auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
23
13
  @project = @client.create_project(title: 'Test project', auth_token: ConnectionHelper::GD_PROJECT_TOKEN, environment: ProjectHelper::ENVIRONMENT)
24
14
  end
@@ -38,7 +38,7 @@ describe GoodData::Client do
38
38
  it 'Returns specific tenant when schedule ID passed' do
39
39
  client = @segment.clients(@segment_client)
40
40
  expect(client).to be_an_instance_of(GoodData::Client)
41
- expect(client.uri).to eq @segment_client.uri
41
+ expect(client.client_id).to eq @segment_client.client_id
42
42
  end
43
43
 
44
44
  after(:all) do
@@ -40,6 +40,19 @@ describe "Swapping a date dimension and exchanging all attributes/elements", :co
40
40
  @client.disconnect
41
41
  end
42
42
 
43
+ it 'should not get error when execute report with timestamp' do
44
+ metric = @project.attributes('created_on.date').create_metric(title: 'test_metric')
45
+ metric.save
46
+
47
+ report = @project.create_report(
48
+ left: metric,
49
+ top: ['created_on.quarter'],
50
+ filters: [['created_on.year', 2015, 2016]],
51
+ title: 'test_report'
52
+ )
53
+ report.execute(time: Time.now)
54
+ end
55
+
43
56
  it "should swap the dimension, exchange all stuffs and not break anything" do
44
57
  # WE have 2 date dims
45
58
  expect(@blueprint.date_dimensions.map(&:id)).to eq %w(created_on created_on_2)
@@ -272,10 +272,10 @@ describe "Full process and schedule exercise", :constraint => 'slow' do
272
272
 
273
273
  it 'should be able to deploy from app_store' do
274
274
  begin
275
- process = @project.deploy_process('https://github.com/gooddata/app_store/tree/sfdc_downloader_brick-v0.0.4/apps/ads_integrator_brick')
275
+ process = @project.deploy_process('${PRODUCTION_APPSTORE}:branch/master:/apps/hello_world_brick', name: 'hello_world_brick')
276
276
  expect(process.class).to eq GoodData::Process
277
277
  ensure
278
- process.delete
278
+ process.delete if process
279
279
  end
280
280
  end
281
281
 
@@ -0,0 +1,16 @@
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/client'
8
+ require 'gooddata/models/model'
9
+
10
+ describe GoodData::Helpers do
11
+ describe '#find_goodfile' do
12
+ it 'works' do
13
+ GoodData::Helpers.find_goodfile.should_not be_nil
14
+ end
15
+ end
16
+ end
@@ -37,8 +37,18 @@ describe GoodData::LCM, :constraint => 'slow' do
37
37
  end
38
38
 
39
39
  it 'should be able to transfer color palette' do
40
- @source_project.create_custom_color_palette([{ r: 155, g: 255, b: 0 }])
40
+ color_palettes = [
41
+ {
42
+ guid: 'hello',
43
+ fill: {
44
+ r: 155,
45
+ g: 255,
46
+ b: 0
47
+ }
48
+ }
49
+ ]
50
+ @source_project.create_custom_color_palette(color_palettes)
41
51
  GoodData::Project.transfer_color_palette(@source_project, @target_project)
42
- expect(@target_project.current_color_palette.colors).to eq [{ r: 155, g: 255, b: 0 }]
52
+ expect(@target_project.current_color_palette.colors).to eq color_palettes.map { |color| GoodData::Helpers.stringify_keys(color) }
43
53
  end
44
54
  end
@@ -0,0 +1,44 @@
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/mixins/md_id_to_uri'
8
+
9
+ describe GoodData::Mixin::MdIdToUri do
10
+ before :each do
11
+ @client = ConnectionHelper.create_default_connection
12
+ project = ProjectHelper.get_default_project(client: @client)
13
+
14
+ class SomeTestClass
15
+ extend GoodData::Mixin::MdIdToUri
16
+ end
17
+
18
+ @opts = { client: @client, project: project }
19
+ end
20
+
21
+ after(:each) do
22
+ @client.disconnect
23
+ end
24
+
25
+ it 'should throw BadRequest for -1' do
26
+ expect do
27
+ SomeTestClass.identifier_to_uri(@opts, '-1')
28
+ end.to raise_error(RestClient::BadRequest) { |error|
29
+ error.response.should match(/does not match with value '-1'/)
30
+ }
31
+ end
32
+
33
+ it 'should return nil for unknown id' do
34
+ expect(SomeTestClass.identifier_to_uri(@opts, '0')).to be_nil
35
+ end
36
+
37
+ it 'should get json containing correct id' do
38
+ facts = GoodData::Fact.all(@opts)
39
+ fact = facts.to_a.first
40
+ uri = SomeTestClass.identifier_to_uri(@opts, fact.identifier)
41
+ res = @client.get(uri)
42
+ expect(res['fact']['meta']['identifier']).to eq fact.identifier
43
+ end
44
+ end
@@ -0,0 +1,71 @@
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/models/segment'
8
+ require 'securerandom'
9
+
10
+ describe GoodData::DataProduct do
11
+ before(:all) do
12
+ @client = ConnectionHelper.create_default_connection
13
+ @domain = @client.domain(ConnectionHelper::DEFAULT_DOMAIN)
14
+ end
15
+
16
+ before(:each) do
17
+ @uuid = SecureRandom.uuid
18
+ @data_product_id = "data-product-#{@uuid}"
19
+ @data_product = @domain.create_data_product(id: @data_product_id)
20
+ end
21
+
22
+ after(:each) do
23
+ @data_product && @data_product.delete(force: true)
24
+ end
25
+
26
+ after(:all) do
27
+ @client.disconnect
28
+ end
29
+
30
+ describe '#[]' do
31
+ it 'Returns all data products when :all passed' do
32
+ res = @domain.data_products
33
+ expect(res).to be_an_instance_of(Array)
34
+ end
35
+
36
+ it 'Returns specific data product when data product ID passed' do
37
+ data_product = @domain.data_products(@data_product_id)
38
+ expect(data_product.uri).to eq @data_product.uri
39
+ expect(data_product).to be_an_instance_of(GoodData::DataProduct)
40
+ end
41
+ end
42
+
43
+ describe '#delete' do
44
+ it 'Deletes particular data product' do
45
+ old_count = @domain.data_products.count
46
+ @data_product.delete
47
+ expect(@domain.data_products.length).to eq(old_count - 1)
48
+ # prevent delete attempt in the after hook
49
+ @data_product = nil
50
+ end
51
+ end
52
+
53
+ describe '#save' do
54
+ it 'can update a data product id' do
55
+ @data_product.data_product_id = 'different_id'
56
+ @data_product.save
57
+ end
58
+ end
59
+
60
+ describe '#create_segment' do
61
+ before do
62
+ @master_project = @client.create_project(title: "Test MASTER project for #{@uuid}", auth_token: ConnectionHelper::GD_PROJECT_TOKEN)
63
+ end
64
+
65
+ it 'creates a segment' do
66
+ segment = @data_product.create_segment(segment_id: "test-segment-#{@uuid}", master_project: @master_project)
67
+ expect(segment).to be_instance_of GoodData::Segment
68
+ expect(segment.data_product.data_product_id).to eq(@data_product_id)
69
+ end
70
+ end
71
+ end