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
path: root/spec/lib
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib')
-rw-r--r--spec/lib/gitlab/background_migration/add_merge_request_diff_commits_count_spec.rb66
-rw-r--r--spec/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule_spec.rb61
-rw-r--r--spec/lib/gitlab/background_migration/backfill_deployment_clusters_from_deployments_spec.rb44
-rw-r--r--spec/lib/gitlab/background_migration/backfill_environment_id_deployment_merge_requests_spec.rb46
-rw-r--r--spec/lib/gitlab/background_migration/backfill_merge_request_cleanup_schedules_spec.rb53
-rw-r--r--spec/lib/gitlab/background_migration/backfill_namespace_settings_spec.rb23
-rw-r--r--spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb24
-rw-r--r--spec/lib/gitlab/background_migration/backfill_push_rules_id_in_projects_spec.rb32
-rw-r--r--spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb49
-rw-r--r--spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb104
-rw-r--r--spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb98
-rw-r--r--spec/lib/gitlab/background_migration/link_lfs_objects_projects_spec.rb113
-rw-r--r--spec/lib/gitlab/background_migration/migrate_fingerprint_sha256_within_keys_spec.rb93
-rw-r--r--spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb36
-rw-r--r--spec/lib/gitlab/background_migration/migrate_to_hashed_storage_spec.rb43
-rw-r--r--spec/lib/gitlab/background_migration/populate_canonical_emails_spec.rb94
-rw-r--r--spec/lib/gitlab/background_migration/populate_dismissed_state_for_vulnerabilities_spec.rb44
-rw-r--r--spec/lib/gitlab/background_migration/populate_has_vulnerabilities_spec.rb63
-rw-r--r--spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb70
-rw-r--r--spec/lib/gitlab/background_migration/populate_missing_vulnerability_dismissal_information_spec.rb65
-rw-r--r--spec/lib/gitlab/background_migration/populate_personal_snippet_statistics_spec.rb141
-rw-r--r--spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb224
-rw-r--r--spec/lib/gitlab/background_migration/recalculate_project_authorizations_with_min_max_user_id_spec.rb38
-rw-r--r--spec/lib/gitlab/background_migration/replace_blocked_by_links_spec.rb42
-rw-r--r--spec/lib/gitlab/background_migration/reset_merge_status_spec.rb48
-rw-r--r--spec/lib/gitlab/background_migration/reset_shared_runners_for_transferred_projects_spec.rb35
-rw-r--r--spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb51
-rw-r--r--spec/lib/gitlab/background_migration/update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb46
-rw-r--r--spec/lib/gitlab/background_migration/update_existing_users_that_require_two_factor_auth_spec.rb74
-rw-r--r--spec/lib/sidebars/concerns/link_with_html_options_spec.rb39
30 files changed, 39 insertions, 1920 deletions
diff --git a/spec/lib/gitlab/background_migration/add_merge_request_diff_commits_count_spec.rb b/spec/lib/gitlab/background_migration/add_merge_request_diff_commits_count_spec.rb
deleted file mode 100644
index 1e72b249c19..00000000000
--- a/spec/lib/gitlab/background_migration/add_merge_request_diff_commits_count_spec.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::AddMergeRequestDiffCommitsCount do
- let(:namespaces_table) { table(:namespaces) }
- let(:projects_table) { table(:projects) }
- let(:merge_requests_table) { table(:merge_requests) }
- let(:merge_request_diffs_table) { table(:merge_request_diffs) }
- let(:merge_request_diff_commits_table) { table(:merge_request_diff_commits) }
-
- let(:namespace) { namespaces_table.create!(name: 'gitlab-org', path: 'gitlab-org') }
- let(:project) { projects_table.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: namespace.id) }
- let(:merge_request) do
- merge_requests_table.create!(target_project_id: project.id,
- target_branch: 'master',
- source_project_id: project.id,
- source_branch: 'mr name',
- title: 'mr name')
- end
-
- def create_diff!(name, commits: 0)
- mr_diff = merge_request_diffs_table.create!(
- merge_request_id: merge_request.id)
-
- commits.times do |i|
- merge_request_diff_commits_table.create!(
- merge_request_diff_id: mr_diff.id,
- relative_order: i, sha: i)
- end
-
- mr_diff
- end
-
- describe '#perform' do
- it 'migrates diffs that have no commits' do
- diff = create_diff!('with_multiple_commits', commits: 0)
-
- subject.perform(diff.id, diff.id)
-
- expect(diff.reload.commits_count).to eq(0)
- end
-
- it 'skips diffs that have commits_count already set' do
- timestamp = 2.days.ago
- diff = merge_request_diffs_table.create!(
- merge_request_id: merge_request.id,
- commits_count: 0,
- updated_at: timestamp)
-
- subject.perform(diff.id, diff.id)
-
- expect(diff.reload.updated_at).to be_within(1.second).of(timestamp)
- end
-
- it 'migrates multiple diffs to the correct values' do
- diffs = Array.new(3).map.with_index { |_, i| create_diff!(i, commits: 3) }
-
- subject.perform(diffs.first.id, diffs.last.id)
-
- diffs.each do |diff|
- expect(diff.reload.commits_count).to eq(3)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule_spec.rb b/spec/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule_spec.rb
deleted file mode 100644
index 0b29163671c..00000000000
--- a/spec/lib/gitlab/background_migration/add_modified_to_approval_merge_request_rule_spec.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::AddModifiedToApprovalMergeRequestRule, schema: 20181228175414 do
- let(:determine_if_rules_are_modified) { described_class.new }
-
- let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab') }
- let(:projects) { table(:projects) }
- let(:normal_project) { projects.create!(namespace_id: namespace.id) }
- let(:overridden_project) { projects.create!(namespace_id: namespace.id) }
- let(:rules) { table(:approval_merge_request_rules) }
- let(:project_rules) { table(:approval_project_rules) }
- let(:sources) { table(:approval_merge_request_rule_sources) }
- let(:merge_requests) { table(:merge_requests) }
- let(:groups) { table(:namespaces) }
- let(:mr_groups) { table(:approval_merge_request_rules_groups) }
- let(:project_groups) { table(:approval_project_rules_groups) }
-
- before do
- project_rule = project_rules.create!(project_id: normal_project.id, approvals_required: 3, name: 'test rule')
- overridden_project_rule = project_rules.create!(project_id: overridden_project.id, approvals_required: 5, name: 'other test rule')
- overridden_project_rule_two = project_rules.create!(project_id: overridden_project.id, approvals_required: 7, name: 'super cool rule')
-
- merge_request = merge_requests.create!(target_branch: 'feature', source_branch: 'default', source_project_id: normal_project.id, target_project_id: normal_project.id)
- overridden_merge_request = merge_requests.create!(target_branch: 'feature-2', source_branch: 'default', source_project_id: overridden_project.id, target_project_id: overridden_project.id)
-
- merge_rule = rules.create!(merge_request_id: merge_request.id, approvals_required: 3, name: 'test rule')
- overridden_merge_rule = rules.create!(merge_request_id: overridden_merge_request.id, approvals_required: 6, name: 'other test rule')
- overridden_merge_rule_two = rules.create!(merge_request_id: overridden_merge_request.id, approvals_required: 7, name: 'super cool rule')
-
- sources.create!(approval_project_rule_id: project_rule.id, approval_merge_request_rule_id: merge_rule.id)
- sources.create!(approval_project_rule_id: overridden_project_rule.id, approval_merge_request_rule_id: overridden_merge_rule.id)
- sources.create!(approval_project_rule_id: overridden_project_rule_two.id, approval_merge_request_rule_id: overridden_merge_rule_two.id)
-
- group1 = groups.create!(name: "group1", path: "test_group1", type: 'Group')
- group2 = groups.create!(name: "group2", path: "test_group2", type: 'Group')
- group3 = groups.create!(name: "group3", path: "test_group3", type: 'Group')
-
- project_groups.create!(approval_project_rule_id: overridden_project_rule_two.id, group_id: group1.id)
- project_groups.create!(approval_project_rule_id: overridden_project_rule_two.id, group_id: group2.id)
- project_groups.create!(approval_project_rule_id: overridden_project_rule_two.id, group_id: group3.id)
-
- mr_groups.create!(approval_merge_request_rule_id: overridden_merge_rule.id, group_id: group1.id)
- mr_groups.create!(approval_merge_request_rule_id: overridden_merge_rule_two.id, group_id: group2.id)
- end
-
- describe '#perform' do
- it 'changes the correct rules' do
- original_count = rules.all.count
-
- determine_if_rules_are_modified.perform(rules.minimum(:id), rules.maximum(:id))
-
- results = rules.where(modified_from_project_rule: true)
-
- expect(results.count).to eq 2
- expect(results.collect(&:name)).to eq(['other test rule', 'super cool rule'])
- expect(rules.count).to eq original_count
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_deployment_clusters_from_deployments_spec.rb b/spec/lib/gitlab/background_migration/backfill_deployment_clusters_from_deployments_spec.rb
deleted file mode 100644
index 1404ada3647..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_deployment_clusters_from_deployments_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillDeploymentClustersFromDeployments, :migration, schema: 20181228175414 do
- subject { described_class.new }
-
- describe '#perform' do
- it 'backfills deployment_cluster for all deployments in the given range with a non-null cluster_id' do
- deployment_clusters = table(:deployment_clusters)
-
- namespace = table(:namespaces).create!(name: 'the-namespace', path: 'the-path')
- project = table(:projects).create!(name: 'the-project', namespace_id: namespace.id)
- environment = table(:environments).create!(name: 'the-environment', project_id: project.id, slug: 'slug')
- cluster = table(:clusters).create!(name: 'the-cluster')
-
- deployment_data = { cluster_id: cluster.id, project_id: project.id, environment_id: environment.id, ref: 'abc', tag: false, sha: 'sha', status: 1 }
- expected_deployment_1 = create_deployment(**deployment_data)
- create_deployment(**deployment_data, cluster_id: nil) # no cluster_id
- expected_deployment_2 = create_deployment(**deployment_data)
- out_of_range_deployment = create_deployment(**deployment_data, cluster_id: cluster.id) # expected to be out of range
-
- # to test "ON CONFLICT DO NOTHING"
- existing_record_for_deployment_2 = deployment_clusters.create!(
- deployment_id: expected_deployment_2.id,
- cluster_id: expected_deployment_2.cluster_id,
- kubernetes_namespace: 'production'
- )
-
- subject.perform(expected_deployment_1.id, out_of_range_deployment.id - 1)
-
- expect(deployment_clusters.all.pluck(:deployment_id, :cluster_id, :kubernetes_namespace)).to contain_exactly(
- [expected_deployment_1.id, cluster.id, nil],
- [expected_deployment_2.id, cluster.id, existing_record_for_deployment_2.kubernetes_namespace]
- )
- end
-
- def create_deployment(**data)
- @iid ||= 0
- @iid += 1
- table(:deployments).create!(iid: @iid, **data)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_environment_id_deployment_merge_requests_spec.rb b/spec/lib/gitlab/background_migration/backfill_environment_id_deployment_merge_requests_spec.rb
deleted file mode 100644
index 9194525e713..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_environment_id_deployment_merge_requests_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillEnvironmentIdDeploymentMergeRequests, schema: 20181228175414 do
- let(:environments) { table(:environments) }
- let(:merge_requests) { table(:merge_requests) }
- let(:deployments) { table(:deployments) }
- let(:deployment_merge_requests) { table(:deployment_merge_requests) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- subject(:migration) { described_class.new }
-
- it 'correctly backfills environment_id column' do
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- project = projects.create!(namespace_id: namespace.id)
-
- production = environments.create!(project_id: project.id, name: 'production', slug: 'production')
- staging = environments.create!(project_id: project.id, name: 'staging', slug: 'staging')
-
- mr = merge_requests.create!(source_branch: 'x', target_branch: 'master', target_project_id: project.id)
-
- deployment1 = deployments.create!(environment_id: staging.id, iid: 1, project_id: project.id, ref: 'master', tag: false, sha: '123abcdef', status: 1)
- deployment2 = deployments.create!(environment_id: production.id, iid: 2, project_id: project.id, ref: 'master', tag: false, sha: '123abcdef', status: 1)
- deployment3 = deployments.create!(environment_id: production.id, iid: 3, project_id: project.id, ref: 'master', tag: false, sha: '123abcdef', status: 1)
-
- # mr is tracked twice in production through deployment2 and deployment3
- deployment_merge_requests.create!(deployment_id: deployment1.id, merge_request_id: mr.id)
- deployment_merge_requests.create!(deployment_id: deployment2.id, merge_request_id: mr.id)
- deployment_merge_requests.create!(deployment_id: deployment3.id, merge_request_id: mr.id)
-
- expect(deployment_merge_requests.where(environment_id: nil).count).to eq(3)
-
- migration.backfill_range(1, mr.id)
-
- expect(deployment_merge_requests.where(environment_id: nil).count).to be_zero
- expect(deployment_merge_requests.count).to eq(2)
-
- production_deployments = deployment_merge_requests.where(environment_id: production.id)
- expect(production_deployments.count).to eq(1)
- expect(production_deployments.first.deployment_id).to eq(deployment2.id)
-
- expect(deployment_merge_requests.where(environment_id: staging.id).count).to eq(1)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_merge_request_cleanup_schedules_spec.rb b/spec/lib/gitlab/background_migration/backfill_merge_request_cleanup_schedules_spec.rb
deleted file mode 100644
index d33f52514da..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_merge_request_cleanup_schedules_spec.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillMergeRequestCleanupSchedules, schema: 20181228175414 do
- let(:merge_requests) { table(:merge_requests) }
- let(:cleanup_schedules) { table(:merge_request_cleanup_schedules) }
- let(:metrics) { table(:merge_request_metrics) }
-
- let(:namespace) { table(:namespaces).create!(name: 'name', path: 'path') }
- let(:project) { table(:projects).create!(namespace_id: namespace.id) }
-
- subject { described_class.new }
-
- describe '#perform' do
- let!(:open_mr) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master') }
-
- let!(:closed_mr_1) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 2) }
- let!(:closed_mr_2) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 2) }
- let!(:closed_mr_1_metrics) { metrics.create!(merge_request_id: closed_mr_1.id, target_project_id: project.id, latest_closed_at: Time.current, created_at: Time.current, updated_at: Time.current) }
- let!(:closed_mr_2_metrics) { metrics.create!(merge_request_id: closed_mr_2.id, target_project_id: project.id, latest_closed_at: Time.current, created_at: Time.current, updated_at: Time.current) }
- let!(:closed_mr_2_cleanup_schedule) { cleanup_schedules.create!(merge_request_id: closed_mr_2.id, scheduled_at: Time.current) }
-
- let!(:merged_mr_1) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 3) }
- let!(:merged_mr_2) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 3, updated_at: Time.current) }
- let!(:merged_mr_1_metrics) { metrics.create!(merge_request_id: merged_mr_1.id, target_project_id: project.id, merged_at: Time.current, created_at: Time.current, updated_at: Time.current) }
-
- let!(:closed_mr_3) { merge_requests.create!(target_project_id: project.id, source_branch: 'master', target_branch: 'master', state_id: 2) }
- let!(:closed_mr_3_metrics) { metrics.create!(merge_request_id: closed_mr_3.id, target_project_id: project.id, latest_closed_at: Time.current, created_at: Time.current, updated_at: Time.current) }
-
- it 'creates records for all closed and merged merge requests in range' do
- expect(Gitlab::BackgroundMigration::Logger).to receive(:info).with(
- message: 'Backfilled merge_request_cleanup_schedules records',
- count: 3
- )
-
- subject.perform(open_mr.id, merged_mr_2.id)
-
- aggregate_failures do
- expect(cleanup_schedules.all.pluck(:merge_request_id))
- .to contain_exactly(closed_mr_1.id, closed_mr_2.id, merged_mr_1.id, merged_mr_2.id)
- expect(cleanup_schedules.find_by(merge_request_id: closed_mr_1.id).scheduled_at.to_s)
- .to eq((closed_mr_1_metrics.latest_closed_at + 14.days).to_s)
- expect(cleanup_schedules.find_by(merge_request_id: closed_mr_2.id).scheduled_at.to_s)
- .to eq(closed_mr_2_cleanup_schedule.scheduled_at.to_s)
- expect(cleanup_schedules.find_by(merge_request_id: merged_mr_1.id).scheduled_at.to_s)
- .to eq((merged_mr_1_metrics.merged_at + 14.days).to_s)
- expect(cleanup_schedules.find_by(merge_request_id: merged_mr_2.id).scheduled_at.to_s)
- .to eq((merged_mr_2.updated_at + 14.days).to_s)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_namespace_settings_spec.rb b/spec/lib/gitlab/background_migration/backfill_namespace_settings_spec.rb
deleted file mode 100644
index 0f8adca2ca4..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_namespace_settings_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillNamespaceSettings, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:namespace_settings) { table(:namespace_settings) }
- let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
-
- subject { described_class.new }
-
- describe '#perform' do
- it 'creates settings for all projects in range' do
- namespaces.create!(id: 5, name: 'test1', path: 'test1')
- namespaces.create!(id: 7, name: 'test2', path: 'test2')
- namespaces.create!(id: 8, name: 'test3', path: 'test3')
-
- subject.perform(5, 7)
-
- expect(namespace_settings.all.pluck(:namespace_id)).to contain_exactly(5, 7)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb b/spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb
deleted file mode 100644
index e6b0db2ab73..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillProjectSettings, schema: 20181228175414 do
- let(:projects) { table(:projects) }
- let(:project_settings) { table(:project_settings) }
- let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
- let(:project) { projects.create!(namespace_id: namespace.id) }
-
- subject { described_class.new }
-
- describe '#perform' do
- it 'creates settings for all projects in range' do
- projects.create!(id: 5, namespace_id: namespace.id)
- projects.create!(id: 7, namespace_id: namespace.id)
- projects.create!(id: 8, namespace_id: namespace.id)
-
- subject.perform(5, 7)
-
- expect(project_settings.all.pluck(:project_id)).to contain_exactly(5, 7)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_push_rules_id_in_projects_spec.rb b/spec/lib/gitlab/background_migration/backfill_push_rules_id_in_projects_spec.rb
deleted file mode 100644
index 3468df3dccd..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_push_rules_id_in_projects_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillPushRulesIdInProjects, :migration, schema: 20181228175414 do
- let(:push_rules) { table(:push_rules) }
- let(:projects) { table(:projects) }
- let(:project_settings) { table(:project_settings) }
- let(:namespace) { table(:namespaces).create!(name: 'user', path: 'user') }
-
- subject { described_class.new }
-
- describe '#perform' do
- it 'creates new project push_rules for all push rules in the range' do
- project_1 = projects.create!(id: 1, namespace_id: namespace.id)
- project_2 = projects.create!(id: 2, namespace_id: namespace.id)
- project_3 = projects.create!(id: 3, namespace_id: namespace.id)
- project_settings_1 = project_settings.create!(project_id: project_1.id)
- project_settings_2 = project_settings.create!(project_id: project_2.id)
- project_settings_3 = project_settings.create!(project_id: project_3.id)
- push_rule_1 = push_rules.create!(id: 5, is_sample: false, project_id: project_1.id)
- push_rule_2 = push_rules.create!(id: 6, is_sample: false, project_id: project_2.id)
- push_rules.create!(id: 8, is_sample: false, project_id: 3)
-
- subject.perform(5, 7)
-
- expect(project_settings_1.reload.push_rule_id).to eq(push_rule_1.id)
- expect(project_settings_2.reload.push_rule_id).to eq(push_rule_2.id)
- expect(project_settings_3.reload.push_rule_id).to be_nil
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb b/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb
deleted file mode 100644
index 35ec8be691a..00000000000
--- a/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::FixPromotedEpicsDiscussionIds, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:users) { table(:users) }
- let(:epics) { table(:epics) }
- let(:notes) { table(:notes) }
-
- let(:user) { users.create!(email: 'test@example.com', projects_limit: 100, username: 'test') }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:epic1) { epics.create!(id: 1, author_id: user.id, iid: 1, group_id: namespace.id, title: 'Epic with discussion', title_html: 'Epic with discussion') }
-
- def create_note(discussion_id)
- notes.create!(note: 'note comment',
- noteable_id: epic1.id,
- noteable_type: 'Epic',
- discussion_id: discussion_id)
- end
-
- def expect_valid_discussion_id(id)
- expect(id).to match(/\A\h{40}\z/)
- end
-
- describe '#perform with batch of discussion ids' do
- it 'updates discussion ids' do
- note1 = create_note('00000000')
- note2 = create_note('00000000')
- note3 = create_note('10000000')
-
- subject.perform(%w(00000000 10000000))
-
- expect_valid_discussion_id(note1.reload.discussion_id)
- expect_valid_discussion_id(note2.reload.discussion_id)
- expect_valid_discussion_id(note3.reload.discussion_id)
- expect(note1.discussion_id).to eq(note2.discussion_id)
- expect(note1.discussion_id).not_to eq(note3.discussion_id)
- end
-
- it 'skips notes with discussion id not in range' do
- note4 = create_note('20000000')
-
- subject.perform(%w(00000000 10000000))
-
- expect(note4.reload.discussion_id).to eq('20000000')
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb b/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb
deleted file mode 100644
index 95509f9b897..00000000000
--- a/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::FixUserNamespaceNames, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:users) { table(:users) }
- let(:user) { users.create!(name: "The user's full name", projects_limit: 10, username: 'not-null', email: '1') }
-
- context 'updating the namespace names' do
- it 'updates a user namespace within range' do
- user2 = users.create!(name: "Other user's full name", projects_limit: 10, username: 'also-not-null', email: '2')
- user_namespace1 = namespaces.create!(
- id: 2,
- owner_id: user.id,
- name: "Should be the user's name",
- path: user.username
- )
- user_namespace2 = namespaces.create!(
- id: 3,
- owner_id: user2.id,
- name: "Should also be the user's name",
- path: user.username
- )
-
- described_class.new.perform(1, 5)
-
- expect(user_namespace1.reload.name).to eq("The user's full name")
- expect(user_namespace2.reload.name).to eq("Other user's full name")
- end
-
- it 'does not update namespaces out of range' do
- user_namespace = namespaces.create!(
- id: 6,
- owner_id: user.id,
- name: "Should be the user's name",
- path: user.username
- )
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { user_namespace.reload.name }
- end
-
- it 'does not update groups owned by the users' do
- user_group = namespaces.create!(
- id: 2,
- owner_id: user.id,
- name: 'A group name',
- path: 'the-path',
- type: 'Group'
- )
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { user_group.reload.name }
- end
- end
-
- context 'namespace route names' do
- let(:routes) { table(:routes) }
- let(:namespace) do
- namespaces.create!(
- id: 2,
- owner_id: user.id,
- name: "Will be updated to the user's name",
- path: user.username
- )
- end
-
- it "updates the route name if it didn't match the namespace" do
- route = routes.create!(path: namespace.path, name: 'Incorrect name', source_type: 'Namespace', source_id: namespace.id)
-
- described_class.new.perform(1, 5)
-
- expect(route.reload.name).to eq("The user's full name")
- end
-
- it 'updates the route name if it was nil match the namespace' do
- route = routes.create!(path: namespace.path, name: nil, source_type: 'Namespace', source_id: namespace.id)
-
- described_class.new.perform(1, 5)
-
- expect(route.reload.name).to eq("The user's full name")
- end
-
- it "doesn't update group routes" do
- route = routes.create!(path: 'group-path', name: 'Group name', source_type: 'Group', source_id: namespace.id)
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { route.reload.name }
- end
-
- it "doesn't touch routes for namespaces out of range" do
- user_namespace = namespaces.create!(
- id: 6,
- owner_id: user.id,
- name: "Should be the user's name",
- path: user.username
- )
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { user_namespace.reload.name }
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb b/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb
deleted file mode 100644
index b4444df674e..00000000000
--- a/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::FixUserProjectRouteNames, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:users) { table(:users) }
- let(:routes) { table(:routes) }
- let(:projects) { table(:projects) }
-
- let(:user) { users.create!(name: "The user's full name", projects_limit: 10, username: 'not-null', email: '1') }
-
- let(:namespace) do
- namespaces.create!(
- owner_id: user.id,
- name: "Should eventually be the user's name",
- path: user.username
- )
- end
-
- let(:project) do
- projects.create!(namespace_id: namespace.id, name: 'Project Name')
- end
-
- it "updates the route for a project if it did not match the user's name" do
- route = routes.create!(
- id: 1,
- path: "#{user.username}/#{project.path}",
- source_id: project.id,
- source_type: 'Project',
- name: 'Completely wrong'
- )
-
- described_class.new.perform(1, 5)
-
- expect(route.reload.name).to eq("The user's full name / Project Name")
- end
-
- it 'updates the route for a project if the name was nil' do
- route = routes.create!(
- id: 1,
- path: "#{user.username}/#{project.path}",
- source_id: project.id,
- source_type: 'Project',
- name: nil
- )
-
- described_class.new.perform(1, 5)
-
- expect(route.reload.name).to eq("The user's full name / Project Name")
- end
-
- it 'does not update routes that were are out of the range' do
- route = routes.create!(
- id: 6,
- path: "#{user.username}/#{project.path}",
- source_id: project.id,
- source_type: 'Project',
- name: 'Completely wrong'
- )
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { route.reload.name }
- end
-
- it 'does not update routes for projects in groups owned by the user' do
- group = namespaces.create!(
- owner_id: user.id,
- name: 'A group',
- path: 'a-path',
- type: ''
- )
- project = projects.create!(namespace_id: group.id, name: 'Project Name')
- route = routes.create!(
- id: 1,
- path: "#{group.path}/#{project.path}",
- source_id: project.id,
- source_type: 'Project',
- name: 'Completely wrong'
- )
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { route.reload.name }
- end
-
- it 'does not update routes for namespaces' do
- route = routes.create!(
- id: 1,
- path: namespace.path,
- source_id: namespace.id,
- source_type: 'Namespace',
- name: 'Completely wrong'
- )
-
- expect { described_class.new.perform(1, 5) }
- .not_to change { route.reload.name }
- end
-end
diff --git a/spec/lib/gitlab/background_migration/link_lfs_objects_projects_spec.rb b/spec/lib/gitlab/background_migration/link_lfs_objects_projects_spec.rb
deleted file mode 100644
index 64e8afedf52..00000000000
--- a/spec/lib/gitlab/background_migration/link_lfs_objects_projects_spec.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::LinkLfsObjectsProjects, :migration, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:fork_networks) { table(:fork_networks) }
- let(:fork_network_members) { table(:fork_network_members) }
- let(:lfs_objects) { table(:lfs_objects) }
- let(:lfs_objects_projects) { table(:lfs_objects_projects) }
-
- let(:namespace) { namespaces.create!(name: 'GitLab', path: 'gitlab') }
-
- let(:fork_network) { fork_networks.create!(root_project_id: source_project.id) }
- let(:another_fork_network) { fork_networks.create!(root_project_id: another_source_project.id) }
-
- let(:source_project) { projects.create!(namespace_id: namespace.id) }
- let(:another_source_project) { projects.create!(namespace_id: namespace.id) }
- let(:project) { projects.create!(namespace_id: namespace.id) }
- let(:another_project) { projects.create!(namespace_id: namespace.id) }
- let(:partially_linked_project) { projects.create!(namespace_id: namespace.id) }
- let(:fully_linked_project) { projects.create!(namespace_id: namespace.id) }
-
- let(:lfs_object) { lfs_objects.create!(oid: 'abc123', size: 100) }
- let(:another_lfs_object) { lfs_objects.create!(oid: 'def456', size: 200) }
-
- let!(:source_project_lop_1) do
- lfs_objects_projects.create!(
- lfs_object_id: lfs_object.id,
- project_id: source_project.id
- )
- end
-
- let!(:source_project_lop_2) do
- lfs_objects_projects.create!(
- lfs_object_id: another_lfs_object.id,
- project_id: source_project.id
- )
- end
-
- let!(:another_source_project_lop_1) do
- lfs_objects_projects.create!(
- lfs_object_id: lfs_object.id,
- project_id: another_source_project.id
- )
- end
-
- let!(:another_source_project_lop_2) do
- lfs_objects_projects.create!(
- lfs_object_id: another_lfs_object.id,
- project_id: another_source_project.id
- )
- end
-
- before do
- stub_const("#{described_class}::BATCH_SIZE", 2)
-
- # Create links between projects
- fork_network_members.create!(fork_network_id: fork_network.id, project_id: source_project.id, forked_from_project_id: nil)
-
- [project, partially_linked_project, fully_linked_project].each do |p|
- fork_network_members.create!(
- fork_network_id: fork_network.id,
- project_id: p.id,
- forked_from_project_id: fork_network.root_project_id
- )
- end
-
- fork_network_members.create!(fork_network_id: another_fork_network.id, project_id: another_source_project.id, forked_from_project_id: nil)
- fork_network_members.create!(fork_network_id: another_fork_network.id, project_id: another_project.id, forked_from_project_id: another_fork_network.root_project_id)
-
- # Links LFS objects to some projects
- lfs_objects_projects.create!(lfs_object_id: lfs_object.id, project_id: fully_linked_project.id)
- lfs_objects_projects.create!(lfs_object_id: another_lfs_object.id, project_id: fully_linked_project.id)
- lfs_objects_projects.create!(lfs_object_id: lfs_object.id, project_id: partially_linked_project.id)
- end
-
- context 'when there are LFS objects to be linked' do
- it 'creates LfsObjectsProject records for forks based on the specified range of LfsObjectProject id' do
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |logger|
- expect(logger).to receive(:info).exactly(4).times
- end
-
- expect { subject.perform(source_project_lop_1.id, another_source_project_lop_2.id) }.to change { lfs_objects_projects.count }.by(5)
-
- expect(lfs_object_ids_for(project)).to match_array(lfs_object_ids_for(source_project))
- expect(lfs_object_ids_for(another_project)).to match_array(lfs_object_ids_for(another_source_project))
- expect(lfs_object_ids_for(partially_linked_project)).to match_array(lfs_object_ids_for(source_project))
-
- expect { subject.perform(source_project_lop_1.id, another_source_project_lop_2.id) }.not_to change { lfs_objects_projects.count }
- end
- end
-
- context 'when there are no LFS objects to be linked' do
- before do
- # Links LFS objects to all projects
- projects.all.each do |p|
- lfs_objects_projects.create!(lfs_object_id: lfs_object.id, project_id: p.id)
- lfs_objects_projects.create!(lfs_object_id: another_lfs_object.id, project_id: p.id)
- end
- end
-
- it 'does not create LfsObjectProject records' do
- expect { subject.perform(source_project_lop_1.id, another_source_project_lop_2.id) }
- .not_to change { lfs_objects_projects.count }
- end
- end
-
- def lfs_object_ids_for(project)
- lfs_objects_projects.where(project_id: project.id).pluck(:lfs_object_id)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/migrate_fingerprint_sha256_within_keys_spec.rb b/spec/lib/gitlab/background_migration/migrate_fingerprint_sha256_within_keys_spec.rb
deleted file mode 100644
index 4287d6723cf..00000000000
--- a/spec/lib/gitlab/background_migration/migrate_fingerprint_sha256_within_keys_spec.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::MigrateFingerprintSha256WithinKeys, schema: 20181228175414 do
- subject(:fingerprint_migrator) { described_class.new }
-
- let(:key_table) { table(:keys) }
-
- before do
- generate_fingerprints!
- end
-
- it 'correctly creates a sha256 fingerprint for a key' do
- key_1 = Key.find(1017)
- key_2 = Key.find(1027)
-
- expect(key_1.fingerprint_md5).to eq('ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1')
- expect(key_1.fingerprint_sha256).to eq(nil)
-
- expect(key_2.fingerprint_md5).to eq('39:e3:64:a6:24:ea:45:a2:8c:55:2a:e9:4d:4f:1f:b4')
- expect(key_2.fingerprint_sha256).to eq(nil)
-
- query_count = ActiveRecord::QueryRecorder.new do
- fingerprint_migrator.perform(1, 10000)
- end.count
-
- expect(query_count).to eq(8)
-
- key_1.reload
- key_2.reload
-
- expect(key_1.fingerprint_md5).to eq('ba:81:59:68:d7:6c:cd:02:02:bf:6a:9b:55:4e:af:d1')
- expect(key_1.fingerprint_sha256).to eq('nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo/lCg')
-
- expect(key_2.fingerprint_md5).to eq('39:e3:64:a6:24:ea:45:a2:8c:55:2a:e9:4d:4f:1f:b4')
- expect(key_2.fingerprint_sha256).to eq('zMNbLekgdjtcgDv8VSC0z5lpdACMG3Q4PUoIz5+H2jM')
- end
-
- context 'with invalid keys' do
- before do
- key = Key.find(1017)
- # double space after "ssh-rsa" leads to a
- # OpenSSL::PKey::PKeyError in Net::SSH::KeyFactory.load_data_public_key
- key.update_column(:key, key.key.gsub('ssh-rsa ', 'ssh-rsa '))
- end
-
- it 'ignores errors and does not set the fingerprint' do
- fingerprint_migrator.perform(1, 10000)
-
- key_1 = Key.find(1017)
- key_2 = Key.find(1027)
-
- expect(key_1.fingerprint_sha256).to be_nil
- expect(key_2.fingerprint_sha256).not_to be_nil
- end
- end
-
- it 'migrates all keys' do
- expect(Key.where(fingerprint_sha256: nil).count).to eq(Key.all.count)
-
- fingerprint_migrator.perform(1, 10000)
-
- expect(Key.where(fingerprint_sha256: nil).count).to eq(0)
- end
-
- def generate_fingerprints!
- values = ""
- (1000..2000).to_a.each do |record|
- key = base_key_for(record)
- fingerprint = fingerprint_for(key)
-
- values += "(#{record}, #{record}, 'test-#{record}', '#{key}', '#{fingerprint}'),"
- end
-
- update_query = <<~SQL
- INSERT INTO keys ( id, user_id, title, key, fingerprint )
- VALUES
- #{values.chomp(",")};
- SQL
-
- ActiveRecord::Base.connection.execute(update_query)
- end
-
- def base_key_for(record)
- 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt0000k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0='
- .gsub("0000", "%04d" % (record - 1)) # generate arbitrary keys with placeholder 0000 within the key above
- end
-
- def fingerprint_for(key)
- Gitlab::SSHPublicKey.new(key).fingerprint("md5")
- end
-end
diff --git a/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb b/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb
deleted file mode 100644
index b6d93b9ff54..00000000000
--- a/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::MigratePagesMetadata, schema: 20181228175414 do
- let(:projects) { table(:projects) }
-
- subject(:migrate_pages_metadata) { described_class.new }
-
- describe '#perform' do
- let(:namespaces) { table(:namespaces) }
- let(:builds) { table(:ci_builds) }
- let(:pages_metadata) { table(:project_pages_metadata) }
-
- it 'marks specified projects with successful pages deployment' do
- namespace = namespaces.create!(name: 'gitlab', path: 'gitlab-org')
- not_migrated_with_pages = projects.create!(namespace_id: namespace.id, name: 'Not Migrated With Pages')
- builds.create!(project_id: not_migrated_with_pages.id, type: 'GenericCommitStatus', status: 'success', stage: 'deploy', name: 'pages:deploy')
-
- migrated = projects.create!(namespace_id: namespace.id, name: 'Migrated')
- pages_metadata.create!(project_id: migrated.id, deployed: true)
-
- not_migrated_no_pages = projects.create!(namespace_id: namespace.id, name: 'Not Migrated No Pages')
- project_not_in_relation_scope = projects.create!(namespace_id: namespace.id, name: 'Other')
-
- ids = [not_migrated_no_pages.id, not_migrated_with_pages.id, migrated.id]
-
- migrate_pages_metadata.perform(ids.min, ids.max)
-
- expect(pages_metadata.find_by_project_id(not_migrated_with_pages.id).deployed).to eq(true)
- expect(pages_metadata.find_by_project_id(not_migrated_no_pages.id).deployed).to eq(false)
- expect(pages_metadata.find_by_project_id(migrated.id).deployed).to eq(true)
- expect(pages_metadata.find_by_project_id(project_not_in_relation_scope.id)).to be_nil
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/migrate_to_hashed_storage_spec.rb b/spec/lib/gitlab/background_migration/migrate_to_hashed_storage_spec.rb
deleted file mode 100644
index 0f7bb06e830..00000000000
--- a/spec/lib/gitlab/background_migration/migrate_to_hashed_storage_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-# rubocop:disable RSpec/FactoriesInMigrationSpecs
-RSpec.describe Gitlab::BackgroundMigration::MigrateToHashedStorage, :sidekiq, :redis do
- let(:migrator) { Gitlab::HashedStorage::Migrator.new }
-
- subject(:background_migration) { described_class.new }
-
- describe '#perform' do
- let!(:project) { create(:project, :empty_repo, :legacy_storage) }
-
- context 'with pending rollback' do
- it 'aborts rollback operation' do
- Sidekiq::Testing.disable! do
- Sidekiq::Client.push(
- 'queue' => ::HashedStorage::ProjectRollbackWorker.queue,
- 'class' => ::HashedStorage::ProjectRollbackWorker,
- 'args' => [project.id]
- )
-
- expect { background_migration.perform }.to change { migrator.rollback_pending? }.from(true).to(false)
- end
- end
- end
-
- it 'enqueues legacy projects to be migrated' do
- Sidekiq::Testing.fake! do
- expect { background_migration.perform }.to change { Sidekiq::Queues[::HashedStorage::MigratorWorker.queue].size }.by(1)
- end
- end
-
- context 'when executing all jobs' do
- it 'migrates legacy projects' do
- Sidekiq::Testing.inline! do
- expect { background_migration.perform }.to change { project.reload.legacy_storage? }.from(true).to(false)
- end
- end
- end
- end
-end
-# rubocop:enable RSpec/FactoriesInMigrationSpecs
diff --git a/spec/lib/gitlab/background_migration/populate_canonical_emails_spec.rb b/spec/lib/gitlab/background_migration/populate_canonical_emails_spec.rb
deleted file mode 100644
index 944ee98ed4a..00000000000
--- a/spec/lib/gitlab/background_migration/populate_canonical_emails_spec.rb
+++ /dev/null
@@ -1,94 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::PopulateCanonicalEmails, :migration, schema: 20181228175414 do
- let(:migration) { described_class.new }
-
- let_it_be(:users_table) { table(:users) }
- let_it_be(:user_canonical_emails_table) { table(:user_canonical_emails) }
-
- let_it_be(:users) { users_table.all }
- let_it_be(:user_canonical_emails) { user_canonical_emails_table.all }
-
- subject { migration.perform(1, 1) }
-
- describe 'gmail users' do
- using RSpec::Parameterized::TableSyntax
-
- where(:original_email, :expected_result) do
- 'legitimateuser@gmail.com' | 'legitimateuser@gmail.com'
- 'userwithplus+somestuff@gmail.com' | 'userwithplus@gmail.com'
- 'user.with.periods@gmail.com' | 'userwithperiods@gmail.com'
- 'user.with.periods.and.plus+someotherstuff@gmail.com' | 'userwithperiodsandplus@gmail.com'
- end
-
- with_them do
- it 'generates the correct canonical email' do
- create_user(email: original_email, id: 1)
-
- subject
-
- result = canonical_emails
- expect(result.count).to eq 1
- expect(result.first).to match({
- 'user_id' => 1,
- 'canonical_email' => expected_result
- })
- end
- end
- end
-
- describe 'non gmail.com domain users' do
- %w[
- legitimateuser@somedomain.com
- userwithplus+somestuff@other.com
- user.with.periods@gmail.org
- user.with.periods.and.plus+someotherstuff@orangmail.com
- ].each do |non_gmail_address|
- it 'does not generate a canonical email' do
- create_user(email: non_gmail_address, id: 1)
-
- subject
-
- expect(canonical_emails(user_id: 1).count).to eq 0
- end
- end
- end
-
- describe 'gracefully handles missing records' do
- specify { expect { subject }.not_to raise_error }
- end
-
- describe 'gracefully handles existing records, some of which may have an already-existing identical canonical_email field' do
- let_it_be(:user_one) { create_user(email: "example.user@gmail.com", id: 1) }
- let_it_be(:user_two) { create_user(email: "exampleuser@gmail.com", id: 2) }
- let_it_be(:user_email_one) { user_canonical_emails.create!(canonical_email: "exampleuser@gmail.com", user_id: user_one.id) }
-
- subject { migration.perform(1, 2) }
-
- it 'only creates one record' do
- subject
-
- expect(canonical_emails.count).not_to be_nil
- end
- end
-
- def create_user(attributes)
- default_attributes = {
- projects_limit: 0
- }
-
- users.create!(default_attributes.merge!(attributes))
- end
-
- def canonical_emails(user_id: nil)
- filter_by_id = user_id ? "WHERE user_id = #{user_id}" : ""
-
- ApplicationRecord.connection.execute <<~SQL
- SELECT canonical_email, user_id
- FROM user_canonical_emails
- #{filter_by_id};
- SQL
- end
-end
diff --git a/spec/lib/gitlab/background_migration/populate_dismissed_state_for_vulnerabilities_spec.rb b/spec/lib/gitlab/background_migration/populate_dismissed_state_for_vulnerabilities_spec.rb
deleted file mode 100644
index dc8c8c75b83..00000000000
--- a/spec/lib/gitlab/background_migration/populate_dismissed_state_for_vulnerabilities_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ::Gitlab::BackgroundMigration::PopulateDismissedStateForVulnerabilities, schema: 20181228175414 do
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:vulnerabilities) { table(:vulnerabilities) }
-
- let!(:namespace) { namespaces.create!(name: "foo", path: "bar") }
- let!(:user) { users.create!(name: 'John Doe', email: 'test@example.com', projects_limit: 5) }
- let!(:project) { projects.create!(namespace_id: namespace.id) }
- let!(:vulnerability_params) do
- {
- project_id: project.id,
- author_id: user.id,
- title: 'Vulnerability',
- severity: 5,
- confidence: 5,
- report_type: 5
- }
- end
-
- let!(:vulnerability_1) { vulnerabilities.create!(vulnerability_params.merge(state: 1)) }
- let!(:vulnerability_2) { vulnerabilities.create!(vulnerability_params.merge(state: 3)) }
-
- describe '#perform' do
- it 'changes state of vulnerability to dismissed' do
- subject.perform(vulnerability_1.id, vulnerability_2.id)
-
- expect(vulnerability_1.reload.state).to eq(2)
- expect(vulnerability_2.reload.state).to eq(2)
- end
-
- it 'populates missing dismissal information' do
- expect_next_instance_of(::Gitlab::BackgroundMigration::PopulateMissingVulnerabilityDismissalInformation) do |migration|
- expect(migration).to receive(:perform).with(vulnerability_1.id, vulnerability_2.id)
- end
-
- subject.perform(vulnerability_1.id, vulnerability_2.id)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/populate_has_vulnerabilities_spec.rb b/spec/lib/gitlab/background_migration/populate_has_vulnerabilities_spec.rb
deleted file mode 100644
index 6722321d5f7..00000000000
--- a/spec/lib/gitlab/background_migration/populate_has_vulnerabilities_spec.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::PopulateHasVulnerabilities, schema: 20181228175414 do
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:project_settings) { table(:project_settings) }
- let(:vulnerabilities) { table(:vulnerabilities) }
-
- let(:user) { users.create!(name: 'test', email: 'test@example.com', projects_limit: 5) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:vulnerability_base_params) { { title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, author_id: user.id } }
-
- let!(:project_1) { projects.create!(namespace_id: namespace.id, name: 'foo_1') }
- let!(:project_2) { projects.create!(namespace_id: namespace.id, name: 'foo_2') }
- let!(:project_3) { projects.create!(namespace_id: namespace.id, name: 'foo_3') }
-
- before do
- project_settings.create!(project_id: project_1.id)
- vulnerabilities.create!(vulnerability_base_params.merge(project_id: project_1.id))
- vulnerabilities.create!(vulnerability_base_params.merge(project_id: project_3.id))
-
- allow(::Gitlab::BackgroundMigration::Logger).to receive_messages(info: true, error: true)
- end
-
- describe '#perform' do
- it 'sets `has_vulnerabilities` attribute of project_settings' do
- expect { subject.perform(project_1.id, project_3.id) }.to change { project_settings.count }.from(1).to(2)
- .and change { project_settings.where(has_vulnerabilities: true).count }.from(0).to(2)
- end
-
- it 'writes info log message' do
- subject.perform(project_1.id, project_3.id)
-
- expect(::Gitlab::BackgroundMigration::Logger).to have_received(:info).with(migrator: described_class.name,
- message: 'Projects has been processed to populate `has_vulnerabilities` information',
- count: 2)
- end
-
- context 'when non-existing project_id is given' do
- it 'populates only for the existing projects' do
- expect { subject.perform(project_1.id, 0, project_3.id) }.to change { project_settings.count }.from(1).to(2)
- .and change { project_settings.where(has_vulnerabilities: true).count }.from(0).to(2)
- end
- end
-
- context 'when an error happens' do
- before do
- allow(described_class::ProjectSetting).to receive(:upsert_for).and_raise('foo')
- end
-
- it 'writes error log message' do
- subject.perform(project_1.id, project_3.id)
-
- expect(::Gitlab::BackgroundMigration::Logger).to have_received(:error).with(migrator: described_class.name,
- message: 'foo',
- project_ids: [project_1.id, project_3.id])
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb b/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb
deleted file mode 100644
index 1d8eed53553..00000000000
--- a/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::PopulateMergeRequestAssigneesTable, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:users) { table(:users) }
-
- let(:user) { users.create!(email: 'test@example.com', projects_limit: 100, username: 'test') }
- let(:user_2) { users.create!(email: 'test2@example.com', projects_limit: 100, username: 'test') }
- let(:user_3) { users.create!(email: 'test3@example.com', projects_limit: 100, username: 'test') }
-
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:merge_requests) { table(:merge_requests) }
- let(:merge_request_assignees) { table(:merge_request_assignees) }
-
- def create_merge_request(id, params = {})
- params.merge!(id: id,
- target_project_id: project.id,
- target_branch: 'master',
- source_project_id: project.id,
- source_branch: 'mr name',
- title: "mr name#{id}")
-
- merge_requests.create!(params)
- end
-
- before do
- create_merge_request(2, assignee_id: user.id)
- create_merge_request(3, assignee_id: user_2.id)
- create_merge_request(4, assignee_id: user_3.id)
-
- # Test filtering MRs without assignees
- create_merge_request(5, assignee_id: nil)
- # Test filtering already migrated row
- merge_request_assignees.create!(merge_request_id: 2, user_id: user_3.id)
- end
-
- describe '#perform' do
- it 'creates merge_request_assignees rows according to merge_requests' do
- subject.perform(1, 4)
-
- rows = merge_request_assignees.order(:id).map { |row| row.attributes.slice('merge_request_id', 'user_id') }
- existing_rows = [
- { 'merge_request_id' => 2, 'user_id' => user_3.id }
- ]
- created_rows = [
- { 'merge_request_id' => 3, 'user_id' => user_2.id },
- { 'merge_request_id' => 4, 'user_id' => user_3.id }
- ]
- expected_rows = existing_rows + created_rows
-
- expect(rows.size).to eq(expected_rows.size)
- expected_rows.each do |expected_row|
- expect(rows).to include(expected_row)
- end
- end
- end
-
- describe '#perform_all_sync' do
- it 'executes peform for all merge requests in batches' do
- expect(subject).to receive(:perform).with(2, 4).ordered
- expect(subject).to receive(:perform).with(5, 5).ordered
-
- subject.perform_all_sync(batch_size: 3)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/populate_missing_vulnerability_dismissal_information_spec.rb b/spec/lib/gitlab/background_migration/populate_missing_vulnerability_dismissal_information_spec.rb
deleted file mode 100644
index 1c987d3876f..00000000000
--- a/spec/lib/gitlab/background_migration/populate_missing_vulnerability_dismissal_information_spec.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::PopulateMissingVulnerabilityDismissalInformation, schema: 20181228175414 do
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:vulnerabilities) { table(:vulnerabilities) }
- let(:findings) { table(:vulnerability_occurrences) }
- let(:scanners) { table(:vulnerability_scanners) }
- let(:identifiers) { table(:vulnerability_identifiers) }
- let(:feedback) { table(:vulnerability_feedback) }
-
- let(:user) { users.create!(name: 'test', email: 'test@example.com', projects_limit: 5) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:vulnerability_1) { vulnerabilities.create!(title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) }
- let(:vulnerability_2) { vulnerabilities.create!(title: 'title', state: 2, severity: 0, confidence: 5, report_type: 2, project_id: project.id, author_id: user.id) }
- let(:scanner) { scanners.create!(project_id: project.id, external_id: 'foo', name: 'bar') }
- let(:identifier) { identifiers.create!(project_id: project.id, fingerprint: 'foo', external_type: 'bar', external_id: 'zoo', name: 'identifier') }
-
- before do
- feedback.create!(feedback_type: 0,
- category: 'sast',
- project_fingerprint: '418291a26024a1445b23fe64de9380cdcdfd1fa8',
- project_id: project.id,
- author_id: user.id,
- created_at: Time.current)
-
- findings.create!(name: 'Finding',
- report_type: 'sast',
- project_fingerprint: Gitlab::Database::ShaAttribute.new.serialize('418291a26024a1445b23fe64de9380cdcdfd1fa8'),
- location_fingerprint: 'bar',
- severity: 1,
- confidence: 1,
- metadata_version: 1,
- raw_metadata: '',
- uuid: SecureRandom.uuid,
- project_id: project.id,
- vulnerability_id: vulnerability_1.id,
- scanner_id: scanner.id,
- primary_identifier_id: identifier.id)
-
- allow(::Gitlab::BackgroundMigration::Logger).to receive_messages(info: true, warn: true, error: true)
- end
-
- describe '#perform' do
- it 'updates the missing dismissal information of the vulnerability' do
- expect { subject.perform(vulnerability_1.id, vulnerability_2.id) }.to change { vulnerability_1.reload.dismissed_at }.from(nil)
- .and change { vulnerability_1.reload.dismissed_by_id }.from(nil).to(user.id)
- end
-
- it 'writes log messages' do
- subject.perform(vulnerability_1.id, vulnerability_2.id)
-
- expect(::Gitlab::BackgroundMigration::Logger).to have_received(:info).with(migrator: described_class.name,
- message: 'Dismissal information has been copied',
- count: 2)
- expect(::Gitlab::BackgroundMigration::Logger).to have_received(:warn).with(migrator: described_class.name,
- message: 'Could not update vulnerability!',
- vulnerability_id: vulnerability_2.id)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/populate_personal_snippet_statistics_spec.rb b/spec/lib/gitlab/background_migration/populate_personal_snippet_statistics_spec.rb
deleted file mode 100644
index f9628849dbf..00000000000
--- a/spec/lib/gitlab/background_migration/populate_personal_snippet_statistics_spec.rb
+++ /dev/null
@@ -1,141 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::PopulatePersonalSnippetStatistics do
- let(:file_name) { 'file_name.rb' }
- let(:content) { 'content' }
- let(:snippets) { table(:snippets) }
- let(:snippet_repositories) { table(:snippet_repositories) }
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:snippet_statistics) { table(:snippet_statistics) }
- let(:namespace_statistics) { table(:namespace_root_storage_statistics) }
- let(:routes) { table(:routes) }
- let(:repo_size) { 123456 }
- let(:expected_repo_size) { repo_size.megabytes }
-
- let(:user1) { users.create!(id: 1, email: 'test@example.com', projects_limit: 100, username: 'test1') }
- let(:user2) { users.create!(id: 2, email: 'test2@example.com', projects_limit: 100, username: 'test2') }
- let!(:user1_namespace) { namespaces.create!(id: 1, name: 'user1', path: 'user1', owner_id: user1.id) }
- let!(:user2_namespace) { namespaces.create!(id: 2, name: 'user2', path: 'user2', owner_id: user2.id) }
- let(:user1_namespace_statistics) { namespace_statistics.find_by(namespace_id: user1_namespace.id) }
- let(:user2_namespace_statistics) { namespace_statistics.find_by(namespace_id: user2_namespace.id) }
-
- let(:ids) { snippets.pluck(:id) }
- let(:migration) { described_class.new }
-
- subject do
- migration.perform(ids)
- end
-
- before do
- allow_any_instance_of(Repository).to receive(:size).and_return(repo_size)
- end
-
- after do
- snippets.all.each { |s| raw_repository(s).remove }
- end
-
- context 'with existing personal snippets' do
- let!(:snippet1) { create_snippet(1, user1) }
- let!(:snippet2) { create_snippet(2, user1) }
- let!(:snippet3) { create_snippet(3, user2) }
- let!(:snippet4) { create_snippet(4, user2) }
-
- before do
- create_snippet_statistics(2, 0)
- create_snippet_statistics(4, 123)
- end
-
- it 'creates/updates all snippet_statistics' do
- expect { subject }.to change { snippet_statistics.count }.from(2).to(4)
-
- expect(snippet_statistics.pluck(:repository_size)).to be_all(expected_repo_size)
- end
-
- it 'creates/updates the associated namespace statistics' do
- expect(migration).to receive(:update_namespace_statistics).twice.and_call_original
-
- subject
-
- stats = snippet_statistics.where(snippet_id: [snippet1, snippet2]).sum(:repository_size)
- expect(user1_namespace_statistics.snippets_size).to eq stats
-
- stats = snippet_statistics.where(snippet_id: [snippet3, snippet4]).sum(:repository_size)
- expect(user2_namespace_statistics.snippets_size).to eq stats
- end
-
- context 'when an error is raised when updating a namespace statistics' do
- it 'logs the error and continue execution' do
- expect_next_instance_of(Namespaces::StatisticsRefresherService) do |instance|
- expect(instance).to receive(:execute).with(Namespace.find(user1_namespace.id)).and_raise('Error')
- end
-
- expect_next_instance_of(Namespaces::StatisticsRefresherService) do |instance|
- expect(instance).to receive(:execute).and_call_original
- end
-
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
- expect(instance).to receive(:error).with(message: /Error updating statistics for namespace/).once
- end
-
- subject
-
- expect(user1_namespace_statistics).to be_nil
-
- stats = snippet_statistics.where(snippet_id: [snippet3, snippet4]).sum(:repository_size)
- expect(user2_namespace_statistics.snippets_size).to eq stats
- end
- end
- end
-
- context 'when a snippet repository is empty' do
- let!(:snippet1) { create_snippet(1, user1, with_repo: false) }
- let!(:snippet2) { create_snippet(2, user1) }
-
- it 'logs error and continues execution' do
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
- expect(instance).to receive(:error).with(message: /Invalid snippet repository/).once
- end
-
- subject
-
- expect(snippet_statistics.find_by(snippet_id: snippet1.id)).to be_nil
- expect(user1_namespace_statistics.snippets_size).to eq expected_repo_size
- end
- end
-
- def create_snippet(id, author, with_repo: true)
- snippets.create!(id: id, type: 'PersonalSnippet', author_id: author.id, file_name: file_name, content: content).tap do |snippet|
- if with_repo
- allow(snippet).to receive(:disk_path).and_return(disk_path(snippet))
-
- raw_repository(snippet).create_repository
-
- TestEnv.copy_repo(snippet,
- bare_repo: TestEnv.factory_repo_path_bare,
- refs: TestEnv::BRANCH_SHA)
- end
- end
- end
-
- def create_snippet_statistics(snippet_id, repository_size = 0)
- snippet_statistics.create!(snippet_id: snippet_id, repository_size: repository_size)
- end
-
- def raw_repository(snippet)
- Gitlab::Git::Repository.new('default',
- "#{disk_path(snippet)}.git",
- Gitlab::GlRepository::SNIPPET.identifier_for_container(snippet),
- "@snippets/#{snippet.id}")
- end
-
- def hashed_repository(snippet)
- Storage::Hashed.new(snippet, prefix: '@snippets')
- end
-
- def disk_path(snippet)
- hashed_repository(snippet).disk_path
- end
-end
diff --git a/spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb b/spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb
deleted file mode 100644
index 7884e0d97c0..00000000000
--- a/spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb
+++ /dev/null
@@ -1,224 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::PopulateProjectSnippetStatistics do
- let(:file_name) { 'file_name.rb' }
- let(:content) { 'content' }
- let(:snippets) { table(:snippets) }
- let(:snippet_repositories) { table(:snippet_repositories) }
- let(:users) { table(:users) }
- let(:namespaces) { table(:namespaces) }
- let(:snippet_statistics) { table(:snippet_statistics) }
- let(:project_statistics) { table(:project_statistics) }
- let(:projects) { table(:projects) }
- let(:namespace_statistics) { table(:namespace_root_storage_statistics) }
- let(:routes) { table(:routes) }
- let(:repo_size) { 123456 }
- let(:expected_repo_size) { repo_size.megabytes }
-
- let(:user) { users.create!(id: 1, email: 'test@example.com', projects_limit: 100, username: 'test') }
- let(:group) { namespaces.create!(id: 10, type: 'Group', name: 'group1', path: 'group1') }
- let(:user_namespace) { namespaces.create!(id: 20, name: 'user', path: 'user', owner_id: user.id) }
-
- let(:project1) { create_project(1, 'test', group) }
- let(:project2) { create_project(2, 'test1', user_namespace) }
- let(:project3) { create_project(3, 'test2', group) }
-
- let!(:project_stats1) { create_project_statistics(project1) }
- let!(:project_stats2) { create_project_statistics(project2) }
- let!(:project_stats3) { create_project_statistics(project3) }
-
- let(:ids) { snippets.pluck(:id) }
- let(:migration) { described_class.new }
-
- subject do
- migration.perform(ids)
-
- project_stats1.reload if project_stats1.persisted?
- project_stats2.reload if project_stats2.persisted?
- project_stats3.reload if project_stats3.persisted?
- end
-
- before do
- allow_any_instance_of(Repository).to receive(:size).and_return(repo_size)
- end
-
- after do
- snippets.all.each { |s| raw_repository(s).remove }
- end
-
- context 'with existing user and group snippets' do
- let!(:snippet1) { create_snippet(1, project1) }
- let!(:snippet2) { create_snippet(2, project1) }
- let!(:snippet3) { create_snippet(3, project2) }
- let!(:snippet4) { create_snippet(4, project2) }
- let!(:snippet5) { create_snippet(5, project3) }
-
- before do
- create_snippet_statistics(2, 0)
- create_snippet_statistics(4, 123)
- end
-
- it 'creates/updates all snippet_statistics' do
- expect(snippet_statistics.count).to eq 2
-
- subject
-
- expect(snippet_statistics.count).to eq 5
-
- snippet_statistics.all.each do |stat|
- expect(stat.repository_size).to eq expected_repo_size
- end
- end
-
- it 'updates associated snippet project statistics' do
- expect(project_stats1.snippets_size).to be_nil
- expect(project_stats2.snippets_size).to be_nil
-
- subject
-
- snippets_size = snippet_statistics.where(snippet_id: [snippet1.id, snippet2.id]).sum(:repository_size)
- expect(project_stats1.snippets_size).to eq snippets_size
-
- snippets_size = snippet_statistics.where(snippet_id: [snippet3.id, snippet4.id]).sum(:repository_size)
- expect(project_stats2.snippets_size).to eq snippets_size
-
- snippets_size = snippet_statistics.where(snippet_id: snippet5.id).sum(:repository_size)
- expect(project_stats3.snippets_size).to eq snippets_size
- end
-
- it 'forces the project statistics refresh' do
- expect(migration).to receive(:update_project_statistics).exactly(3).times
-
- subject
- end
-
- it 'creates/updates the associated namespace statistics' do
- expect(migration).to receive(:update_namespace_statistics).twice.and_call_original
-
- subject
-
- expect(namespace_statistics.find_by(namespace_id: group.id).snippets_size).to eq project_stats1.snippets_size + project_stats3.snippets_size
- expect(namespace_statistics.find_by(namespace_id: user_namespace.id).snippets_size).to eq project_stats2.snippets_size
- end
-
- context 'when the project statistics does not exists' do
- it 'does not raise any error' do
- project_stats3.delete
-
- subject
-
- expect(namespace_statistics.find_by(namespace_id: group.id).snippets_size).to eq project_stats1.snippets_size
- expect(namespace_statistics.find_by(namespace_id: user_namespace.id).snippets_size).to eq project_stats2.snippets_size
- end
- end
-
- context 'when an error is raised when updating a project statistics' do
- it 'logs the error and continue execution' do
- expect(migration).to receive(:update_project_statistics).with(Project.find(project1.id)).and_raise('Error')
- expect(migration).to receive(:update_project_statistics).with(Project.find(project2.id)).and_call_original
- expect(migration).to receive(:update_project_statistics).with(Project.find(project3.id)).and_call_original
-
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
- expect(instance).to receive(:error).with(message: /Error updating statistics for project #{project1.id}/).once
- end
-
- subject
-
- expect(project_stats2.snippets_size).not_to be_nil
- expect(project_stats3.snippets_size).not_to be_nil
- end
- end
-
- context 'when an error is raised when updating a namespace statistics' do
- it 'logs the error and continue execution' do
- expect(migration).to receive(:update_namespace_statistics).with(Group.find(group.id)).and_raise('Error')
- expect(migration).to receive(:update_namespace_statistics).with(Namespace.find(user_namespace.id)).and_call_original
-
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
- expect(instance).to receive(:error).with(message: /Error updating statistics for namespace/).once
- end
-
- subject
-
- expect(namespace_statistics.find_by(namespace_id: user_namespace.id).snippets_size).to eq project_stats2.snippets_size
- end
- end
- end
-
- context 'when project snippet is in a subgroup' do
- let(:subgroup) { namespaces.create!(id: 30, type: 'Group', name: 'subgroup', path: 'subgroup', parent_id: group.id) }
- let(:project1) { create_project(1, 'test', subgroup, "#{group.path}/#{subgroup.path}/test") }
- let!(:snippet1) { create_snippet(1, project1) }
-
- it 'updates the root namespace statistics' do
- subject
-
- expect(snippet_statistics.count).to eq 1
- expect(project_stats1.snippets_size).to eq snippet_statistics.first.repository_size
- expect(namespace_statistics.find_by(namespace_id: subgroup.id)).to be_nil
- expect(namespace_statistics.find_by(namespace_id: group.id).snippets_size).to eq project_stats1.snippets_size
- end
- end
-
- context 'when a snippet repository is empty' do
- let!(:snippet1) { create_snippet(1, project1, with_repo: false) }
- let!(:snippet2) { create_snippet(2, project1) }
-
- it 'logs error and continues execution' do
- expect_next_instance_of(Gitlab::BackgroundMigration::Logger) do |instance|
- expect(instance).to receive(:error).with(message: /Invalid snippet repository/).once
- end
-
- subject
-
- expect(snippet_statistics.find_by(snippet_id: snippet1.id)).to be_nil
- expect(project_stats1.snippets_size).to eq snippet_statistics.find(snippet2.id).repository_size
- end
- end
-
- def create_snippet(id, project, with_repo: true)
- snippets.create!(id: id, type: 'ProjectSnippet', project_id: project.id, author_id: user.id, file_name: file_name, content: content).tap do |snippet|
- if with_repo
- allow(snippet).to receive(:disk_path).and_return(disk_path(snippet))
-
- raw_repository(snippet).create_repository
-
- TestEnv.copy_repo(snippet,
- bare_repo: TestEnv.factory_repo_path_bare,
- refs: TestEnv::BRANCH_SHA)
- end
- end
- end
-
- def create_project(id, name, namespace, path = nil)
- projects.create!(id: id, name: name, path: name.downcase.gsub(/\s/, '_'), namespace_id: namespace.id).tap do |project|
- path ||= "#{namespace.path}/#{project.path}"
- routes.create!(id: id, source_type: 'Project', source_id: project.id, path: path)
- end
- end
-
- def create_snippet_statistics(snippet_id, repository_size = 0)
- snippet_statistics.create!(snippet_id: snippet_id, repository_size: repository_size)
- end
-
- def create_project_statistics(project, snippets_size = nil)
- project_statistics.create!(id: project.id, project_id: project.id, namespace_id: project.namespace_id, snippets_size: snippets_size)
- end
-
- def raw_repository(snippet)
- Gitlab::Git::Repository.new('default',
- "#{disk_path(snippet)}.git",
- Gitlab::GlRepository::SNIPPET.identifier_for_container(snippet),
- "@snippets/#{snippet.id}")
- end
-
- def hashed_repository(snippet)
- Storage::Hashed.new(snippet, prefix: '@snippets')
- end
-
- def disk_path(snippet)
- hashed_repository(snippet).disk_path
- end
-end
diff --git a/spec/lib/gitlab/background_migration/recalculate_project_authorizations_with_min_max_user_id_spec.rb b/spec/lib/gitlab/background_migration/recalculate_project_authorizations_with_min_max_user_id_spec.rb
deleted file mode 100644
index 1830a7fc099..00000000000
--- a/spec/lib/gitlab/background_migration/recalculate_project_authorizations_with_min_max_user_id_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::RecalculateProjectAuthorizationsWithMinMaxUserId, schema: 20181228175414 do
- let(:users_table) { table(:users) }
- let(:min) { 1 }
- let(:max) { 5 }
-
- before do
- min.upto(max) do |i|
- users_table.create!(id: i, email: "user#{i}@example.com", projects_limit: 10)
- end
- end
-
- describe '#perform' do
- it 'initializes Users::RefreshAuthorizedProjectsService with correct users' do
- min.upto(max) do |i|
- user = User.find(i)
- expect(Users::RefreshAuthorizedProjectsService).to(
- receive(:new).with(user, any_args).and_call_original)
- end
-
- described_class.new.perform(min, max)
- end
-
- it 'executes Users::RefreshAuthorizedProjectsService' do
- expected_call_counts = max - min + 1
-
- service = instance_double(Users::RefreshAuthorizedProjectsService)
- expect(Users::RefreshAuthorizedProjectsService).to(
- receive(:new).exactly(expected_call_counts).times.and_return(service))
- expect(service).to receive(:execute).exactly(expected_call_counts).times
-
- described_class.new.perform(min, max)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/replace_blocked_by_links_spec.rb b/spec/lib/gitlab/background_migration/replace_blocked_by_links_spec.rb
deleted file mode 100644
index 6cfdbb5a14e..00000000000
--- a/spec/lib/gitlab/background_migration/replace_blocked_by_links_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::ReplaceBlockedByLinks, schema: 20181228175414 do
- let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { table(:projects).create!(namespace_id: namespace.id, name: 'gitlab') }
- let(:issue1) { table(:issues).create!(project_id: project.id, title: 'a') }
- let(:issue2) { table(:issues).create!(project_id: project.id, title: 'b') }
- let(:issue3) { table(:issues).create!(project_id: project.id, title: 'c') }
- let(:issue_links) { table(:issue_links) }
- let!(:blocked_link1) { issue_links.create!(source_id: issue2.id, target_id: issue1.id, link_type: 2) }
- let!(:opposite_link1) { issue_links.create!(source_id: issue1.id, target_id: issue2.id, link_type: 1) }
- let!(:blocked_link2) { issue_links.create!(source_id: issue1.id, target_id: issue3.id, link_type: 2) }
- let!(:opposite_link2) { issue_links.create!(source_id: issue3.id, target_id: issue1.id, link_type: 0) }
- let!(:nochange_link) { issue_links.create!(source_id: issue2.id, target_id: issue3.id, link_type: 1) }
-
- subject { described_class.new.perform(issue_links.minimum(:id), issue_links.maximum(:id)) }
-
- it 'deletes any opposite relations' do
- subject
-
- expect(issue_links.ids).to match_array([nochange_link.id, blocked_link1.id, blocked_link2.id])
- end
-
- it 'ignores issue links other than blocked_by' do
- subject
-
- expect(nochange_link.reload.link_type).to eq(1)
- end
-
- it 'updates blocked_by issue links' do
- subject
-
- expect(blocked_link1.reload.link_type).to eq(1)
- expect(blocked_link1.source_id).to eq(issue1.id)
- expect(blocked_link1.target_id).to eq(issue2.id)
- expect(blocked_link2.reload.link_type).to eq(1)
- expect(blocked_link2.source_id).to eq(issue3.id)
- expect(blocked_link2.target_id).to eq(issue1.id)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/reset_merge_status_spec.rb b/spec/lib/gitlab/background_migration/reset_merge_status_spec.rb
deleted file mode 100644
index 2f5074649c4..00000000000
--- a/spec/lib/gitlab/background_migration/reset_merge_status_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::ResetMergeStatus do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:merge_requests) { table(:merge_requests) }
-
- def create_merge_request(id, extra_params = {})
- params = {
- id: id,
- target_project_id: project.id,
- target_branch: 'master',
- source_project_id: project.id,
- source_branch: 'mr name',
- title: "mr name#{id}"
- }.merge(extra_params)
-
- merge_requests.create!(params)
- end
-
- it 'correctly updates opened mergeable MRs to unchecked' do
- create_merge_request(1, state_id: MergeRequest.available_states[:opened], merge_status: 'can_be_merged')
- create_merge_request(2, state_id: MergeRequest.available_states[:opened], merge_status: 'can_be_merged')
- create_merge_request(3, state_id: MergeRequest.available_states[:opened], merge_status: 'can_be_merged')
- create_merge_request(4, state_id: MergeRequest.available_states[:merged], merge_status: 'can_be_merged')
- create_merge_request(5, state_id: MergeRequest.available_states[:opened], merge_status: 'cannot_be_merged')
-
- subject.perform(1, 5)
-
- expected_rows = [
- { id: 1, state_id: MergeRequest.available_states[:opened], merge_status: 'unchecked' },
- { id: 2, state_id: MergeRequest.available_states[:opened], merge_status: 'unchecked' },
- { id: 3, state_id: MergeRequest.available_states[:opened], merge_status: 'unchecked' },
- { id: 4, state_id: MergeRequest.available_states[:merged], merge_status: 'can_be_merged' },
- { id: 5, state_id: MergeRequest.available_states[:opened], merge_status: 'cannot_be_merged' }
- ]
-
- rows = merge_requests.order(:id).map do |row|
- row.attributes.slice('id', 'state_id', 'merge_status').symbolize_keys
- end
-
- expect(rows).to eq(expected_rows)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/reset_shared_runners_for_transferred_projects_spec.rb b/spec/lib/gitlab/background_migration/reset_shared_runners_for_transferred_projects_spec.rb
deleted file mode 100644
index ef90b5674f0..00000000000
--- a/spec/lib/gitlab/background_migration/reset_shared_runners_for_transferred_projects_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::ResetSharedRunnersForTransferredProjects, schema: 20181228175414 do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- let(:namespace_1) { namespaces.create!(name: 'foo', path: 'foo', shared_runners_enabled: true, allow_descendants_override_disabled_shared_runners: false ) }
- let(:namespace_2) { namespaces.create!(name: 'foo', path: 'foo', shared_runners_enabled: false, allow_descendants_override_disabled_shared_runners: false ) }
- let(:namespace_3) { namespaces.create!(name: 'bar', path: 'bar', shared_runners_enabled: false, allow_descendants_override_disabled_shared_runners: true ) }
- let(:project_1_1) { projects.create!(namespace_id: namespace_1.id, shared_runners_enabled: true) }
- let(:project_1_2) { projects.create!(namespace_id: namespace_1.id, shared_runners_enabled: false) }
- let(:project_2_1) { projects.create!(namespace_id: namespace_2.id, shared_runners_enabled: true) }
- let(:project_2_2) { projects.create!(namespace_id: namespace_2.id, shared_runners_enabled: false) }
- let(:project_3_1) { projects.create!(namespace_id: namespace_3.id, shared_runners_enabled: true) }
- let(:project_3_2) { projects.create!(namespace_id: namespace_3.id, shared_runners_enabled: false) }
-
- it 'corrects each project shared_runners_enabled column' do
- expect do
- described_class.new.perform(namespace_1.id, namespace_3.id)
- project_1_1.reload
- project_1_2.reload
- project_2_1.reload
- project_2_2.reload
- project_3_1.reload
- project_3_2.reload
- end.to not_change(project_1_1, :shared_runners_enabled).from(true)
- .and not_change(project_1_2, :shared_runners_enabled).from(false)
- .and change(project_2_1, :shared_runners_enabled).from(true).to(false)
- .and not_change(project_2_2, :shared_runners_enabled).from(false)
- .and not_change(project_3_1, :shared_runners_enabled).from(true)
- .and not_change(project_3_2, :shared_runners_enabled).from(false)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb b/spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb
deleted file mode 100644
index 1fdbdf25706..00000000000
--- a/spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::SetMergeRequestDiffFilesCount, schema: 20181228175414 do
- let(:merge_request_diff_files) { table(:merge_request_diff_files) }
- let(:merge_request_diffs) { table(:merge_request_diffs) }
- let(:merge_requests) { table(:merge_requests) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
- let(:project) { projects.create!(namespace_id: namespace.id) }
- let(:merge_request) { merge_requests.create!(source_branch: 'x', target_branch: 'master', target_project_id: project.id) }
-
- let!(:empty_diff) { merge_request_diffs.create!(merge_request_id: merge_request.id) }
- let!(:filled_diff) { merge_request_diffs.create!(merge_request_id: merge_request.id) }
-
- let!(:filled_diff_files) do
- 1.upto(3).map do |n|
- merge_request_diff_files.create!(
- merge_request_diff_id: filled_diff.id,
- relative_order: n,
- new_file: false,
- renamed_file: false,
- deleted_file: false,
- too_large: false,
- a_mode: '',
- b_mode: '',
- old_path: '',
- new_path: ''
- )
- end
- end
-
- it 'fills the files_count column' do
- described_class.new.perform(empty_diff.id, filled_diff.id)
-
- expect(empty_diff.reload.files_count).to eq(0)
- expect(filled_diff.reload.files_count).to eq(3)
- end
-
- it 'uses the sentinel value if the actual count is too high' do
- stub_const("#{described_class}::FILES_COUNT_SENTINEL", filled_diff_files.size - 1)
-
- described_class.new.perform(empty_diff.id, filled_diff.id)
-
- expect(empty_diff.reload.files_count).to eq(0)
- expect(filled_diff.reload.files_count).to eq(described_class::FILES_COUNT_SENTINEL)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb b/spec/lib/gitlab/background_migration/update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb
deleted file mode 100644
index de9799c3642..00000000000
--- a/spec/lib/gitlab/background_migration/update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::UpdateExistingSubgroupToMatchVisibilityLevelOfParent, schema: 20181228175414 do
- include MigrationHelpers::NamespacesHelpers
-
- context 'private visibility level' do
- it 'updates the project visibility' do
- parent = create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE)
- child = create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: parent.id)
-
- expect { subject.perform([parent.id], Gitlab::VisibilityLevel::PRIVATE) }.to change { child.reload.visibility_level }.to(Gitlab::VisibilityLevel::PRIVATE)
- end
-
- it 'updates sub-sub groups' do
- parent = create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE)
- middle_group = create_namespace('middle', Gitlab::VisibilityLevel::PRIVATE, parent_id: parent.id)
- child = create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: middle_group.id)
-
- subject.perform([parent.id, middle_group.id], Gitlab::VisibilityLevel::PRIVATE)
-
- expect(child.reload.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
-
- it 'updates all sub groups' do
- parent = create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE)
- middle_group = create_namespace('middle', Gitlab::VisibilityLevel::PUBLIC, parent_id: parent.id)
- child = create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: middle_group.id)
-
- subject.perform([parent.id], Gitlab::VisibilityLevel::PRIVATE)
-
- expect(child.reload.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- expect(middle_group.reload.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
- end
- end
-
- context 'internal visibility level' do
- it 'updates the project visibility' do
- parent = create_namespace('parent', Gitlab::VisibilityLevel::INTERNAL)
- child = create_namespace('child', Gitlab::VisibilityLevel::PUBLIC, parent_id: parent.id)
-
- expect { subject.perform([parent.id], Gitlab::VisibilityLevel::INTERNAL) }.to change { child.reload.visibility_level }.to(Gitlab::VisibilityLevel::INTERNAL)
- end
- end
-end
diff --git a/spec/lib/gitlab/background_migration/update_existing_users_that_require_two_factor_auth_spec.rb b/spec/lib/gitlab/background_migration/update_existing_users_that_require_two_factor_auth_spec.rb
deleted file mode 100644
index 33f5e38100e..00000000000
--- a/spec/lib/gitlab/background_migration/update_existing_users_that_require_two_factor_auth_spec.rb
+++ /dev/null
@@ -1,74 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::UpdateExistingUsersThatRequireTwoFactorAuth, schema: 20181228175414 do
- include MigrationHelpers::NamespacesHelpers
-
- let(:group_with_2fa_parent) { create_namespace('parent', Gitlab::VisibilityLevel::PRIVATE) }
- let(:group_with_2fa_child) { create_namespace('child', Gitlab::VisibilityLevel::PRIVATE, parent_id: group_with_2fa_parent.id) }
- let(:members_table) { table(:members) }
- let(:users_table) { table(:users) }
-
- subject { described_class.new }
-
- describe '#perform' do
- context 'with group members' do
- let(:user_1) { create_user('user@example.com') }
- let!(:member) { create_group_member(user_1, group_with_2fa_parent) }
- let!(:user_without_group) { create_user('user_without@example.com') }
- let(:user_other) { create_user('user_other@example.com') }
- let!(:member_other) { create_group_member(user_other, group_with_2fa_parent) }
-
- it 'updates user when user should not be required to establish two factor authentication' do
- subject.perform(user_1.id, user_without_group.id)
-
- expect(user_1.reload.require_two_factor_authentication_from_group).to eq(false)
- end
-
- it 'does not update user when user is member of group that requires two factor authentication' do
- group = create_namespace('other', Gitlab::VisibilityLevel::PRIVATE, require_two_factor_authentication: true)
- create_group_member(user_1, group)
-
- subject.perform(user_1.id, user_without_group.id)
-
- expect(user_1.reload.require_two_factor_authentication_from_group).to eq(true)
- end
-
- it 'does not update user who is not in current batch' do
- subject.perform(user_1.id, user_without_group.id)
-
- expect(user_other.reload.require_two_factor_authentication_from_group).to eq(true)
- end
-
- it 'updates all users in current batch' do
- subject.perform(user_1.id, user_other.id)
-
- expect(user_other.reload.require_two_factor_authentication_from_group).to eq(false)
- end
-
- it 'does not update user when user is member of group which parent group requires two factor authentication' do
- group_with_2fa_parent.update!(require_two_factor_authentication: true)
- subject.perform(user_1.id, user_other.id)
-
- expect(user_1.reload.require_two_factor_authentication_from_group).to eq(true)
- end
-
- it 'does not update user when user is member of group which has subgroup that requires two factor authentication' do
- create_namespace('subgroup', Gitlab::VisibilityLevel::PRIVATE, require_two_factor_authentication: true, parent_id: group_with_2fa_child.id)
-
- subject.perform(user_1.id, user_other.id)
-
- expect(user_1.reload.require_two_factor_authentication_from_group).to eq(true)
- end
- end
- end
-
- def create_user(email, require_2fa: true)
- users_table.create!(email: email, projects_limit: 10, require_two_factor_authentication_from_group: require_2fa)
- end
-
- def create_group_member(user, group)
- members_table.create!(user_id: user.id, source_id: group.id, access_level: GroupMember::MAINTAINER, source_type: "Namespace", type: "GroupMember", notification_level: 3)
- end
-end
diff --git a/spec/lib/sidebars/concerns/link_with_html_options_spec.rb b/spec/lib/sidebars/concerns/link_with_html_options_spec.rb
new file mode 100644
index 00000000000..1e890bffad1
--- /dev/null
+++ b/spec/lib/sidebars/concerns/link_with_html_options_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Concerns::LinkWithHtmlOptions do
+ let(:options) { {} }
+
+ subject { Class.new { include Sidebars::Concerns::LinkWithHtmlOptions }.new }
+
+ before do
+ allow(subject).to receive(:container_html_options).and_return(options)
+ end
+
+ describe '#link_html_options' do
+ context 'with existing classes' do
+ let(:options) do
+ {
+ class: '_class1_ _class2_',
+ aria: { label: '_label_' }
+ }
+ end
+
+ it 'includes class and default aria-label attribute' do
+ result = {
+ class: '_class1_ _class2_ gl-link',
+ aria: { label: '_label_' }
+ }
+
+ expect(subject.link_html_options).to eq(result)
+ end
+ end
+
+ context 'without existing classes' do
+ it 'includes gl-link class' do
+ expect(subject.link_html_options).to eq(class: 'gl-link')
+ end
+ end
+ end
+end