diff options
Diffstat (limited to 'spec/lib/gitlab/usage_data_spec.rb')
-rw-r--r-- | spec/lib/gitlab/usage_data_spec.rb | 651 |
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 |