usage_data_spec.rb 10.7 KB
Newer Older
1 2 3
require 'spec_helper'

describe Gitlab::UsageData do
4 5
  let(:projects) { create_list(:project, 3) }
  let!(:board) { create(:board, project: projects[0]) }
6 7

  describe '#data' do
8 9 10
    before do
      create(:jira_service, project: projects[0])
      create(:jira_service, project: projects[1])
11
      create(:jira_service, :jira_cloud_service, project: projects[2])
12 13 14 15
      create(:prometheus_service, project: projects[1])
      create(:service, project: projects[0], type: 'SlackSlashCommandsService', active: true)
      create(:service, project: projects[1], type: 'SlackService', active: true)
      create(:service, project: projects[2], type: 'SlackService', active: true)
L
Logan King 已提交
16 17
      create(:project_error_tracking_setting, project: projects[0])
      create(:project_error_tracking_setting, project: projects[1], enabled: false)
18 19 20 21

      gcp_cluster = create(:cluster, :provided_by_gcp)
      create(:cluster, :provided_by_user)
      create(:cluster, :provided_by_user, :disabled)
22 23 24
      create(:cluster, :group)
      create(:cluster, :group, :disabled)
      create(:cluster, :group, :disabled)
25 26
      create(:clusters_applications_helm, :installed, cluster: gcp_cluster)
      create(:clusters_applications_ingress, :installed, cluster: gcp_cluster)
J
João Cunha 已提交
27
      create(:clusters_applications_cert_manager, :installed, cluster: gcp_cluster)
28 29
      create(:clusters_applications_prometheus, :installed, cluster: gcp_cluster)
      create(:clusters_applications_runner, :installed, cluster: gcp_cluster)
30
      create(:clusters_applications_knative, :installed, cluster: gcp_cluster)
31 32

      ProjectFeature.first.update_attribute('repository_access_level', 0)
33 34
    end

35
    subject { described_class.data }
36 37

    it "gathers usage data" do
J
James Lopez 已提交
38
      expect(subject.keys).to include(*%i(
39 40 41
        active_user_count
        counts
        recorded_at
S
Sean McGivern 已提交
42
        edition
43
        version
44
        installation_type
45
        uuid
S
Sean McGivern 已提交
46
        hostname
47 48 49 50 51 52 53 54
        mattermost_enabled
        signup_enabled
        ldap_enabled
        gravatar_enabled
        omniauth_enabled
        reply_by_email_enabled
        container_registry_enabled
        gitlab_shared_runners_enabled
55 56
        gitlab_pages
        git
57
        gitaly
58
        database
59
        avg_cycle_analytics
R
Ryan Cobb 已提交
60 61
        influxdb_metrics_enabled
        prometheus_metrics_enabled
62
      ))
63

A
Alex Kalderimis 已提交
64
      expect(subject).to include(
M
Mark Chao 已提交
65 66 67
        snippet_create: a_kind_of(Integer),
        snippet_update: a_kind_of(Integer),
        snippet_comment: a_kind_of(Integer),
A
Alex Kalderimis 已提交
68 69 70 71 72
        wiki_pages_create: a_kind_of(Integer),
        wiki_pages_update: a_kind_of(Integer),
        wiki_pages_delete: a_kind_of(Integer),
        web_ide_views: a_kind_of(Integer),
        web_ide_commits: a_kind_of(Integer),
73
        web_ide_merge_requests: a_kind_of(Integer),
I
Igor 已提交
74 75
        navbar_searches: a_kind_of(Integer),
        source_code_pushes: a_kind_of(Integer)
A
Alex Kalderimis 已提交
76
      )
77 78
    end

79
    it "gathers usage counts" do
80
      expected_keys = %i(
81
        assignee_lists
82 83
        boards
        ci_builds
84 85
        ci_internal_pipelines
        ci_external_pipelines
86 87
        ci_pipeline_config_auto_devops
        ci_pipeline_config_repository
88 89
        ci_runners
        ci_triggers
90
        ci_pipeline_schedules
91 92
        auto_devops_enabled
        auto_devops_disabled
93 94
        deploy_keys
        deployments
95 96
        successful_deployments
        failed_deployments
97
        environments
98 99
        clusters
        clusters_enabled
100 101
        project_clusters_enabled
        group_clusters_enabled
102
        clusters_disabled
103 104
        project_clusters_disabled
        group_clusters_disabled
105 106 107 108
        clusters_platforms_gke
        clusters_platforms_user
        clusters_applications_helm
        clusters_applications_ingress
A
Amit Rathi 已提交
109
        clusters_applications_cert_managers
110 111
        clusters_applications_prometheus
        clusters_applications_runner
112
        clusters_applications_knative
113
        in_review_folder
114 115 116
        groups
        issues
        keys
117
        label_lists
118 119 120
        labels
        lfs_objects
        merge_requests
121
        milestone_lists
122 123
        milestones
        notes
124
        pool_repositories
125
        projects
126
        projects_imported_from_github
127
        projects_jira_active
128 129
        projects_jira_server_active
        projects_jira_cloud_active
130 131
        projects_slack_notifications_active
        projects_slack_slash_active
132
        projects_prometheus_active
133
        projects_with_repositories_enabled
L
Logan King 已提交
134
        projects_with_error_tracking_enabled
135 136 137
        pages_domains
        protected_branches
        releases
138
        remote_mirrors
139
        snippets
140
        suggestions
141
        todos
R
Robert Speicher 已提交
142
        uploads
143
        web_hooks
144
        user_preferences
145 146 147 148 149 150 151 152
      )

      count_data = subject[:counts]

      expect(count_data[:boards]).to eq(1)
      expect(count_data[:projects]).to eq(3)
      expect(count_data.keys).to include(*expected_keys)
      expect(expected_keys - count_data.keys).to be_empty
153
    end
154

155 156 157 158 159
    it 'does not gather user preferences usage data when the feature is disabled' do
      stub_feature_flags(group_overview_security_dashboard: false)
      expect(subject[:counts].keys).not_to include(:user_preferences)
    end

160 161 162 163 164
    it 'gathers projects data correctly' do
      count_data = subject[:counts]

      expect(count_data[:projects]).to eq(3)
      expect(count_data[:projects_prometheus_active]).to eq(1)
165 166 167
      expect(count_data[:projects_jira_active]).to eq(3)
      expect(count_data[:projects_jira_server_active]).to eq(2)
      expect(count_data[:projects_jira_cloud_active]).to eq(1)
168 169
      expect(count_data[:projects_slack_notifications_active]).to eq(2)
      expect(count_data[:projects_slack_slash_active]).to eq(1)
170
      expect(count_data[:projects_with_repositories_enabled]).to eq(2)
L
Logan King 已提交
171
      expect(count_data[:projects_with_error_tracking_enabled]).to eq(1)
172

173 174 175 176 177 178 179
      expect(count_data[:clusters_enabled]).to eq(7)
      expect(count_data[:project_clusters_enabled]).to eq(6)
      expect(count_data[:group_clusters_enabled]).to eq(1)
      expect(count_data[:clusters_disabled]).to eq(3)
      expect(count_data[:project_clusters_disabled]).to eq(1)
      expect(count_data[:group_clusters_disabled]).to eq(2)
      expect(count_data[:group_clusters_enabled]).to eq(1)
180 181 182 183
      expect(count_data[:clusters_platforms_gke]).to eq(1)
      expect(count_data[:clusters_platforms_user]).to eq(1)
      expect(count_data[:clusters_applications_helm]).to eq(1)
      expect(count_data[:clusters_applications_ingress]).to eq(1)
A
Amit Rathi 已提交
184
      expect(count_data[:clusters_applications_cert_managers]).to eq(1)
185 186
      expect(count_data[:clusters_applications_prometheus]).to eq(1)
      expect(count_data[:clusters_applications_runner]).to eq(1)
187
      expect(count_data[:clusters_applications_knative]).to eq(1)
188
    end
189 190 191 192 193 194 195

    it 'works when queries time out' do
      allow_any_instance_of(ActiveRecord::Relation)
        .to receive(:count).and_raise(ActiveRecord::StatementInvalid.new(''))

      expect { subject }.not_to raise_error
    end
196 197
  end

A
Alex Kalderimis 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
  describe '#usage_data_counters' do
    subject { described_class.usage_data_counters }

    it { is_expected.to all(respond_to :totals) }

    describe 'the results of calling #totals on all objects in the array' do
      subject { described_class.usage_data_counters.map(&:totals) }

      it do
        is_expected
          .to all(be_a Hash)
          .and all(have_attributes(keys: all(be_a Symbol), values: all(be_a Integer)))
      end
    end

    it 'does not have any conflicts' do
      all_keys = subject.flat_map { |counter| counter.totals.keys }

      expect(all_keys.size).to eq all_keys.to_set.size
    end
  end

220 221 222 223
  describe '#features_usage_data_ce' do
    subject { described_class.features_usage_data_ce }

    it 'gathers feature usage data' do
224 225 226 227
      expect(subject[:mattermost_enabled]).to eq(Gitlab.config.mattermost.enabled)
      expect(subject[:signup_enabled]).to eq(Gitlab::CurrentSettings.allow_signup?)
      expect(subject[:ldap_enabled]).to eq(Gitlab.config.ldap.enabled)
      expect(subject[:gravatar_enabled]).to eq(Gitlab::CurrentSettings.gravatar_enabled?)
228
      expect(subject[:omniauth_enabled]).to eq(Gitlab::Auth.omniauth_enabled?)
229 230 231
      expect(subject[:reply_by_email_enabled]).to eq(Gitlab::IncomingEmail.enabled?)
      expect(subject[:container_registry_enabled]).to eq(Gitlab.config.registry.enabled)
      expect(subject[:gitlab_shared_runners_enabled]).to eq(Gitlab.config.gitlab_ci.shared_runners_enabled)
232 233 234 235 236 237 238 239 240 241 242 243
    end
  end

  describe '#components_usage_data' do
    subject { described_class.components_usage_data }

    it 'gathers components usage data' do
      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)
      expect(subject[:database][:adapter]).to eq(Gitlab::Database.adapter_name)
      expect(subject[:database][:version]).to eq(Gitlab::Database.version)
244 245 246 247
      expect(subject[:gitaly][:version]).to be_present
      expect(subject[:gitaly][:servers]).to be >= 1
      expect(subject[:gitaly][:filesystems]).to be_an(Array)
      expect(subject[:gitaly][:filesystems].first).to be_a(String)
248 249 250
    end
  end

251
  describe '#license_usage_data' do
252
    subject { described_class.license_usage_data }
253 254

    it "gathers license data" do
255
      expect(subject[:uuid]).to eq(Gitlab::CurrentSettings.uuid)
256
      expect(subject[:version]).to eq(Gitlab::VERSION)
257
      expect(subject[:installation_type]).to eq('gitlab-development-kit')
258 259 260 261
      expect(subject[:active_user_count]).to eq(User.active.count)
      expect(subject[:recorded_at]).to be_a(Time)
    end
  end
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277

  describe '#count' do
    let(:relation) { double(:relation) }

    it 'returns the count when counting succeeds' do
      allow(relation).to receive(:count).and_return(1)

      expect(described_class.count(relation)).to eq(1)
    end

    it 'returns the fallback value when counting fails' do
      allow(relation).to receive(:count).and_raise(ActiveRecord::StatementInvalid.new(''))

      expect(described_class.count(relation, fallback: 15)).to eq(15)
    end
  end
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302

  describe '#approximate_counts' do
    it 'gets approximate counts for selected models' do
      create(:label)

      expect(Gitlab::Database::Count).to receive(:approximate_counts)
        .with(described_class::APPROXIMATE_COUNT_MODELS).once.and_call_original

      counts = described_class.approximate_counts.values

      expect(counts.count).to eq(described_class::APPROXIMATE_COUNT_MODELS.count)
      expect(counts.any? { |count| count < 0 }).to be_falsey
    end

    it 'returns default values if counts can not be retrieved' do
      described_class::APPROXIMATE_COUNT_MODELS.map do |model|
        model.name.underscore.pluralize.to_sym
      end

      expect(Gitlab::Database::Count).to receive(:approximate_counts)
        .and_return({})

      expect(described_class.approximate_counts.values.uniq).to eq([-1])
    end
  end
303
end