Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/usage_data_spec.rb')
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb651
1 files changed, 333 insertions, 318 deletions
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index bca2f49eb33..3be8a770b2b 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -13,8 +13,14 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
describe '.uncached_data' do
describe '.usage_activity_by_stage' do
it 'includes usage_activity_by_stage data' do
- expect(described_class.uncached_data).to include(:usage_activity_by_stage)
- expect(described_class.uncached_data).to include(:usage_activity_by_stage_monthly)
+ uncached_data = described_class.uncached_data
+
+ expect(uncached_data).to include(:usage_activity_by_stage)
+ expect(uncached_data).to include(:usage_activity_by_stage_monthly)
+ expect(uncached_data[:usage_activity_by_stage])
+ .to include(:configure, :create, :manage, :monitor, :plan, :release, :verify)
+ expect(uncached_data[:usage_activity_by_stage_monthly])
+ .to include(:configure, :create, :manage, :monitor, :plan, :release, :verify)
end
it 'clears memoized values' do
@@ -30,269 +36,269 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
described_class.uncached_data
end
- context 'for configure' do
- it 'includes accurate usage_activity_by_stage data' do
- for_defined_days_back do
- user = create(:user)
- cluster = create(:cluster, user: user)
- create(:clusters_applications_cert_manager, :installed, cluster: cluster)
- create(:clusters_applications_helm, :installed, cluster: cluster)
- create(:clusters_applications_ingress, :installed, cluster: cluster)
- create(:clusters_applications_knative, :installed, cluster: cluster)
- create(:cluster, :disabled, user: user)
- create(:cluster_provider_gcp, :created)
- create(:cluster_provider_aws, :created)
- create(:cluster_platform_kubernetes)
- create(:cluster, :group, :disabled, user: user)
- create(:cluster, :group, user: user)
- create(:cluster, :instance, :disabled, :production_environment)
- create(:cluster, :instance, :production_environment)
- create(:cluster, :management_project)
- end
+ it 'merge_requests_users is included only in montly counters' do
+ uncached_data = described_class.uncached_data
- expect(described_class.uncached_data[:usage_activity_by_stage][:configure]).to include(
- clusters_applications_cert_managers: 2,
- clusters_applications_helm: 2,
- clusters_applications_ingress: 2,
- clusters_applications_knative: 2,
- clusters_management_project: 2,
- clusters_disabled: 4,
- clusters_enabled: 12,
- clusters_platforms_gke: 2,
- clusters_platforms_eks: 2,
- clusters_platforms_user: 2,
- instance_clusters_disabled: 2,
- instance_clusters_enabled: 2,
- group_clusters_disabled: 2,
- group_clusters_enabled: 2,
- project_clusters_disabled: 2,
- project_clusters_enabled: 10
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:configure]).to include(
- clusters_applications_cert_managers: 1,
- clusters_applications_helm: 1,
- clusters_applications_ingress: 1,
- clusters_applications_knative: 1,
- clusters_management_project: 1,
- clusters_disabled: 2,
- clusters_enabled: 6,
- clusters_platforms_gke: 1,
- clusters_platforms_eks: 1,
- clusters_platforms_user: 1,
- instance_clusters_disabled: 1,
- instance_clusters_enabled: 1,
- group_clusters_disabled: 1,
- group_clusters_enabled: 1,
- project_clusters_disabled: 1,
- project_clusters_enabled: 5
- )
- end
+ expect(uncached_data[:usage_activity_by_stage][:create])
+ .not_to include(:merge_requests_users)
+ expect(uncached_data[:usage_activity_by_stage_monthly][:create])
+ .to include(:merge_requests_users)
end
+ end
- context 'for create' do
- it 'include usage_activity_by_stage data' do
- expect(described_class.uncached_data[:usage_activity_by_stage][:create])
- .not_to include(
- :merge_requests_users
- )
- end
-
- it 'includes monthly usage_activity_by_stage data' do
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:create])
- .to include(
- :merge_requests_users
- )
- end
-
- it 'includes accurate usage_activity_by_stage data' do
- for_defined_days_back do
- user = create(:user)
- project = create(:project, :repository_private,
- :test_repo, :remote_mirror, creator: user)
- create(:merge_request, source_project: project)
- create(:deploy_key, user: user)
- create(:key, user: user)
- create(:project, creator: user, disable_overriding_approvers_per_merge_request: true)
- create(:project, creator: user, disable_overriding_approvers_per_merge_request: false)
- create(:remote_mirror, project: project)
- create(:snippet, author: user)
- end
-
- expect(described_class.uncached_data[:usage_activity_by_stage][:create]).to include(
- deploy_keys: 2,
- keys: 2,
- merge_requests: 2,
- projects_with_disable_overriding_approvers_per_merge_request: 2,
- projects_without_disable_overriding_approvers_per_merge_request: 4,
- remote_mirrors: 2,
- snippets: 2
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:create]).to include(
- deploy_keys: 1,
- keys: 1,
- merge_requests: 1,
- projects_with_disable_overriding_approvers_per_merge_request: 1,
- projects_without_disable_overriding_approvers_per_merge_request: 2,
- remote_mirrors: 1,
- snippets: 1
- )
- end
+ it 'ensures recorded_at is set before any other usage data calculation' do
+ %i(alt_usage_data redis_usage_data distinct_count count).each do |method|
+ expect(described_class).not_to receive(method)
end
+ expect(described_class).to receive(:recorded_at).and_raise(Exception.new('Stopped calculating recorded_at'))
- context 'for manage' do
- it 'includes accurate usage_activity_by_stage data' do
- stub_config(
- omniauth:
- { providers: omniauth_providers }
- )
-
- for_defined_days_back do
- user = create(:user)
- create(:event, author: user)
- create(:group_member, user: user)
- end
+ expect { described_class.uncached_data }.to raise_error('Stopped calculating recorded_at')
+ end
+ end
- expect(described_class.uncached_data[:usage_activity_by_stage][:manage]).to include(
- events: 2,
- groups: 2,
- users_created: Gitlab.ee? ? 6 : 5,
- omniauth_providers: ['google_oauth2']
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:manage]).to include(
- events: 1,
- groups: 1,
- users_created: Gitlab.ee? ? 4 : 3,
- omniauth_providers: ['google_oauth2']
- )
- end
+ describe '.usage_activity_by_stage_configure' do
+ it 'includes accurate usage_activity_by_stage data' do
+ for_defined_days_back do
+ user = create(:user)
+ cluster = create(:cluster, user: user)
+ create(:clusters_applications_cert_manager, :installed, cluster: cluster)
+ create(:clusters_applications_helm, :installed, cluster: cluster)
+ create(:clusters_applications_ingress, :installed, cluster: cluster)
+ create(:clusters_applications_knative, :installed, cluster: cluster)
+ create(:cluster, :disabled, user: user)
+ create(:cluster_provider_gcp, :created)
+ create(:cluster_provider_aws, :created)
+ create(:cluster_platform_kubernetes)
+ create(:cluster, :group, :disabled, user: user)
+ create(:cluster, :group, user: user)
+ create(:cluster, :instance, :disabled, :production_environment)
+ create(:cluster, :instance, :production_environment)
+ create(:cluster, :management_project)
+ end
+
+ expect(described_class.usage_activity_by_stage_configure({})).to include(
+ clusters_applications_cert_managers: 2,
+ clusters_applications_helm: 2,
+ clusters_applications_ingress: 2,
+ clusters_applications_knative: 2,
+ clusters_management_project: 2,
+ clusters_disabled: 4,
+ clusters_enabled: 12,
+ clusters_platforms_gke: 2,
+ clusters_platforms_eks: 2,
+ clusters_platforms_user: 2,
+ instance_clusters_disabled: 2,
+ instance_clusters_enabled: 2,
+ group_clusters_disabled: 2,
+ group_clusters_enabled: 2,
+ project_clusters_disabled: 2,
+ project_clusters_enabled: 10
+ )
+ expect(described_class.usage_activity_by_stage_configure(described_class.last_28_days_time_period)).to include(
+ clusters_applications_cert_managers: 1,
+ clusters_applications_helm: 1,
+ clusters_applications_ingress: 1,
+ clusters_applications_knative: 1,
+ clusters_management_project: 1,
+ clusters_disabled: 2,
+ clusters_enabled: 6,
+ clusters_platforms_gke: 1,
+ clusters_platforms_eks: 1,
+ clusters_platforms_user: 1,
+ instance_clusters_disabled: 1,
+ instance_clusters_enabled: 1,
+ group_clusters_disabled: 1,
+ group_clusters_enabled: 1,
+ project_clusters_disabled: 1,
+ project_clusters_enabled: 5
+ )
+ end
+ end
- def omniauth_providers
- [
- OpenStruct.new(name: 'google_oauth2'),
- OpenStruct.new(name: 'ldapmain'),
- OpenStruct.new(name: 'group_saml')
- ]
- end
- end
+ describe 'usage_activity_by_stage_create' do
+ it 'includes accurate usage_activity_by_stage data' do
+ for_defined_days_back do
+ user = create(:user)
+ project = create(:project, :repository_private,
+ :test_repo, :remote_mirror, creator: user)
+ create(:merge_request, source_project: project)
+ create(:deploy_key, user: user)
+ create(:key, user: user)
+ create(:project, creator: user, disable_overriding_approvers_per_merge_request: true)
+ create(:project, creator: user, disable_overriding_approvers_per_merge_request: false)
+ create(:remote_mirror, project: project)
+ create(:snippet, author: user)
+ end
+
+ expect(described_class.usage_activity_by_stage_create({})).to include(
+ deploy_keys: 2,
+ keys: 2,
+ merge_requests: 2,
+ projects_with_disable_overriding_approvers_per_merge_request: 2,
+ projects_without_disable_overriding_approvers_per_merge_request: 4,
+ remote_mirrors: 2,
+ snippets: 2
+ )
+ expect(described_class.usage_activity_by_stage_create(described_class.last_28_days_time_period)).to include(
+ deploy_keys: 1,
+ keys: 1,
+ merge_requests: 1,
+ projects_with_disable_overriding_approvers_per_merge_request: 1,
+ projects_without_disable_overriding_approvers_per_merge_request: 2,
+ remote_mirrors: 1,
+ snippets: 1
+ )
+ end
+ end
- context 'for monitor' do
- it 'includes accurate usage_activity_by_stage data' do
- for_defined_days_back do
- user = create(:user, dashboard: 'operations')
- cluster = create(:cluster, user: user)
- create(:project, creator: user)
- create(:clusters_applications_prometheus, :installed, cluster: cluster)
- end
+ describe 'usage_activity_by_stage_manage' do
+ it 'includes accurate usage_activity_by_stage data' do
+ stub_config(
+ omniauth:
+ { providers: omniauth_providers }
+ )
- expect(described_class.uncached_data[:usage_activity_by_stage][:monitor]).to include(
- clusters: 2,
- clusters_applications_prometheus: 2,
- operations_dashboard_default_dashboard: 2
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:monitor]).to include(
- clusters: 1,
- clusters_applications_prometheus: 1,
- operations_dashboard_default_dashboard: 1
- )
- end
+ for_defined_days_back do
+ user = create(:user)
+ create(:event, author: user)
+ create(:group_member, user: user)
end
- context 'for plan' do
- it 'includes accurate usage_activity_by_stage data' do
- for_defined_days_back do
- user = create(:user)
- project = create(:project, creator: user)
- issue = create(:issue, project: project, author: user)
- create(:note, project: project, noteable: issue, author: user)
- create(:todo, project: project, target: issue, author: user)
- end
-
- expect(described_class.uncached_data[:usage_activity_by_stage][:plan]).to include(
- issues: 2,
- notes: 2,
- projects: 2,
- todos: 2
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:plan]).to include(
- issues: 1,
- notes: 1,
- projects: 1,
- todos: 1
- )
- end
- end
+ expect(described_class.usage_activity_by_stage_manage({})).to include(
+ events: 2,
+ groups: 2,
+ users_created: 4,
+ omniauth_providers: ['google_oauth2']
+ )
+ expect(described_class.usage_activity_by_stage_manage(described_class.last_28_days_time_period)).to include(
+ events: 1,
+ groups: 1,
+ users_created: 2,
+ omniauth_providers: ['google_oauth2']
+ )
+ end
- context 'for release' do
- it 'includes accurate usage_activity_by_stage data' do
- for_defined_days_back do
- user = create(:user)
- create(:deployment, :failed, user: user)
- create(:release, author: user)
- create(:deployment, :success, user: user)
- end
+ def omniauth_providers
+ [
+ OpenStruct.new(name: 'google_oauth2'),
+ OpenStruct.new(name: 'ldapmain'),
+ OpenStruct.new(name: 'group_saml')
+ ]
+ end
+ end
- expect(described_class.uncached_data[:usage_activity_by_stage][:release]).to include(
- deployments: 2,
- failed_deployments: 2,
- releases: 2,
- successful_deployments: 2
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:release]).to include(
- deployments: 1,
- failed_deployments: 1,
- releases: 1,
- successful_deployments: 1
- )
- end
+ describe 'usage_activity_by_stage_monitor' do
+ it 'includes accurate usage_activity_by_stage data' do
+ for_defined_days_back do
+ user = create(:user, dashboard: 'operations')
+ cluster = create(:cluster, user: user)
+ create(:project, creator: user)
+ create(:clusters_applications_prometheus, :installed, cluster: cluster)
end
- context 'for verify' do
- it 'includes accurate usage_activity_by_stage data' do
- for_defined_days_back do
- user = create(:user)
- create(:ci_build, user: user)
- create(:ci_empty_pipeline, source: :external, user: user)
- create(:ci_empty_pipeline, user: user)
- create(:ci_pipeline, :auto_devops_source, user: user)
- create(:ci_pipeline, :repository_source, user: user)
- create(:ci_pipeline_schedule, owner: user)
- create(:ci_trigger, owner: user)
- create(:clusters_applications_runner, :installed)
- end
+ expect(described_class.usage_activity_by_stage_monitor({})).to include(
+ clusters: 2,
+ clusters_applications_prometheus: 2,
+ operations_dashboard_default_dashboard: 2
+ )
+ expect(described_class.usage_activity_by_stage_monitor(described_class.last_28_days_time_period)).to include(
+ clusters: 1,
+ clusters_applications_prometheus: 1,
+ operations_dashboard_default_dashboard: 1
+ )
+ end
+ end
- expect(described_class.uncached_data[:usage_activity_by_stage][:verify]).to include(
- ci_builds: 2,
- ci_external_pipelines: 2,
- ci_internal_pipelines: 2,
- ci_pipeline_config_auto_devops: 2,
- ci_pipeline_config_repository: 2,
- ci_pipeline_schedules: 2,
- ci_pipelines: 2,
- ci_triggers: 2,
- clusters_applications_runner: 2
- )
- expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:verify]).to include(
- ci_builds: 1,
- ci_external_pipelines: 1,
- ci_internal_pipelines: 1,
- ci_pipeline_config_auto_devops: 1,
- ci_pipeline_config_repository: 1,
- ci_pipeline_schedules: 1,
- ci_pipelines: 1,
- ci_triggers: 1,
- clusters_applications_runner: 1
- )
- end
- end
+ describe 'usage_activity_by_stage_plan' do
+ it 'includes accurate usage_activity_by_stage data' do
+ for_defined_days_back do
+ user = create(:user)
+ project = create(:project, creator: user)
+ issue = create(:issue, project: project, author: user)
+ create(:issue, project: project, author: User.support_bot)
+ create(:note, project: project, noteable: issue, author: user)
+ create(:todo, project: project, target: issue, author: user)
+ end
+
+ expect(described_class.usage_activity_by_stage_plan({})).to include(
+ issues: 3,
+ notes: 2,
+ projects: 2,
+ todos: 2,
+ service_desk_enabled_projects: 2,
+ service_desk_issues: 2
+ )
+ expect(described_class.usage_activity_by_stage_plan(described_class.last_28_days_time_period)).to include(
+ issues: 2,
+ notes: 1,
+ projects: 1,
+ todos: 1,
+ service_desk_enabled_projects: 1,
+ service_desk_issues: 1
+ )
end
+ end
- it 'ensures recorded_at is set before any other usage data calculation' do
- %i(alt_usage_data redis_usage_data distinct_count count).each do |method|
- expect(described_class).not_to receive(method)
+ describe 'usage_activity_by_stage_release' do
+ it 'includes accurate usage_activity_by_stage data' do
+ for_defined_days_back do
+ user = create(:user)
+ create(:deployment, :failed, user: user)
+ create(:release, author: user)
+ create(:deployment, :success, user: user)
end
- expect(described_class).to receive(:recorded_at).and_raise(Exception.new('Stopped calculating recorded_at'))
- expect { described_class.uncached_data }.to raise_error('Stopped calculating recorded_at')
+ expect(described_class.usage_activity_by_stage_release({})).to include(
+ deployments: 2,
+ failed_deployments: 2,
+ releases: 2,
+ successful_deployments: 2
+ )
+ expect(described_class.usage_activity_by_stage_release(described_class.last_28_days_time_period)).to include(
+ deployments: 1,
+ failed_deployments: 1,
+ releases: 1,
+ successful_deployments: 1
+ )
+ end
+ end
+
+ describe 'usage_activity_by_stage_verify' do
+ it 'includes accurate usage_activity_by_stage data' do
+ for_defined_days_back do
+ user = create(:user)
+ create(:ci_build, user: user)
+ create(:ci_empty_pipeline, source: :external, user: user)
+ create(:ci_empty_pipeline, user: user)
+ create(:ci_pipeline, :auto_devops_source, user: user)
+ create(:ci_pipeline, :repository_source, user: user)
+ create(:ci_pipeline_schedule, owner: user)
+ create(:ci_trigger, owner: user)
+ create(:clusters_applications_runner, :installed)
+ end
+
+ expect(described_class.usage_activity_by_stage_verify({})).to include(
+ ci_builds: 2,
+ ci_external_pipelines: 2,
+ ci_internal_pipelines: 2,
+ ci_pipeline_config_auto_devops: 2,
+ ci_pipeline_config_repository: 2,
+ ci_pipeline_schedules: 2,
+ ci_pipelines: 2,
+ ci_triggers: 2,
+ clusters_applications_runner: 2
+ )
+ expect(described_class.usage_activity_by_stage_verify(described_class.last_28_days_time_period)).to include(
+ ci_builds: 1,
+ ci_external_pipelines: 1,
+ ci_internal_pipelines: 1,
+ ci_pipeline_config_auto_devops: 1,
+ ci_pipeline_config_repository: 1,
+ ci_pipeline_schedules: 1,
+ ci_pipelines: 1,
+ ci_triggers: 1,
+ clusters_applications_runner: 1
+ )
end
end
@@ -338,13 +344,18 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(count_data[:projects_slack_active]).to eq(2)
expect(count_data[:projects_slack_slash_commands_active]).to eq(1)
expect(count_data[:projects_custom_issue_tracker_active]).to eq(1)
- expect(count_data[:projects_mattermost_active]).to eq(0)
+ expect(count_data[:projects_mattermost_active]).to eq(1)
+ expect(count_data[:templates_mattermost_active]).to eq(1)
+ expect(count_data[:instances_mattermost_active]).to eq(1)
+ expect(count_data[:projects_inheriting_instance_mattermost_active]).to eq(1)
expect(count_data[:projects_with_repositories_enabled]).to eq(3)
expect(count_data[:projects_with_error_tracking_enabled]).to eq(1)
expect(count_data[:projects_with_alerts_service_enabled]).to eq(1)
expect(count_data[:projects_with_prometheus_alerts]).to eq(2)
expect(count_data[:projects_with_terraform_reports]).to eq(2)
expect(count_data[:projects_with_terraform_states]).to eq(2)
+ expect(count_data[:protected_branches]).to eq(2)
+ expect(count_data[:protected_branches_except_default]).to eq(1)
expect(count_data[:terraform_reports]).to eq(6)
expect(count_data[:terraform_states]).to eq(3)
expect(count_data[:issues_created_from_gitlab_error_tracking_ui]).to eq(1)
@@ -574,9 +585,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
subject { described_class.components_usage_data }
it 'gathers basic components usage data' do
- stub_runtime(:puma)
+ stub_application_setting(container_registry_vendor: 'gitlab', container_registry_version: 'x.y.z')
- expect(subject[:app_server][:type]).to eq('puma')
expect(subject[:gitlab_pages][:enabled]).to eq(Gitlab.config.pages.enabled)
expect(subject[:gitlab_pages][:version]).to eq(Gitlab::Pages::VERSION)
expect(subject[:git][:version]).to eq(Gitlab::Git.version)
@@ -587,32 +597,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(subject[:gitaly][:clusters]).to be >= 0
expect(subject[:gitaly][:filesystems]).to be_an(Array)
expect(subject[:gitaly][:filesystems].first).to be_a(String)
- end
-
- def stub_runtime(runtime)
- allow(Gitlab::Runtime).to receive(:identify).and_return(runtime)
- end
- end
-
- describe '.app_server_type' do
- subject { described_class.app_server_type }
-
- it 'successfully identifies runtime and returns the identifier' do
- expect(Gitlab::Runtime).to receive(:identify).and_return(:runtime_identifier)
-
- is_expected.to eq('runtime_identifier')
- end
-
- context 'when runtime is not identified' do
- let(:exception) { Gitlab::Runtime::IdentificationError.new('exception message from runtime identify') }
-
- it 'logs the exception and returns unknown app server type' do
- expect(Gitlab::Runtime).to receive(:identify).and_raise(exception)
-
- expect(Gitlab::AppLogger).to receive(:error).with(exception.message)
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(exception)
- expect(subject).to eq('unknown_app_server_type')
- end
+ expect(subject[:container_registry_server][:vendor]).to eq('gitlab')
+ expect(subject[:container_registry_server][:version]).to eq('x.y.z')
end
end
@@ -926,45 +912,29 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
let(:time) { Time.zone.now }
before do
- stub_feature_flags(Gitlab::UsageDataCounters::TrackUniqueActions::FEATURE_FLAG => feature_flag)
- end
-
- context 'when the feature flag is enabled' do
- let(:feature_flag) { true }
-
- before do
- counter = Gitlab::UsageDataCounters::TrackUniqueActions
- project = Event::TARGET_TYPES[:project]
- wiki = Event::TARGET_TYPES[:wiki]
- design = Event::TARGET_TYPES[:design]
-
- counter.track_action(event_action: :pushed, event_target: project, author_id: 1)
- counter.track_action(event_action: :pushed, event_target: project, author_id: 1)
- counter.track_action(event_action: :pushed, event_target: project, author_id: 2)
- counter.track_action(event_action: :pushed, event_target: project, author_id: 3)
- counter.track_action(event_action: :pushed, event_target: project, author_id: 4, time: time - 3.days)
- counter.track_action(event_action: :created, event_target: project, author_id: 5, time: time - 3.days)
- counter.track_action(event_action: :created, event_target: wiki, author_id: 3)
- counter.track_action(event_action: :created, event_target: design, author_id: 3)
- end
-
- it 'returns the distinct count of user actions within the specified time period' do
- expect(described_class.action_monthly_active_users(time_period)).to eq(
- {
- action_monthly_active_users_design_management: 1,
- action_monthly_active_users_project_repo: 3,
- action_monthly_active_users_wiki_repo: 1
- }
- )
- end
- end
-
- context 'when the feature flag is disabled' do
- let(:feature_flag) { false }
-
- it 'returns an empty hash' do
- expect(described_class.action_monthly_active_users(time_period)).to eq({})
- end
+ counter = Gitlab::UsageDataCounters::TrackUniqueActions
+ project = Event::TARGET_TYPES[:project]
+ wiki = Event::TARGET_TYPES[:wiki]
+ design = Event::TARGET_TYPES[:design]
+
+ counter.track_event(event_action: :pushed, event_target: project, author_id: 1)
+ counter.track_event(event_action: :pushed, event_target: project, author_id: 1)
+ counter.track_event(event_action: :pushed, event_target: project, author_id: 2)
+ counter.track_event(event_action: :pushed, event_target: project, author_id: 3)
+ counter.track_event(event_action: :pushed, event_target: project, author_id: 4, time: time - 3.days)
+ counter.track_event(event_action: :created, event_target: project, author_id: 5, time: time - 3.days)
+ counter.track_event(event_action: :created, event_target: wiki, author_id: 3)
+ counter.track_event(event_action: :created, event_target: design, author_id: 3)
+ end
+
+ it 'returns the distinct count of user actions within the specified time period' do
+ expect(described_class.action_monthly_active_users(time_period)).to eq(
+ {
+ action_monthly_active_users_design_management: 1,
+ action_monthly_active_users_project_repo: 3,
+ action_monthly_active_users_wiki_repo: 1
+ }
+ )
end
end
@@ -972,11 +942,12 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
subject { described_class.analytics_unique_visits_data }
it 'returns the number of unique visits to pages with analytics features' do
- ::Gitlab::Analytics::UniqueVisits::TARGET_IDS.each do |target_id|
- expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:weekly_unique_visits_for_target).with(target_id).and_return(123)
+ ::Gitlab::Analytics::UniqueVisits.analytics_ids.each do |target_id|
+ expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:unique_visits_for).with(targets: target_id).and_return(123)
end
- expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:weekly_unique_visits_for_any_target).and_return(543)
+ expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:unique_visits_for).with(targets: :analytics).and_return(543)
+ expect_any_instance_of(::Gitlab::Analytics::UniqueVisits).to receive(:unique_visits_for).with(targets: :analytics, start_date: 4.weeks.ago.to_date, end_date: Date.current).and_return(987)
expect(subject).to eq({
analytics_unique_visits: {
@@ -991,12 +962,56 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
'p_analytics_insights' => 123,
'p_analytics_issues' => 123,
'p_analytics_repo' => 123,
- 'u_analytics_todos' => 123,
'i_analytics_cohorts' => 123,
'i_analytics_dev_ops_score' => 123,
- 'analytics_unique_visits_for_any_target' => 543
+ 'analytics_unique_visits_for_any_target' => 543,
+ 'analytics_unique_visits_for_any_target_monthly' => 987
+ }
+ })
+ end
+ end
+
+ describe '.compliance_unique_visits_data' do
+ subject { described_class.compliance_unique_visits_data }
+
+ before do
+ described_class.clear_memoization(:unique_visit_service)
+
+ allow_next_instance_of(::Gitlab::Analytics::UniqueVisits) do |instance|
+ ::Gitlab::Analytics::UniqueVisits.compliance_ids.each do |target_id|
+ allow(instance).to receive(:unique_visits_for).with(targets: target_id).and_return(123)
+ end
+
+ allow(instance).to receive(:unique_visits_for).with(targets: :compliance).and_return(543)
+
+ allow(instance).to receive(:unique_visits_for).with(targets: :compliance, start_date: 4.weeks.ago.to_date, end_date: Date.current).and_return(987)
+ end
+ end
+
+ it 'returns the number of unique visits to pages with compliance features' do
+ expect(subject).to eq({
+ compliance_unique_visits: {
+ 'g_compliance_dashboard' => 123,
+ 'g_compliance_audit_events' => 123,
+ 'i_compliance_credential_inventory' => 123,
+ 'i_compliance_audit_events' => 123,
+ 'compliance_unique_visits_for_any_target' => 543,
+ 'compliance_unique_visits_for_any_target_monthly' => 987
}
})
end
end
+
+ describe '.service_desk_counts' do
+ subject { described_class.send(:service_desk_counts) }
+
+ let(:project) { create(:project, :service_desk_enabled) }
+
+ it 'gathers Service Desk data' do
+ create_list(:issue, 2, :confidential, author: User.support_bot, project: project)
+
+ expect(subject).to eq(service_desk_enabled_projects: 1,
+ service_desk_issues: 2)
+ end
+ end
end