diff options
Diffstat (limited to 'spec/lib/gitlab')
15 files changed, 189 insertions, 807 deletions
diff --git a/spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb b/spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb deleted file mode 100644 index 7991ad69007..00000000000 --- a/spec/lib/gitlab/background_migration/archive_legacy_traces_spec.rb +++ /dev/null @@ -1,61 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::ArchiveLegacyTraces do - include TraceHelpers - - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:builds) { table(:ci_builds) } - let(:job_artifacts) { table(:ci_job_artifacts) } - - before do - namespaces.create!(id: 123, name: 'gitlab1', path: 'gitlab1') - projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1', namespace_id: 123) - @build = builds.create!(id: 1, project_id: 123, status: 'success', type: 'Ci::Build') - end - - context 'when trace file exsits at the right place' do - before do - create_legacy_trace(@build, 'trace in file') - end - - it 'correctly archive legacy traces' do - expect(job_artifacts.count).to eq(0) - expect(File.exist?(legacy_trace_path(@build))).to be_truthy - - described_class.new.perform(1, 1) - - expect(job_artifacts.count).to eq(1) - expect(File.exist?(legacy_trace_path(@build))).to be_falsy - expect(File.read(archived_trace_path(job_artifacts.first))).to eq('trace in file') - end - end - - context 'when trace file does not exsits at the right place' do - it 'does not raise errors nor create job artifact' do - expect { described_class.new.perform(1, 1) }.not_to raise_error - - expect(job_artifacts.count).to eq(0) - end - end - - context 'when trace data exsits in database' do - before do - create_legacy_trace_in_db(@build, 'trace in db') - end - - it 'correctly archive legacy traces' do - expect(job_artifacts.count).to eq(0) - expect(@build.read_attribute(:trace)).not_to be_empty - - described_class.new.perform(1, 1) - - @build.reload - expect(job_artifacts.count).to eq(1) - expect(@build.read_attribute(:trace)).to be_nil - expect(File.read(archived_trace_path(job_artifacts.first))).to eq('trace in db') - end - end -end diff --git a/spec/lib/gitlab/background_migration/backfill_hashed_project_repositories_spec.rb b/spec/lib/gitlab/background_migration/backfill_hashed_project_repositories_spec.rb deleted file mode 100644 index 79b344ea6fa..00000000000 --- a/spec/lib/gitlab/background_migration/backfill_hashed_project_repositories_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::BackfillHashedProjectRepositories do - it_behaves_like 'backfill migration for project repositories', :hashed -end diff --git a/spec/lib/gitlab/background_migration/backfill_project_fullpath_in_repo_config_spec.rb b/spec/lib/gitlab/background_migration/backfill_project_fullpath_in_repo_config_spec.rb deleted file mode 100644 index 1b2e1ed0c1a..00000000000 --- a/spec/lib/gitlab/background_migration/backfill_project_fullpath_in_repo_config_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::BackfillProjectFullpathInRepoConfig do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:group) { namespaces.create!(name: 'foo', path: 'foo') } - let(:subgroup) { namespaces.create!(name: 'bar', path: 'bar', parent_id: group.id) } - - describe described_class::Storage::Hashed do - let(:project) { double(id: 555) } - - subject(:project_storage) { described_class.new(project) } - - it 'has the correct disk_path' do - expect(project_storage.disk_path).to eq('@hashed/91/a7/91a73fd806ab2c005c13b4dc19130a884e909dea3f72d46e30266fe1a1f588d8') - end - end - - describe described_class::Storage::LegacyProject do - let(:project) { double(full_path: 'this/is/the/full/path') } - - subject(:project_storage) { described_class.new(project) } - - it 'has the correct disk_path' do - expect(project_storage.disk_path).to eq('this/is/the/full/path') - end - end - - describe described_class::Project do - let(:project_record) { projects.create!(namespace_id: subgroup.id, name: 'baz', path: 'baz') } - - subject(:project) { described_class.find(project_record.id) } - - describe '#full_path' do - it 'returns path containing all parent namespaces' do - expect(project.full_path).to eq('foo/bar/baz') - end - - it 'raises OrphanedNamespaceError when any parent namespace does not exist' do - subgroup.update_attribute(:parent_id, non_existing_record_id) - - expect { project.full_path }.to raise_error(Gitlab::BackgroundMigration::BackfillProjectFullpathInRepoConfig::OrphanedNamespaceError) - end - end - end - - describe described_class::Up do - describe '#perform' do - subject(:migrate) { described_class.new.perform(projects.minimum(:id), projects.maximum(:id)) } - - it 'asks the gitaly client to set config' do - projects.create!(namespace_id: subgroup.id, name: 'baz', path: 'baz') - projects.create!(namespace_id: subgroup.id, name: 'buzz', path: 'buzz', storage_version: 1) - - expect_next_instance_of(Gitlab::GitalyClient::RepositoryService) do |repository_service| - allow(repository_service).to receive(:cleanup) - expect(repository_service).to receive(:set_config).with('gitlab.fullpath' => 'foo/bar/baz') - end - - expect_next_instance_of(Gitlab::GitalyClient::RepositoryService) do |repository_service| - allow(repository_service).to receive(:cleanup) - expect(repository_service).to receive(:set_config).with('gitlab.fullpath' => 'foo/bar/buzz') - end - - migrate - end - end - end - - describe described_class::Down do - describe '#perform' do - subject(:migrate) { described_class.new.perform(projects.minimum(:id), projects.maximum(:id)) } - - it 'asks the gitaly client to set config' do - projects.create!(namespace_id: subgroup.id, name: 'baz', path: 'baz') - - expect_next_instance_of(Gitlab::GitalyClient::RepositoryService) do |repository_service| - allow(repository_service).to receive(:cleanup) - expect(repository_service).to receive(:delete_config).with(['gitlab.fullpath']) - end - - migrate - end - end - end -end diff --git a/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb b/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb deleted file mode 100644 index 8e3ace083fc..00000000000 --- a/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb +++ /dev/null @@ -1,111 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::FixCrossProjectLabelLinks do - let(:namespaces_table) { table(:namespaces) } - let(:projects_table) { table(:projects) } - let(:issues_table) { table(:issues) } - let(:merge_requests_table) { table(:merge_requests) } - let(:labels_table) { table(:labels) } - let(:label_links_table) { table(:label_links) } - - let!(:group1) { namespaces_table.create(id: 10, type: 'Group', name: 'group1', path: 'group1') } - let!(:group2) { namespaces_table.create(id: 20, type: 'Group', name: 'group2', path: 'group2') } - - let!(:project1) { projects_table.create(id: 1, name: 'project1', path: 'group1/project1', namespace_id: 10) } - let!(:project2) { projects_table.create(id: 3, name: 'project2', path: 'group1/project2', namespace_id: 20) } - - let!(:label1) { labels_table.create(id: 1, title: 'bug', color: 'red', group_id: 10, type: 'GroupLabel') } - let!(:label2) { labels_table.create(id: 2, title: 'bug', color: 'red', group_id: 20, type: 'GroupLabel') } - - def create_merge_request(id, project_id) - merge_requests_table.create(id: id, - target_project_id: project_id, - target_branch: 'master', - source_project_id: project_id, - source_branch: 'mr name', - title: "mr name#{id}") - end - - def create_issue(id, project_id) - issues_table.create(id: id, title: "issue#{id}", project_id: project_id) - end - - def create_resource(target_type, id, project_id) - target_type == 'Issue' ? create_issue(id, project_id) : create_merge_request(id, project_id) - end - - shared_examples_for 'resource with cross-project labels' do - it 'updates only cross-project label links which exist in the local project or group' do - create_resource(target_type, 1, 1) - create_resource(target_type, 2, 3) - labels_table.create(id: 3, title: 'bug', color: 'red', project_id: 3, type: 'ProjectLabel') - link = label_links_table.create(label_id: 2, target_type: target_type, target_id: 1) - link2 = label_links_table.create(label_id: 3, target_type: target_type, target_id: 2) - - subject.perform(1, 100) - - expect(link.reload.label_id).to eq(1) - expect(link2.reload.label_id).to eq(3) - end - - it 'ignores cross-project label links if label color is different' do - labels_table.create(id: 3, title: 'bug', color: 'green', group_id: 20, type: 'GroupLabel') - create_resource(target_type, 1, 1) - link = label_links_table.create(label_id: 3, target_type: target_type, target_id: 1) - - subject.perform(1, 100) - - expect(link.reload.label_id).to eq(3) - end - - it 'ignores cross-project label links if label name is different' do - labels_table.create(id: 3, title: 'bug1', color: 'red', group_id: 20, type: 'GroupLabel') - create_resource(target_type, 1, 1) - link = label_links_table.create(label_id: 3, target_type: target_type, target_id: 1) - - subject.perform(1, 100) - - expect(link.reload.label_id).to eq(3) - end - - context 'with nested group' do - before do - namespaces_table.create(id: 11, type: 'Group', name: 'subgroup1', path: 'group1/subgroup1', parent_id: 10) - projects_table.create(id: 2, name: 'subproject1', path: 'group1/subgroup1/subproject1', namespace_id: 11) - create_resource(target_type, 1, 2) - end - - it 'ignores label links referencing ancestor group labels' do - labels_table.create(id: 4, title: 'bug', color: 'red', project_id: 2, type: 'ProjectLabel') - label_links_table.create(label_id: 4, target_type: target_type, target_id: 1) - link = label_links_table.create(label_id: 1, target_type: target_type, target_id: 1) - - subject.perform(1, 100) - - expect(link.reload.label_id).to eq(1) - end - - it 'checks also issues and MRs in subgroups' do - link = label_links_table.create(label_id: 2, target_type: target_type, target_id: 1) - - subject.perform(1, 100) - - expect(link.reload.label_id).to eq(1) - end - end - end - - context 'resource is Issue' do - it_behaves_like 'resource with cross-project labels' do - let(:target_type) { 'Issue' } - end - end - - context 'resource is Merge Request' do - it_behaves_like 'resource with cross-project labels' do - let(:target_type) { 'MergeRequest' } - end - end -end diff --git a/spec/lib/gitlab/background_migration/migrate_build_stage_spec.rb b/spec/lib/gitlab/background_migration/migrate_build_stage_spec.rb deleted file mode 100644 index 65d45ec694f..00000000000 --- a/spec/lib/gitlab/background_migration/migrate_build_stage_spec.rb +++ /dev/null @@ -1,84 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::MigrateBuildStage do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:pipelines) { table(:ci_pipelines) } - let(:stages) { table(:ci_stages) } - let(:jobs) { table(:ci_builds) } - - let(:statuses) do - { - created: 0, - pending: 1, - running: 2, - success: 3, - failed: 4, - canceled: 5, - skipped: 6, - manual: 7 - } - end - - before do - namespace = namespaces.create!(name: 'gitlab-org', path: 'gitlab-org') - projects.create!(id: 123, name: 'gitlab', path: 'gitlab-ce', namespace_id: namespace.id) - pipelines.create!(id: 1, project_id: 123, ref: 'master', sha: 'adf43c3a') - - jobs.create!(id: 1, commit_id: 1, project_id: 123, - stage_idx: 2, stage: 'build', status: :success) - jobs.create!(id: 2, commit_id: 1, project_id: 123, - stage_idx: 2, stage: 'build', status: :success) - jobs.create!(id: 3, commit_id: 1, project_id: 123, - stage_idx: 1, stage: 'test', status: :failed) - jobs.create!(id: 4, commit_id: 1, project_id: 123, - stage_idx: 1, stage: 'test', status: :success) - jobs.create!(id: 5, commit_id: 1, project_id: 123, - stage_idx: 3, stage: 'deploy', status: :pending) - jobs.create!(id: 6, commit_id: 1, project_id: 123, - stage_idx: 3, stage: nil, status: :pending) - end - - it 'correctly migrates builds stages' do - expect(stages.count).to be_zero - - described_class.new.perform(1, 6) - - expect(stages.count).to eq 3 - expect(stages.all.pluck(:name)).to match_array %w[test build deploy] - expect(jobs.where(stage_id: nil)).to be_one - expect(jobs.find_by(stage_id: nil).id).to eq 6 - expect(stages.all.pluck(:status)).to match_array [statuses[:success], - statuses[:failed], - statuses[:pending]] - end - - it 'recovers from unique constraint violation only twice', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/28128' do - allow(described_class::Migratable::Stage) - .to receive(:find_by).and_return(nil) - - expect(described_class::Migratable::Stage) - .to receive(:find_by).exactly(3).times - - expect { described_class.new.perform(1, 6) } - .to raise_error ActiveRecord::RecordNotUnique - end - - context 'when invalid class can be loaded due to single table inheritance' do - let(:commit_status) do - jobs.create!(id: 7, commit_id: 1, project_id: 123, stage_idx: 4, - stage: 'post-deploy', status: :failed) - end - - before do - commit_status.update_column(:type, 'SomeClass') - end - - it 'does ignore single table inheritance type' do - expect { described_class.new.perform(1, 7) }.not_to raise_error - expect(jobs.find(7)).to have_attributes(stage_id: (a_value > 0)) - end - end -end diff --git a/spec/lib/gitlab/background_migration/migrate_stage_index_spec.rb b/spec/lib/gitlab/background_migration/migrate_stage_index_spec.rb deleted file mode 100644 index 81874ff7982..00000000000 --- a/spec/lib/gitlab/background_migration/migrate_stage_index_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::MigrateStageIndex do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:pipelines) { table(:ci_pipelines) } - let(:stages) { table(:ci_stages) } - let(:jobs) { table(:ci_builds) } - let(:namespace) { namespaces.create(name: 'gitlab-org', path: 'gitlab-org') } - let(:project) { projects.create!(namespace_id: namespace.id, name: 'gitlab', path: 'gitlab') } - let(:pipeline) { pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a') } - let(:stage1) { stages.create(project_id: project.id, pipeline_id: pipeline.id, name: 'build') } - let(:stage2) { stages.create(project_id: project.id, pipeline_id: pipeline.id, name: 'test') } - - before do - jobs.create!(commit_id: pipeline.id, project_id: project.id, - stage_idx: 2, stage_id: stage1.id) - jobs.create!(commit_id: pipeline.id, project_id: project.id, - stage_idx: 2, stage_id: stage1.id) - jobs.create!(commit_id: pipeline.id, project_id: project.id, - stage_idx: 10, stage_id: stage1.id) - jobs.create!(commit_id: pipeline.id, project_id: project.id, - stage_idx: 3, stage_id: stage2.id) - end - - it 'correctly migrates stages indices' do - expect(stages.all.pluck(:position)).to all(be_nil) - - described_class.new.perform(stage1.id, stage2.id) - - expect(stages.all.order(:id).pluck(:position)).to eq [2, 3] - end -end diff --git a/spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb b/spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb deleted file mode 100644 index 73faca54b52..00000000000 --- a/spec/lib/gitlab/background_migration/populate_cluster_kubernetes_namespace_table_spec.rb +++ /dev/null @@ -1,94 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::PopulateClusterKubernetesNamespaceTable do - include MigrationHelpers::ClusterHelpers - - let(:migration) { described_class.new } - let(:clusters_table) { table(:clusters) } - let(:cluster_projects_table) { table(:cluster_projects) } - let(:cluster_kubernetes_namespaces_table) { table(:clusters_kubernetes_namespaces) } - let(:projects_table) { table(:projects) } - let(:namespaces_table) { table(:namespaces) } - let(:provider_gcp_table) { table(:cluster_providers_gcp) } - let(:platform_kubernetes_table) { table(:cluster_platforms_kubernetes) } - - before do - create_cluster_project_list(10) - end - - shared_examples 'consistent kubernetes namespace attributes' do - it 'populates namespace and service account information' do - migration.perform - - clusters_with_namespace.each do |cluster| - cluster_project = cluster_projects_table.find_by(cluster_id: cluster.id) - project = projects_table.find(cluster_project.project_id) - kubernetes_namespace = cluster_kubernetes_namespaces_table.find_by(cluster_id: cluster.id) - namespace = "#{project.path}-#{project.id}" - - expect(kubernetes_namespace).to be_present - expect(kubernetes_namespace.cluster_project_id).to eq(cluster_project.id) - expect(kubernetes_namespace.project_id).to eq(cluster_project.project_id) - expect(kubernetes_namespace.cluster_id).to eq(cluster_project.cluster_id) - expect(kubernetes_namespace.namespace).to eq(namespace) - expect(kubernetes_namespace.service_account_name).to eq("#{namespace}-service-account") - end - end - end - - context 'when no Clusters::Project has a Clusters::KubernetesNamespace' do - let(:cluster_projects) { cluster_projects_table.all } - - it 'creates a Clusters::KubernetesNamespace per Clusters::Project' do - expect do - migration.perform - end.to change(Clusters::KubernetesNamespace, :count).by(cluster_projects_table.count) - end - - it_behaves_like 'consistent kubernetes namespace attributes' do - let(:clusters_with_namespace) { clusters_table.all } - end - end - - context 'when every Clusters::Project has Clusters::KubernetesNamespace' do - before do - create_kubernetes_namespace(clusters_table.all) - end - - it 'does not create any Clusters::KubernetesNamespace' do - expect do - migration.perform - end.not_to change(Clusters::KubernetesNamespace, :count) - end - end - - context 'when only some Clusters::Project have Clusters::KubernetesNamespace related' do - let(:with_kubernetes_namespace) { clusters_table.first(6) } - let(:with_no_kubernetes_namespace) { clusters_table.last(4) } - - before do - create_kubernetes_namespace(with_kubernetes_namespace) - end - - it 'creates limited number of Clusters::KubernetesNamespace' do - expect do - migration.perform - end.to change(Clusters::KubernetesNamespace, :count).by(with_no_kubernetes_namespace.count) - end - - it 'does not modify clusters with Clusters::KubernetesNamespace' do - migration.perform - - with_kubernetes_namespace.each do |cluster| - kubernetes_namespace = cluster_kubernetes_namespaces_table.where(cluster_id: cluster.id) - expect(kubernetes_namespace.count).to eq(1) - end - end - - it_behaves_like 'consistent kubernetes namespace attributes' do - let(:clusters_with_namespace) { with_no_kubernetes_namespace } - end - end -end diff --git a/spec/lib/gitlab/background_migration/remove_restricted_todos_spec.rb b/spec/lib/gitlab/background_migration/remove_restricted_todos_spec.rb deleted file mode 100644 index 7019d5d4212..00000000000 --- a/spec/lib/gitlab/background_migration/remove_restricted_todos_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::RemoveRestrictedTodos do - let(:namespaces) { table(:namespaces) } - let(:projects) { table(:projects) } - let(:users) { table(:users) } - let(:todos) { table(:todos) } - let(:issues) { table(:issues) } - let(:assignees) { table(:issue_assignees) } - let(:project_authorizations) { table(:project_authorizations) } - let(:project_features) { table(:project_features) } - - let(:todo_params) { { author_id: 1, target_type: 'Issue', action: 1, state: :pending } } - - before do - users.create(id: 1, email: 'user@example.com', projects_limit: 10) - users.create(id: 2, email: 'reporter@example.com', projects_limit: 10) - users.create(id: 3, email: 'guest@example.com', projects_limit: 10) - - namespace = namespaces.create(name: 'gitlab-org', path: 'gitlab-org') - projects.create!(id: 1, name: 'project-1', path: 'project-1', visibility_level: 0, namespace_id: namespace.id) - projects.create!(id: 2, name: 'project-2', path: 'project-2', visibility_level: 0, namespace_id: namespace.id) - - issues.create(id: 1, project_id: 1) - issues.create(id: 2, project_id: 2) - - project_authorizations.create(user_id: 2, project_id: 2, access_level: 20) # reporter - project_authorizations.create(user_id: 3, project_id: 2, access_level: 10) # guest - - todos.create(todo_params.merge(user_id: 1, project_id: 1, target_id: 1)) # out of project ids range - todos.create(todo_params.merge(user_id: 1, project_id: 2, target_id: 2)) # non member - todos.create(todo_params.merge(user_id: 2, project_id: 2, target_id: 2)) # reporter - todos.create(todo_params.merge(user_id: 3, project_id: 2, target_id: 2)) # guest - end - - subject { described_class.new.perform(2, 5) } - - context 'when a project is private' do - it 'removes todos of users without project access' do - expect { subject }.to change { Todo.count }.from(4).to(3) - end - - context 'with a confidential issue' do - it 'removes todos of users without project access and guests for confidential issues' do - issues.create(id: 3, project_id: 2, confidential: true) - issues.create(id: 4, project_id: 1, confidential: true) # not in the batch - todos.create(todo_params.merge(user_id: 3, project_id: 2, target_id: 3)) - todos.create(todo_params.merge(user_id: 2, project_id: 2, target_id: 3)) - todos.create(todo_params.merge(user_id: 1, project_id: 1, target_id: 4)) - - expect { subject }.to change { Todo.count }.from(7).to(5) - end - end - end - - context 'when a project is public' do - before do - projects.find(2).update_attribute(:visibility_level, 20) - end - - context 'when all features have the same visibility as the project, no confidential issues' do - it 'does not remove any todos' do - expect { subject }.not_to change { Todo.count } - end - end - - context 'with confidential issues' do - before do - users.create(id: 4, email: 'author@example.com', projects_limit: 10) - users.create(id: 5, email: 'assignee@example.com', projects_limit: 10) - issues.create(id: 3, project_id: 2, confidential: true, author_id: 4) - assignees.create(user_id: 5, issue_id: 3) - - todos.create(todo_params.merge(user_id: 1, project_id: 2, target_id: 3)) # to be deleted - todos.create(todo_params.merge(user_id: 2, project_id: 2, target_id: 3)) # authorized user - todos.create(todo_params.merge(user_id: 3, project_id: 2, target_id: 3)) # to be deleted guest - todos.create(todo_params.merge(user_id: 4, project_id: 2, target_id: 3)) # conf issue author - todos.create(todo_params.merge(user_id: 5, project_id: 2, target_id: 3)) # conf issue assignee - end - - it 'removes confidential issue todos for non authorized users' do - expect { subject }.to change { Todo.count }.from(9).to(7) - end - end - - context 'features visibility restrictions' do - before do - todo_params.merge!(project_id: 2, user_id: 1, target_id: 3) - todos.create(todo_params.merge(user_id: 1, target_id: 3, target_type: 'MergeRequest')) - todos.create(todo_params.merge(user_id: 1, target_id: 3, target_type: 'Commit')) - end - - context 'when issues are restricted to project members' do - before do - project_features.create(issues_access_level: 10, pages_access_level: 10, project_id: 2) - end - - it 'removes non members issue todos' do - expect { subject }.to change { Todo.count }.from(6).to(5) - end - end - - context 'when merge requests are restricted to project members' do - before do - project_features.create(merge_requests_access_level: 10, pages_access_level: 10, project_id: 2) - end - - it 'removes non members issue todos' do - expect { subject }.to change { Todo.count }.from(6).to(5) - end - end - - context 'when repository and merge requests are restricted to project members' do - before do - project_features.create(repository_access_level: 10, merge_requests_access_level: 10, pages_access_level: 10, project_id: 2) - end - - it 'removes non members commit and merge requests todos' do - expect { subject }.to change { Todo.count }.from(6).to(4) - end - end - end - end -end diff --git a/spec/lib/gitlab/background_migration/set_confidential_note_events_on_services_spec.rb b/spec/lib/gitlab/background_migration/set_confidential_note_events_on_services_spec.rb deleted file mode 100644 index 364edf3ed2a..00000000000 --- a/spec/lib/gitlab/background_migration/set_confidential_note_events_on_services_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::SetConfidentialNoteEventsOnServices do - let(:services) { table(:services) } - - describe '#perform' do - it 'migrates services where note_events is true' do - service = services.create(confidential_note_events: nil, note_events: true) - - subject.perform(service.id, service.id) - - expect(service.reload.confidential_note_events).to eq(true) - end - - it 'ignores services where note_events is false' do - service = services.create(confidential_note_events: nil, note_events: false) - - subject.perform(service.id, service.id) - - expect(service.reload.confidential_note_events).to eq(nil) - end - - it 'ignores services where confidential_note_events has already been set' do - service = services.create(confidential_note_events: false, note_events: true) - - subject.perform(service.id, service.id) - - expect(service.reload.confidential_note_events).to eq(false) - end - end -end diff --git a/spec/lib/gitlab/background_migration/set_confidential_note_events_on_webhooks_spec.rb b/spec/lib/gitlab/background_migration/set_confidential_note_events_on_webhooks_spec.rb deleted file mode 100644 index 28b06ac3ba3..00000000000 --- a/spec/lib/gitlab/background_migration/set_confidential_note_events_on_webhooks_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::BackgroundMigration::SetConfidentialNoteEventsOnWebhooks do - let(:web_hooks) { table(:web_hooks) } - - describe '#perform' do - it 'migrates hooks where note_events is true' do - hook = web_hooks.create(confidential_note_events: nil, note_events: true) - - subject.perform(hook.id, hook.id) - - expect(hook.reload.confidential_note_events).to eq(true) - end - - it 'ignores hooks where note_events is false' do - hook = web_hooks.create(confidential_note_events: nil, note_events: false) - - subject.perform(hook.id, hook.id) - - expect(hook.reload.confidential_note_events).to eq(nil) - end - - it 'ignores hooks where confidential_note_events has already been set' do - hook = web_hooks.create(confidential_note_events: false, note_events: true) - - subject.perform(hook.id, hook.id) - - expect(hook.reload.confidential_note_events).to eq(false) - end - end -end diff --git a/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb b/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb index 08a4bbe38ac..392b44d1a1f 100644 --- a/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb +++ b/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb @@ -75,6 +75,14 @@ RSpec.describe Gitlab::BackgroundMigration::UserMentions::CreateResourceUserMent let(:resource) { merge_request } it_behaves_like 'resource mentions migration', MigrateMergeRequestMentionsToDb, MergeRequest + + context 'when FF disabled' do + before do + stub_feature_flags(migrate_user_mentions: false) + end + + it_behaves_like 'resource migration not run', MigrateMergeRequestMentionsToDb, MergeRequest + end end context 'migrate commit mentions' do @@ -96,6 +104,14 @@ RSpec.describe Gitlab::BackgroundMigration::UserMentions::CreateResourceUserMent let(:resource) { commit } it_behaves_like 'resource notes mentions migration', MigrateCommitNotesMentionsToDb, Commit + + context 'when FF disabled' do + before do + stub_feature_flags(migrate_user_mentions: false) + end + + it_behaves_like 'resource notes migration not run', MigrateCommitNotesMentionsToDb, Commit + end end end diff --git a/spec/lib/gitlab/danger/helper_spec.rb b/spec/lib/gitlab/danger/helper_spec.rb index e19ec5c51b3..d608708b351 100644 --- a/spec/lib/gitlab/danger/helper_spec.rb +++ b/spec/lib/gitlab/danger/helper_spec.rb @@ -98,21 +98,21 @@ RSpec.describe Gitlab::Danger::Helper do it 'delegates to CHANGELOG-EE.md existence if CI_PROJECT_NAME is set to something else' do stub_env('CI_PROJECT_NAME', 'something else') - expect(Dir).to receive(:exist?).with('../../ee') { true } + expect(Dir).to receive(:exist?).with(File.expand_path('../../../../ee', __dir__)) { true } is_expected.to be_truthy end it 'returns true if ee exists' do stub_env('CI_PROJECT_NAME', nil) - expect(Dir).to receive(:exist?).with('../../ee') { true } + expect(Dir).to receive(:exist?).with(File.expand_path('../../../../ee', __dir__)) { true } is_expected.to be_truthy end it "returns false if ee doesn't exist" do stub_env('CI_PROJECT_NAME', nil) - expect(Dir).to receive(:exist?).with('../../ee') { false } + expect(Dir).to receive(:exist?).with(File.expand_path('../../../../ee', __dir__)) { false } is_expected.to be_falsy end diff --git a/spec/lib/gitlab/danger/roulette_spec.rb b/spec/lib/gitlab/danger/roulette_spec.rb index 676edca2459..9517b0a8f63 100644 --- a/spec/lib/gitlab/danger/roulette_spec.rb +++ b/spec/lib/gitlab/danger/roulette_spec.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require 'fast_spec_helper' require 'webmock/rspec' require 'timecop' @@ -11,102 +10,95 @@ RSpec.describe Gitlab::Danger::Roulette do Timecop.freeze(Time.utc(2020, 06, 22, 10)) { example.run } end + let(:backend_available) { true } + let(:backend_tz_offset_hours) { 2.0 } let(:backend_maintainer) do - { - username: 'backend-maintainer', - name: 'Backend maintainer', - role: 'Backend engineer', - projects: { 'gitlab' => 'maintainer backend' }, - available: true, - tz_offset_hours: 2.0 - } + Gitlab::Danger::Teammate.new( + 'username' => 'backend-maintainer', + 'name' => 'Backend maintainer', + 'role' => 'Backend engineer', + 'projects' => { 'gitlab' => 'maintainer backend' }, + 'available' => backend_available, + 'tz_offset_hours' => backend_tz_offset_hours + ) end let(:frontend_reviewer) do - { - username: 'frontend-reviewer', - name: 'Frontend reviewer', - role: 'Frontend engineer', - projects: { 'gitlab' => 'reviewer frontend' }, - available: true, - tz_offset_hours: 2.0 - } + Gitlab::Danger::Teammate.new( + 'username' => 'frontend-reviewer', + 'name' => 'Frontend reviewer', + 'role' => 'Frontend engineer', + 'projects' => { 'gitlab' => 'reviewer frontend' }, + 'available' => true, + 'tz_offset_hours' => 2.0 + ) end let(:frontend_maintainer) do - { - username: 'frontend-maintainer', - name: 'Frontend maintainer', - role: 'Frontend engineer', - projects: { 'gitlab' => "maintainer frontend" }, - available: true, - tz_offset_hours: 2.0 - } + Gitlab::Danger::Teammate.new( + 'username' => 'frontend-maintainer', + 'name' => 'Frontend maintainer', + 'role' => 'Frontend engineer', + 'projects' => { 'gitlab' => "maintainer frontend" }, + 'available' => true, + 'tz_offset_hours' => 2.0 + ) end let(:software_engineer_in_test) do - { - username: 'software-engineer-in-test', - name: 'Software Engineer in Test', - role: 'Software Engineer in Test, Create:Source Code', - projects: { - 'gitlab' => 'reviewer qa', - 'gitlab-qa' => 'maintainer' - }, - available: true, - tz_offset_hours: 2.0 - } + Gitlab::Danger::Teammate.new( + 'username' => 'software-engineer-in-test', + 'name' => 'Software Engineer in Test', + 'role' => 'Software Engineer in Test, Create:Source Code', + 'projects' => { 'gitlab' => 'reviewer qa', 'gitlab-qa' => 'maintainer' }, + 'available' => true, + 'tz_offset_hours' => 2.0 + ) end let(:engineering_productivity_reviewer) do - { - username: 'eng-prod-reviewer', - name: 'EP engineer', - role: 'Engineering Productivity', - projects: { 'gitlab' => 'reviewer backend' }, - available: true, - tz_offset_hours: 2.0 - } + Gitlab::Danger::Teammate.new( + 'username' => 'eng-prod-reviewer', + 'name' => 'EP engineer', + 'role' => 'Engineering Productivity', + 'projects' => { 'gitlab' => 'reviewer backend' }, + 'available' => true, + 'tz_offset_hours' => 2.0 + ) end let(:teammate_json) do [ - backend_maintainer, - frontend_maintainer, - frontend_reviewer, - software_engineer_in_test, - engineering_productivity_reviewer + backend_maintainer.to_h, + frontend_maintainer.to_h, + frontend_reviewer.to_h, + software_engineer_in_test.to_h, + engineering_productivity_reviewer.to_h ].to_json end subject(:roulette) { Object.new.extend(described_class) } - def matching_teammate(person) - satisfy do |teammate| - teammate.username == person[:username] && - teammate.name == person[:name] && - teammate.role == person[:role] && - teammate.projects == person[:projects] - end - end - - def matching_spin(category, reviewer: { username: nil }, maintainer: { username: nil }, optional: nil) - satisfy do |spin| - bool = spin.category == category - bool &&= spin.reviewer&.username == reviewer[:username] - - bool &&= - if maintainer - spin.maintainer&.username == maintainer[:username] - else - spin.maintainer.nil? - end - - bool && spin.optional_role == optional + describe 'Spin#==' do + it 'compares Spin attributes' do + spin1 = described_class::Spin.new(:backend, frontend_reviewer, frontend_maintainer, false, false) + spin2 = described_class::Spin.new(:backend, frontend_reviewer, frontend_maintainer, false, false) + spin3 = described_class::Spin.new(:backend, frontend_reviewer, frontend_maintainer, false, true) + spin4 = described_class::Spin.new(:backend, frontend_reviewer, frontend_maintainer, true, false) + spin5 = described_class::Spin.new(:backend, frontend_reviewer, backend_maintainer, false, false) + spin6 = described_class::Spin.new(:backend, backend_maintainer, frontend_maintainer, false, false) + spin7 = described_class::Spin.new(:frontend, frontend_reviewer, frontend_maintainer, false, false) + + expect(spin1).to eq(spin2) + expect(spin1).not_to eq(spin3) + expect(spin1).not_to eq(spin4) + expect(spin1).not_to eq(spin5) + expect(spin1).not_to eq(spin6) + expect(spin1).not_to eq(spin7) end end describe '#spin' do let!(:project) { 'gitlab' } - let!(:branch_name) { 'a-branch' } + let!(:mr_source_branch) { 'a-branch' } let!(:mr_labels) { ['backend', 'devops::create'] } - let!(:author) { Gitlab::Danger::Teammate.new('username' => 'filipa') } + let!(:author) { Gitlab::Danger::Teammate.new('username' => 'johndoe') } let(:timezone_experiment) { false } let(:spins) do # Stub the request at the latest time so that we can modify the raw data, e.g. available fields. @@ -114,12 +106,13 @@ RSpec.describe Gitlab::Danger::Roulette do .stub_request(:get, described_class::ROULETTE_DATA_URL) .to_return(body: teammate_json) - subject.spin(project, categories, branch_name, timezone_experiment: timezone_experiment) + subject.spin(project, categories, timezone_experiment: timezone_experiment) end before do - allow(subject).to receive_message_chain(:gitlab, :mr_author).and_return(author.username) - allow(subject).to receive_message_chain(:gitlab, :mr_labels).and_return(mr_labels) + allow(subject).to receive(:mr_author_username).and_return(author.username) + allow(subject).to receive(:mr_labels).and_return(mr_labels) + allow(subject).to receive(:mr_source_branch).and_return(mr_source_branch) end context 'when timezone_experiment == false' do @@ -127,16 +120,16 @@ RSpec.describe Gitlab::Danger::Roulette do let(:categories) { [:backend] } it 'assigns backend reviewer and maintainer' do - expect(spins).to contain_exactly(matching_spin(:backend, reviewer: engineering_productivity_reviewer, maintainer: backend_maintainer)) + expect(spins[0].reviewer).to eq(engineering_productivity_reviewer) + expect(spins[0].maintainer).to eq(backend_maintainer) + expect(spins).to eq([described_class::Spin.new(:backend, engineering_productivity_reviewer, backend_maintainer, false, false)]) end context 'when teammate is not available' do - before do - backend_maintainer[:available] = false - end + let(:backend_available) { false } it 'assigns backend reviewer and no maintainer' do - expect(spins).to contain_exactly(matching_spin(:backend, reviewer: engineering_productivity_reviewer, maintainer: nil)) + expect(spins).to eq([described_class::Spin.new(:backend, engineering_productivity_reviewer, nil, false, false)]) end end end @@ -145,7 +138,7 @@ RSpec.describe Gitlab::Danger::Roulette do let(:categories) { [:frontend] } it 'assigns frontend reviewer and maintainer' do - expect(spins).to contain_exactly(matching_spin(:frontend, reviewer: frontend_reviewer, maintainer: frontend_maintainer)) + expect(spins).to eq([described_class::Spin.new(:frontend, frontend_reviewer, frontend_maintainer, false, false)]) end end @@ -153,7 +146,7 @@ RSpec.describe Gitlab::Danger::Roulette do let(:categories) { [:qa] } it 'assigns QA reviewer' do - expect(spins).to contain_exactly(matching_spin(:qa, reviewer: software_engineer_in_test)) + expect(spins).to eq([described_class::Spin.new(:qa, software_engineer_in_test, nil, false, false)]) end end @@ -161,7 +154,7 @@ RSpec.describe Gitlab::Danger::Roulette do let(:categories) { [:engineering_productivity] } it 'assigns Engineering Productivity reviewer and fallback to backend maintainer' do - expect(spins).to contain_exactly(matching_spin(:engineering_productivity, reviewer: engineering_productivity_reviewer, maintainer: backend_maintainer)) + expect(spins).to eq([described_class::Spin.new(:engineering_productivity, engineering_productivity_reviewer, backend_maintainer, false, false)]) end end @@ -169,7 +162,7 @@ RSpec.describe Gitlab::Danger::Roulette do let(:categories) { [:test] } it 'assigns corresponding SET' do - expect(spins).to contain_exactly(matching_spin(:test, reviewer: software_engineer_in_test)) + expect(spins).to eq([described_class::Spin.new(:test, software_engineer_in_test, nil, :maintainer, false)]) end end end @@ -181,16 +174,14 @@ RSpec.describe Gitlab::Danger::Roulette do let(:categories) { [:backend] } it 'assigns backend reviewer and maintainer' do - expect(spins).to contain_exactly(matching_spin(:backend, reviewer: engineering_productivity_reviewer, maintainer: backend_maintainer)) + expect(spins).to eq([described_class::Spin.new(:backend, engineering_productivity_reviewer, backend_maintainer, false, true)]) end context 'when teammate is not in a good timezone' do - before do - backend_maintainer[:tz_offset_hours] = 5.0 - end + let(:backend_tz_offset_hours) { 5.0 } it 'assigns backend reviewer and no maintainer' do - expect(spins).to contain_exactly(matching_spin(:backend, reviewer: engineering_productivity_reviewer, maintainer: nil)) + expect(spins).to eq([described_class::Spin.new(:backend, engineering_productivity_reviewer, nil, false, true)]) end end end @@ -203,22 +194,33 @@ RSpec.describe Gitlab::Danger::Roulette do end it 'assigns backend reviewer and maintainer' do - expect(spins).to contain_exactly(matching_spin(:backend, reviewer: engineering_productivity_reviewer, maintainer: backend_maintainer)) + expect(spins).to eq([described_class::Spin.new(:backend, engineering_productivity_reviewer, backend_maintainer, false, false)]) end context 'when teammate is not in a good timezone' do - before do - backend_maintainer[:tz_offset_hours] = 5.0 - end + let(:backend_tz_offset_hours) { 5.0 } it 'assigns backend reviewer and maintainer' do - expect(spins).to contain_exactly(matching_spin(:backend, reviewer: engineering_productivity_reviewer, maintainer: backend_maintainer)) + expect(spins).to eq([described_class::Spin.new(:backend, engineering_productivity_reviewer, backend_maintainer, false, false)]) end end end end end + RSpec::Matchers.define :match_teammates do |expected| + match do |actual| + expected.each do |expected_person| + actual_person_found = actual.find { |actual_person| actual_person.name == expected_person.username } + + actual_person_found && + actual_person_found.name == expected_person.name && + actual_person_found.role == expected_person.role && + actual_person_found.projects == expected_person.projects + end + end + end + describe '#team' do subject(:team) { roulette.team } @@ -254,15 +256,13 @@ RSpec.describe Gitlab::Danger::Roulette do end it 'returns an array of teammates' do - expected_teammates = [ - matching_teammate(backend_maintainer), - matching_teammate(frontend_reviewer), - matching_teammate(frontend_maintainer), - matching_teammate(software_engineer_in_test), - matching_teammate(engineering_productivity_reviewer) - ] - - is_expected.to contain_exactly(*expected_teammates) + is_expected.to match_teammates([ + backend_maintainer, + frontend_reviewer, + frontend_maintainer, + software_engineer_in_test, + engineering_productivity_reviewer + ]) end it 'memoizes the result' do @@ -281,7 +281,9 @@ RSpec.describe Gitlab::Danger::Roulette do end it 'filters team by project_name' do - is_expected.to contain_exactly(matching_teammate(software_engineer_in_test)) + is_expected.to match_teammates([ + software_engineer_in_test + ]) end end @@ -289,32 +291,32 @@ RSpec.describe Gitlab::Danger::Roulette do let(:person_tz_offset_hours) { 0.0 } let(:person1) do Gitlab::Danger::Teammate.new( - 'username' => 'rymai', + 'username' => 'user1', 'available' => true, 'tz_offset_hours' => person_tz_offset_hours ) end let(:person2) do Gitlab::Danger::Teammate.new( - 'username' => 'godfat', + 'username' => 'user2', 'available' => true, 'tz_offset_hours' => person_tz_offset_hours) end let(:author) do Gitlab::Danger::Teammate.new( - 'username' => 'filipa', + 'username' => 'johndoe', 'available' => true, 'tz_offset_hours' => 0.0) end let(:unavailable) do Gitlab::Danger::Teammate.new( - 'username' => 'jacopo-beschi', + 'username' => 'janedoe', 'available' => false, 'tz_offset_hours' => 0.0) end before do - allow(subject).to receive_message_chain(:gitlab, :mr_author).and_return(author.username) + allow(subject).to receive(:mr_author_username).and_return(author.username) end (-4..4).each do |utc_offset| @@ -328,7 +330,7 @@ RSpec.describe Gitlab::Danger::Roulette do selected = subject.spin_for_person(persons, random: Random.new, timezone_experiment: timezone_experiment) - expect(selected.username).to be_in(persons.map(&:username)) + expect(persons.map(&:username)).to include(selected.username) end end end @@ -349,7 +351,7 @@ RSpec.describe Gitlab::Danger::Roulette do if timezone_experiment expect(selected).to be_nil else - expect(selected.username).to be_in(persons.map(&:username)) + expect(persons.map(&:username)).to include(selected.username) end end end diff --git a/spec/lib/gitlab/danger/teammate_spec.rb b/spec/lib/gitlab/danger/teammate_spec.rb index a0540a9fbf5..385eb4e9b69 100644 --- a/spec/lib/gitlab/danger/teammate_spec.rb +++ b/spec/lib/gitlab/danger/teammate_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'fast_spec_helper' - require 'timecop' require 'rspec-parameterized' @@ -10,16 +8,16 @@ require 'gitlab/danger/teammate' RSpec.describe Gitlab::Danger::Teammate do using RSpec::Parameterized::TableSyntax - subject { described_class.new(options.stringify_keys) } + subject { described_class.new(options) } let(:tz_offset_hours) { 2.0 } let(:options) do { - username: 'luigi', - projects: projects, - role: role, - markdown_name: '[Luigi](https://gitlab.com/luigi) (`@luigi`)', - tz_offset_hours: tz_offset_hours + 'username' => 'luigi', + 'projects' => projects, + 'role' => role, + 'markdown_name' => '[Luigi](https://gitlab.com/luigi) (`@luigi`)', + 'tz_offset_hours' => tz_offset_hours } end let(:capabilities) { ['reviewer backend'] } @@ -28,6 +26,26 @@ RSpec.describe Gitlab::Danger::Teammate do let(:labels) { [] } let(:project) { double } + describe '#==' do + it 'compares Teammate username' do + joe1 = described_class.new('username' => 'joe', 'projects' => projects) + joe2 = described_class.new('username' => 'joe', 'projects' => []) + jane1 = described_class.new('username' => 'jane', 'projects' => projects) + jane2 = described_class.new('username' => 'jane', 'projects' => []) + + expect(joe1).to eq(joe2) + expect(jane1).to eq(jane2) + expect(jane1).not_to eq(nil) + expect(described_class.new('username' => nil)).not_to eq(nil) + end + end + + describe '#to_h' do + it 'returns the given options' do + expect(subject.to_h).to eq(options) + end + end + context 'when having multiple capabilities' do let(:capabilities) { ['reviewer backend', 'maintainer frontend', 'trainee_maintainer qa'] } @@ -153,21 +171,21 @@ RSpec.describe Gitlab::Danger::Teammate do describe '#markdown_name' do context 'when timezone_experiment == false' do it 'returns markdown name as-is' do - expect(subject.markdown_name).to eq(options[:markdown_name]) - expect(subject.markdown_name(timezone_experiment: false)).to eq(options[:markdown_name]) + expect(subject.markdown_name).to eq(options['markdown_name']) + expect(subject.markdown_name(timezone_experiment: false)).to eq(options['markdown_name']) end end context 'when timezone_experiment == true' do it 'returns markdown name with timezone info' do - expect(subject.markdown_name(timezone_experiment: true)).to eq("#{options[:markdown_name]} (UTC+2)") + expect(subject.markdown_name(timezone_experiment: true)).to eq("#{options['markdown_name']} (UTC+2)") end context 'when offset is 1.5' do let(:tz_offset_hours) { 1.5 } it 'returns markdown name with timezone info, not truncated' do - expect(subject.markdown_name(timezone_experiment: true)).to eq("#{options[:markdown_name]} (UTC+1.5)") + expect(subject.markdown_name(timezone_experiment: true)).to eq("#{options['markdown_name']} (UTC+1.5)") end end @@ -185,12 +203,12 @@ RSpec.describe Gitlab::Danger::Teammate do with_them do it 'returns markdown name with timezone info' do - author = described_class.new(options.merge(username: 'mario', tz_offset_hours: author_offset).stringify_keys) + author = described_class.new(options.merge('username' => 'mario', 'tz_offset_hours' => author_offset)) floored_offset_hours = subject.__send__(:floored_offset_hours) utc_offset = floored_offset_hours >= 0 ? "+#{floored_offset_hours}" : floored_offset_hours - expect(subject.markdown_name(timezone_experiment: true, author: author)).to eq("#{options[:markdown_name]} (UTC#{utc_offset}, #{diff_text})") + expect(subject.markdown_name(timezone_experiment: true, author: author)).to eq("#{options['markdown_name']} (UTC#{utc_offset}, #{diff_text})") end end end diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb index a340e69df65..3bc8151b7db 100644 --- a/spec/lib/gitlab/usage_data_spec.rb +++ b/spec/lib/gitlab/usage_data_spec.rb @@ -155,13 +155,13 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do expect(described_class.uncached_data[:usage_activity_by_stage][:manage]).to include( events: 2, groups: 2, - users_created: Gitlab.ee? ? 6 : 5, + users_created: 6, 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, + users_created: 4, omniauth_providers: ['google_oauth2'] ) end @@ -203,21 +203,26 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures 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.uncached_data[:usage_activity_by_stage][:plan]).to include( - issues: 2, + issues: 3, notes: 2, projects: 2, - todos: 2 + todos: 2, + service_desk_enabled_projects: 2, + service_desk_issues: 2 ) expect(described_class.uncached_data[:usage_activity_by_stage_monthly][:plan]).to include( - issues: 1, + issues: 2, notes: 1, projects: 1, - todos: 1 + todos: 1, + service_desk_enabled_projects: 1, + service_desk_issues: 1 ) end end @@ -974,4 +979,17 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do }) 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 |