gitlab-ce/spec/lib/gitlab/background_migration/backfill_partitioned_upload...

710 lines
38 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
# rubocop:disable RSpec/MultipleMemoizedHelpers -- Polymorphic table used by many models requires complex setup
RSpec.describe Gitlab::BackgroundMigration::BackfillPartitionedUploads, :aggregate_failures,
:migration_with_transaction,
feature_category: :database do
let(:uploads_table) { table(:uploads) }
let(:partitioned_uploads_table) { table(:uploads_9ba88c4165) }
let(:organizations) { table(:organizations) }
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:users) { table(:users) }
let(:abuse_reports) { table(:abuse_reports) }
let(:achievements) { table(:achievements) }
let(:ai_vectorizable_files) { table(:ai_vectorizable_files) }
let(:alert_management_alerts) { table(:alert_management_alerts) }
let(:alert_management_alert_metric_images) { table(:alert_management_alert_metric_images) }
let(:appearances) { table(:appearances) }
let(:dependency_list_exports) { table(:dependency_list_exports, database: :sec) }
let(:import_export_uploads) { table(:import_export_uploads) }
let(:issuable_metric_images) { table(:issuable_metric_images) }
let(:organization_details) { table(:organization_details) }
let(:topics) { table(:topics) }
let(:snippets) { table(:snippets) }
let(:user_permission_export_uploads) { table(:user_permission_export_uploads) }
let(:dependency_list_export_parts) { table(:dependency_list_export_parts, database: :sec) }
let(:vulnerability_exports) { table(:vulnerability_exports, database: :sec) }
let(:vulnerability_export_parts) { table(:vulnerability_export_parts, database: :sec) }
let(:vulnerability_remediations) { table(:vulnerability_remediations, database: :sec) }
let(:vulnerability_archive_exports) { table(:vulnerability_archive_exports, database: :sec) }
let(:project_export_jobs) { table(:project_export_jobs) }
let(:project_relation_exports) { table(:project_relation_exports) }
let(:project_relation_export_uploads) { table(:project_relation_export_uploads) }
let(:design_management_designs) { table(:design_management_designs) }
let(:design_management_versions) { table(:design_management_versions) }
let(:design_management_designs_versions) { table(:design_management_designs_versions) }
let(:bulk_import_exports) { table(:bulk_import_exports) }
let(:bulk_import_export_uploads) { table(:bulk_import_export_uploads) }
let(:connection) { ApplicationRecord.connection }
describe '#perform' do
before do
# Partitioned table vulnerability_archive_exports is registered only for GitLab EE,
# when running tests for FOSS_ONLY we need at least one partition to be able to
# create the parent record.
SecApplicationRecord.connection.execute <<~SQL
CREATE TABLE _test_vulnerability_archive_exports_default
PARTITION OF vulnerability_archive_exports DEFAULT
SQL
end
it 'backfill missing uploads' do
# Uploads to be_truthy copied
abuse_report_upload_to_be_synced = create_abuse_report_upload
appearance_upload_to_be_synced = create_appearance_upload
achievement_1 = create_achievement
achievement_upload_to_be_synced = create_achievement_upload(model: achievement_1)
ai_vectorizable_file_1 = create_ai_vectorizable_file
ai_vectorizable_file_upload_to_be_synced = create_ai_vectorizable_file_upload(model: ai_vectorizable_file_1)
alert_metric_image_1 = create_alert_metric_image
alert_metric_image_upload_to_be_synced = create_alert_metric_image_upload(model: alert_metric_image_1)
dependency_list_export_1 = create_dependency_list_export
dependency_list_export_upload_to_be_synced = create_dependency_list_export_upload(model: dependency_list_export_1)
dependency_list_export_part_1 = create_dependency_list_export_part
dependency_list_export_part_upload_to_be_synced = create_dependency_list_export_part_upload(
model: dependency_list_export_part_1)
import_export_upload_1 = create_import_export_upload
import_export_upload_upload_to_be_synced = create_import_export_upload_upload(model: import_export_upload_1)
issuable_metric_image_1 = create_issuable_metric_image
issuable_metric_image_upload_to_be_synced = create_issuable_metric_image_upload(model: issuable_metric_image_1)
organization_detail_1 = create_organization_detail
organization_detail_upload_to_be_synced = create_organization_detail_upload(model: organization_detail_1)
topic_1 = create_topic
topic_upload_to_be_synced = create_topic_upload(model: topic_1)
snippet_1 = create_snippet
snippet_upload_to_be_synced = create_snippet_upload(model: snippet_1)
user_permission_export_upload_1 = create_user_permission_export_upload
user_permission_export_upload_upload_to_be_synced = create_user_permission_export_upload_upload(
model: user_permission_export_upload_1)
user_1 = create_user(organization_id: create_organization.id)
user_upload_to_be_synced = create_user_upload(model: user_1)
vulnerability_export_1 = create_vulnerability_export
vulnerability_export_upload_to_be_synced = create_vulnerability_export_upload(model: vulnerability_export_1)
vulnerability_export_part_1 = create_vulnerability_export_part
vulnerability_export_part_upload_to_be_synced = create_vulnerability_export_part_upload(
model: vulnerability_export_part_1)
vulnerability_remediation_1 = create_vulnerability_remediation
vulnerability_remediation_upload_to_be_synced = create_vulnerability_remediation_upload(
model: vulnerability_remediation_1)
vulnerability_archive_export_1 = create_vulnerability_archive_export
vulnerability_archive_export_upload_to_be_synced = create_vulnerability_archive_export_upload(
model: vulnerability_archive_export_1)
project_1 = create_project
project_upload_to_be_synced = create_project_upload(model: project_1)
namespace_1 = create_namespace
namespace_upload_to_be_synced = create_namespace_upload(model: namespace_1)
project_relation_export_upload_1 = create_project_relation_export_upload
project_relation_export_upload_upload_to_be_synced = create_project_relation_export_upload_upload(
model: project_relation_export_upload_1)
designs_version_1 = create_designs_version
designs_version_upload_to_be_synced = create_designs_version_upload(model: designs_version_1)
bulk_import_export_upload_1 = create_bulk_import_export_upload
bulk_import_export_upload_upload_to_be_synced = create_bulk_import_export_upload_upload(
model: bulk_import_export_upload_1)
# Parentless uploads not to be back-filled
abuse_report_upload_to_be_removed = create_abuse_report_upload(delete_model: true)
appearance_upload_to_be_removed = create_appearance_upload(delete_model: true)
achievement_upload_to_be_removed = create_achievement_upload(delete_model: true)
ai_vectorizable_file_upload_to_be_removed = create_ai_vectorizable_file_upload(delete_model: true)
alert_metric_image_upload_to_be_removed = create_alert_metric_image_upload(delete_model: true)
dependency_list_export_upload_to_be_removed = create_dependency_list_export_upload(delete_model: true)
dependency_list_export_part_upload_to_be_removed = create_dependency_list_export_part_upload(delete_model: true)
import_export_upload_upload_to_be_removed = create_import_export_upload_upload(delete_model: true)
issuable_metric_image_upload_to_be_removed = create_issuable_metric_image_upload(delete_model: true)
organization_detail_upload_to_be_removed = create_organization_detail_upload(delete_model: true)
topic_upload_to_be_removed = create_topic_upload(delete_model: true)
snippet_upload_to_be_removed = create_snippet_upload(delete_model: true)
user_permission_export_upload_upload_to_be_removed = create_user_permission_export_upload_upload(
delete_model: true)
user_upload_to_be_removed = create_user_upload(delete_model: true)
vulnerability_export_upload_to_be_removed = create_vulnerability_export_upload(delete_model: true)
vulnerability_export_part_upload_to_be_removed = create_vulnerability_export_part_upload(delete_model: true)
vulnerability_remediation_upload_to_be_removed = create_vulnerability_remediation_upload(delete_model: true)
vulnerability_archive_export_upload_to_be_removed = create_vulnerability_archive_export_upload(delete_model: true)
project_upload_to_be_removed = create_project_upload(delete_model: true)
namespace_upload_to_be_removed = create_namespace_upload(delete_model: true)
project_relation_export_upload_upload_to_be_removed = create_project_relation_export_upload_upload(
delete_model: true)
designs_version_upload_to_be_removed = create_designs_version_upload(delete_model: true)
bulk_import_export_upload_upload_to_be_removed = create_bulk_import_export_upload_upload(delete_model: true)
connection.truncate(partitioned_uploads_table.table_name)
# Uploads already copied
abuse_report_upload_synced = create_abuse_report_upload
appearance_upload_synced = create_appearance_upload
achievement_2 = create_achievement
achievement_upload_synced = create_achievement_upload(model: achievement_2)
ai_vectorizable_file_2 = create_ai_vectorizable_file
ai_vectorizable_file_upload_synced = create_ai_vectorizable_file_upload(model: ai_vectorizable_file_2)
alert_metric_image_2 = create_alert_metric_image
alert_metric_image_upload_synced = create_alert_metric_image_upload(model: alert_metric_image_2)
dependency_list_export_2 = create_dependency_list_export
dependency_list_export_upload_synced = create_dependency_list_export_upload(model: dependency_list_export_2)
dependency_list_export_part_2 = create_dependency_list_export_part
dependency_list_export_part_upload_synced = create_dependency_list_export_part_upload(
model: dependency_list_export_part_2)
import_export_upload_2 = create_import_export_upload
import_export_upload_upload_synced = create_import_export_upload_upload(model: import_export_upload_2)
issuable_metric_image_2 = create_issuable_metric_image
issuable_metric_image_upload_synced = create_issuable_metric_image_upload(model: issuable_metric_image_2)
organization_detail_2 = create_organization_detail
organization_detail_upload_synced = create_organization_detail_upload(model: organization_detail_2)
topic_2 = create_topic
topic_upload_synced = create_topic_upload(model: topic_2)
snippet_2 = create_snippet
snippet_upload_synced = create_snippet_upload(model: snippet_2)
user_permission_export_upload_2 = create_user_permission_export_upload
user_permission_export_upload_upload_synced = create_user_permission_export_upload_upload(
model: user_permission_export_upload_2)
user_2 = create_user(organization_id: create_organization.id)
user_upload_synced = create_user_upload(model: user_2)
vulnerability_export_2 = create_vulnerability_export
vulnerability_export_upload_synced = create_vulnerability_export_upload(model: vulnerability_export_2)
vulnerability_export_part_2 = create_vulnerability_export_part
vulnerability_export_part_upload_synced = create_vulnerability_export_part_upload(
model: vulnerability_export_part_2)
vulnerability_remediation_2 = create_vulnerability_remediation
vulnerability_remediation_upload_synced = create_vulnerability_remediation_upload(
model: vulnerability_remediation_2)
vulnerability_archive_export_2 = create_vulnerability_archive_export
vulnerability_archive_export_upload_synced = create_vulnerability_archive_export_upload(
model: vulnerability_archive_export_2)
project_2 = create_project
project_upload_synced = create_project_upload(model: project_2)
namespace_2 = create_namespace
namespace_upload_synced = create_namespace_upload(model: namespace_2)
project_relation_export_upload_2 = create_project_relation_export_upload
project_relation_export_upload_upload_synced = create_project_relation_export_upload_upload(
model: project_relation_export_upload_2)
designs_version_2 = create_designs_version
designs_version_upload_synced = create_designs_version_upload(model: designs_version_2)
bulk_import_export_upload_2 = create_bulk_import_export_upload
bulk_import_export_upload_upload_synced = create_bulk_import_export_upload_upload(
model: bulk_import_export_upload_2)
expect(uploads_table.find_by_id(abuse_report_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(abuse_report_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(abuse_report_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(appearance_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(appearance_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(appearance_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(achievement_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(achievement_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(achievement_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(ai_vectorizable_file_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(ai_vectorizable_file_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(ai_vectorizable_file_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(alert_metric_image_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(alert_metric_image_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(alert_metric_image_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(dependency_list_export_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(dependency_list_export_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(dependency_list_export_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(dependency_list_export_part_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(dependency_list_export_part_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(dependency_list_export_part_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(import_export_upload_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(import_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(import_export_upload_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(issuable_metric_image_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(issuable_metric_image_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(issuable_metric_image_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(organization_detail_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(organization_detail_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(organization_detail_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(snippet_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(snippet_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(snippet_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(user_permission_export_upload_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(user_permission_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(user_permission_export_upload_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(user_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(user_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(user_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(vulnerability_export_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(vulnerability_export_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_export_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(vulnerability_export_part_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(vulnerability_export_part_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_export_part_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(vulnerability_remediation_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(vulnerability_remediation_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_remediation_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(vulnerability_archive_export_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(vulnerability_archive_export_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_archive_export_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(project_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(project_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(project_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(namespace_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(namespace_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(namespace_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(project_relation_export_upload_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(project_relation_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(project_relation_export_upload_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(designs_version_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(designs_version_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(designs_version_upload_synced.id)).to be_truthy
expect(uploads_table.find_by_id(bulk_import_export_upload_upload_to_be_removed.id)).to be_truthy
expect(find_partitioned_upload(bulk_import_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(bulk_import_export_upload_upload_synced.id)).to be_truthy
expect do
described_class.new(
start_id: uploads_table.minimum(:id),
end_id: uploads_table.maximum(:id),
batch_table: :uploads,
batch_column: :id,
sub_batch_size: 100,
pause_ms: 0,
connection: connection
).perform
end.not_to raise_error
expect(find_partitioned_upload(abuse_report_upload_to_be_synced.id)).to be_truthy
expect(find_partitioned_upload(abuse_report_upload_synced.id)).to be_truthy
expect(find_partitioned_upload(abuse_report_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(appearance_upload_to_be_synced.id)).to be_truthy
expect(find_partitioned_upload(appearance_upload_synced.id)).to be_truthy
expect(find_partitioned_upload(appearance_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(achievement_upload_to_be_synced.id).namespace_id)
.to eq(achievement_1.namespace_id)
expect(find_partitioned_upload(achievement_upload_synced.id).namespace_id)
.to eq(achievement_2.namespace_id)
expect(find_partitioned_upload(achievement_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(ai_vectorizable_file_upload_to_be_synced.id).project_id)
.to eq(ai_vectorizable_file_1.project_id)
expect(find_partitioned_upload(ai_vectorizable_file_upload_synced.id).project_id)
.to eq(ai_vectorizable_file_2.project_id)
expect(find_partitioned_upload(ai_vectorizable_file_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(alert_metric_image_upload_to_be_synced.id).project_id)
.to eq(alert_metric_image_1.project_id)
expect(find_partitioned_upload(alert_metric_image_upload_synced.id).project_id)
.to eq(alert_metric_image_2.project_id)
expect(find_partitioned_upload(alert_metric_image_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(dependency_list_export_upload_to_be_synced.id).namespace_id)
.to eq(dependency_list_export_1.group_id)
expect(find_partitioned_upload(dependency_list_export_upload_synced.id).namespace_id)
.to eq(dependency_list_export_2.group_id)
expect(find_partitioned_upload(dependency_list_export_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(dependency_list_export_part_upload_to_be_synced.id).organization_id)
.to eq(dependency_list_export_part_1.organization_id)
expect(find_partitioned_upload(dependency_list_export_part_upload_synced.id).organization_id)
.to eq(dependency_list_export_part_2.organization_id)
expect(find_partitioned_upload(dependency_list_export_part_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(import_export_upload_upload_to_be_synced.id).namespace_id)
.to eq(import_export_upload_1.group_id)
expect(find_partitioned_upload(import_export_upload_upload_synced.id).namespace_id)
.to eq(import_export_upload_2.group_id)
expect(find_partitioned_upload(import_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(issuable_metric_image_upload_to_be_synced.id).namespace_id)
.to eq(issuable_metric_image_1.namespace_id)
expect(find_partitioned_upload(issuable_metric_image_upload_synced.id).namespace_id)
.to eq(issuable_metric_image_2.namespace_id)
expect(find_partitioned_upload(issuable_metric_image_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(organization_detail_upload_to_be_synced.id).organization_id)
.to eq(organization_detail_1.organization_id)
expect(find_partitioned_upload(organization_detail_upload_synced.id).organization_id)
.to eq(organization_detail_2.organization_id)
expect(find_partitioned_upload(organization_detail_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(topic_upload_to_be_synced.id).organization_id).to eq(topic_1.organization_id)
expect(find_partitioned_upload(topic_upload_synced.id).organization_id).to eq(topic_2.organization_id)
expect(find_partitioned_upload(topic_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(snippet_upload_to_be_synced.id).organization_id).to eq(snippet_1.organization_id)
expect(find_partitioned_upload(snippet_upload_synced.id).organization_id).to eq(snippet_2.organization_id)
expect(find_partitioned_upload(snippet_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(user_permission_export_upload_upload_to_be_synced.id)).to be_truthy
expect(find_partitioned_upload(user_permission_export_upload_upload_synced.id)).to be_truthy
expect(find_partitioned_upload(user_permission_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(user_upload_to_be_synced.id)).to be_truthy
expect(find_partitioned_upload(user_upload_synced.id)).to be_truthy
expect(find_partitioned_upload(user_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_export_upload_to_be_synced.id).organization_id)
.to eq(vulnerability_export_1.organization_id)
expect(find_partitioned_upload(vulnerability_export_upload_synced.id).organization_id)
.to eq(vulnerability_export_2.organization_id)
expect(find_partitioned_upload(vulnerability_export_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_export_part_upload_to_be_synced.id).organization_id)
.to eq(vulnerability_export_part_1.organization_id)
expect(find_partitioned_upload(vulnerability_export_part_upload_synced.id).organization_id)
.to eq(vulnerability_export_part_2.organization_id)
expect(find_partitioned_upload(vulnerability_export_part_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_remediation_upload_to_be_synced.id).project_id)
.to eq(vulnerability_remediation_1.project_id)
expect(find_partitioned_upload(vulnerability_remediation_upload_synced.id).project_id)
.to eq(vulnerability_remediation_2.project_id)
expect(find_partitioned_upload(vulnerability_remediation_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(vulnerability_archive_export_upload_to_be_synced.id).project_id)
.to eq(vulnerability_archive_export_1.project_id)
expect(find_partitioned_upload(vulnerability_archive_export_upload_synced.id).project_id)
.to eq(vulnerability_archive_export_2.project_id)
expect(find_partitioned_upload(vulnerability_archive_export_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(project_upload_to_be_synced.id).project_id).to eq(project_1.id)
expect(find_partitioned_upload(project_upload_synced.id).project_id).to eq(project_2.id)
expect(find_partitioned_upload(project_upload_to_be_synced.id).namespace_id).to be_nil
expect(find_partitioned_upload(project_upload_synced.id).namespace_id).to be_nil
expect(find_partitioned_upload(project_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(namespace_upload_to_be_synced.id).namespace_id).to eq(namespace_1.id)
expect(find_partitioned_upload(namespace_upload_synced.id).namespace_id).to eq(namespace_2.id)
expect(find_partitioned_upload(namespace_upload_to_be_synced.id).organization_id).to be_nil
expect(find_partitioned_upload(namespace_upload_synced.id).organization_id).to be_nil
expect(find_partitioned_upload(namespace_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(project_relation_export_upload_upload_to_be_synced.id).project_id)
.to eq(project_relation_export_upload_1.project_id)
expect(find_partitioned_upload(project_relation_export_upload_upload_synced.id).project_id)
.to eq(project_relation_export_upload_2.project_id)
expect(find_partitioned_upload(project_relation_export_upload_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(designs_version_upload_to_be_synced.id).namespace_id)
.to eq(designs_version_1.namespace_id)
expect(find_partitioned_upload(designs_version_upload_synced.id).namespace_id)
.to eq(designs_version_2.namespace_id)
expect(find_partitioned_upload(designs_version_upload_to_be_removed.id)).not_to be_truthy
expect(find_partitioned_upload(bulk_import_export_upload_upload_to_be_synced.id).namespace_id)
.to eq(bulk_import_export_upload_1.group_id)
expect(find_partitioned_upload(bulk_import_export_upload_upload_synced.id).namespace_id)
.to eq(bulk_import_export_upload_2.group_id)
expect(find_partitioned_upload(bulk_import_export_upload_upload_to_be_removed.id)).not_to be_truthy
end
end
def find_partitioned_upload(id)
partitioned_uploads_table.find_by_id(id)
end
def create_organization
suffix = SecureRandom.base64
organizations.create!(name: 'Organization', path: "organization-#{suffix}")
end
def create_namespace
organization = create_organization
namespaces.create!(
name: 'gitlab-org',
path: 'gitlab-org',
type: 'Group',
organization_id: organization.id
)
end
def create_project
namespace = create_namespace
projects.create!(
namespace_id: namespace.id,
organization_id: namespace.organization_id,
project_namespace_id: namespace.id,
name: 'Project',
path: 'project'
)
end
def create_user(organization_id:)
users.create!(username: SecureRandom.base64, email: "#{SecureRandom.base64}@gitlab.com", projects_limit: 1,
organization_id: organization_id)
end
def create_upload(model_type, model, delete_model: false)
model_id = Array.wrap(model.id).first
uploads_table.create!(model_type: model_type, model_id: model_id, size: 42, path: '/some/path',
uploader: 'FileUploader', created_at: Time.current).tap do
model.delete if delete_model
end
end
def create_achievement
namespace = create_namespace
achievements.create!(namespace_id: namespace.id, name: SecureRandom.base64)
end
def create_abuse_report_upload(delete_model: false)
model = abuse_reports.create!
create_upload('AbuseReport', model, delete_model: delete_model)
end
def create_appearance_upload(delete_model: false)
model = appearances.create!(title: 'foo', description: 'bar')
create_upload('Appearance', model, delete_model: delete_model)
end
def create_achievement_upload(model: nil, delete_model: false)
model ||= create_achievement
create_upload('Achievements::Achievement', model, delete_model: delete_model)
end
def create_ai_vectorizable_file
project = create_project
ai_vectorizable_files.create!(project_id: project.id, name: 'ai_file', file: 'ai_file')
end
def create_ai_vectorizable_file_upload(model: nil, delete_model: false)
model ||= create_ai_vectorizable_file
create_upload('Ai::VectorizableFile', model, delete_model: delete_model)
end
def create_alert
project = create_project
alert_management_alerts.create!(started_at: Time.current, iid: 1, project_id: project.id, title: 'High Alert!')
end
def create_alert_metric_image
alert = create_alert
alert_management_alert_metric_images.create!(alert_id: alert.id, project_id: alert.project_id, file: 'alert file')
end
def create_alert_metric_image_upload(model: nil, delete_model: false)
model ||= create_alert_metric_image
create_upload('AlertManagement::MetricImage', model, delete_model: delete_model)
end
def create_dependency_list_export
group = create_namespace
dependency_list_exports.create!(group_id: group.id)
end
def create_dependency_list_export_upload(model: nil, delete_model: false)
model ||= create_dependency_list_export
create_upload('Dependencies::DependencyListExport', model, delete_model: delete_model)
end
def create_dependency_list_export_part
organization = create_organization
dependency_list_export = create_dependency_list_export
dependency_list_export_parts.create!(organization_id: organization.id,
dependency_list_export_id: dependency_list_export.id, start_id: 1, end_id: 9)
end
def create_dependency_list_export_part_upload(model: nil, delete_model: false)
model ||= create_dependency_list_export_part
create_upload('Dependencies::DependencyListExport::Part', model, delete_model: delete_model)
end
def create_import_export_upload
group = create_namespace
import_export_uploads.create!(group_id: group.id)
end
def create_import_export_upload_upload(model: nil, delete_model: false)
model ||= create_import_export_upload
create_upload('ImportExportUpload', model, delete_model: delete_model)
end
def create_issuable_metric_image
namespace = create_namespace
issue_work_item_type_id = table(:work_item_types).find_by(name: 'Issue').id
issue = table(:issues).create!(
namespace_id: namespace.id,
lock_version: 1,
work_item_type_id: issue_work_item_type_id
)
issuable_metric_images.create!(namespace_id: namespace.id, issue_id: issue.id, file: 'some_file')
end
def create_issuable_metric_image_upload(model: nil, delete_model: false)
model ||= create_import_export_upload
create_upload('IssuableMetricImage', model, delete_model: delete_model)
end
def create_organization_detail
organization = create_organization
organization_details.create!(organization_id: organization.id)
end
def create_organization_detail_upload(model: nil, delete_model: false)
model ||= create_organization_detail
create_upload('Organizations::OrganizationDetail', model, delete_model: delete_model)
end
def create_topic
organization = create_organization
topics.create!(organization_id: organization.id, name: SecureRandom.base64)
end
def create_topic_upload(model: nil, delete_model: false)
model ||= create_topic
create_upload('Projects::Topic', model, delete_model: delete_model)
end
def create_snippet
organization = create_organization
user = create_user(organization_id: organization.id)
snippets.create!(organization_id: organization.id, author_id: user.id)
end
def create_snippet_upload(model: nil, delete_model: false)
model ||= create_snippet
create_upload('Snippet', model, delete_model: delete_model)
end
def create_user_permission_export_upload
organization = create_organization
user = create_user(organization_id: organization.id)
user_permission_export_uploads.create!(user_id: user.id)
end
def create_user_permission_export_upload_upload(model: nil, delete_model: false)
model ||= create_user_permission_export_upload
create_upload('UserPermissionExportUpload', model, delete_model: delete_model)
end
def create_user_upload(model: nil, delete_model: false)
model ||= begin
organization = create_organization
create_user(organization_id: organization.id)
end
create_upload('User', model, delete_model: delete_model)
end
def create_vulnerability_export
organization = create_organization
user = create_user(organization_id: organization.id)
vulnerability_exports.create!(organization_id: organization.id, author_id: user.id, status: 'open')
end
def create_vulnerability_export_upload(model: nil, delete_model: false)
model ||= create_vulnerability_export
create_upload('Vulnerabilities::Export', model, delete_model: delete_model)
end
def create_vulnerability_export_part
organization = create_organization
vulnerability_export = create_vulnerability_export
vulnerability_export_parts.create!(organization_id: organization.id,
vulnerability_export_id: vulnerability_export.id, start_id: 1, end_id: 100)
end
def create_vulnerability_export_part_upload(model: nil, delete_model: false)
model ||= create_vulnerability_export_part
create_upload('Vulnerabilities::Export::Part', model, delete_model: delete_model)
end
def create_vulnerability_remediation
project = create_project
vulnerability_remediations.create!(project_id: project.id, summary: 'summary', file: 'some_file', checksum: '123')
end
def create_vulnerability_remediation_upload(model: nil, delete_model: false)
model ||= create_vulnerability_remediation
create_upload('Vulnerabilities::Remediation', model, delete_model: delete_model)
end
def create_vulnerability_archive_export
project = create_project
user = create_user(organization_id: project.organization_id)
vulnerability_archive_exports.create!(project_id: project.id, author_id: user.id,
date_range: Time.current.yesterday..Time.current)
end
def create_vulnerability_archive_export_upload(model: nil, delete_model: false)
model ||= create_vulnerability_archive_export
create_upload('Vulnerabilities::ArchiveExport', model, delete_model: delete_model)
end
def create_project_upload(model: nil, delete_model: false)
model ||= create_project
create_upload('Project', model, delete_model: delete_model).tap do |u|
u.update!(namespace_id: model.namespace_id)
end
end
def create_namespace_upload(model: nil, delete_model: false)
model ||= create_namespace
create_upload('Namespace', model, delete_model: delete_model).tap do |u|
u.update!(organization_id: model.organization_id)
end
end
def create_project_relation_export_upload
project = create_project
project_export_job = project_export_jobs.create!(project_id: project.id, jid: SecureRandom.base64)
project_relation_export = project_relation_exports.create!(project_id: project.id,
project_export_job_id: project_export_job.id, relation: 'rel')
project_relation_export_uploads.create!(project_id: project.id,
project_relation_export_id: project_relation_export.id, export_file: 'export.file')
end
def create_project_relation_export_upload_upload(model: nil, delete_model: false)
model ||= create_project_relation_export_upload
create_upload('Projects::ImportExport::RelationExportUpload', model, delete_model: delete_model)
end
def create_designs_version
namespace = create_namespace
project = create_project
design = design_management_designs.create!(project_id: project.id, namespace_id: namespace.id,
filename: 'file.name', iid: 1)
version = design_management_versions.create!(namespace_id: namespace.id, sha: SecureRandom.base64)
design_management_designs_versions.create!(namespace_id: namespace.id, design_id: design.id, version_id: version.id)
end
def create_designs_version_upload(model: nil, delete_model: false)
model ||= create_designs_version
create_upload('DesignManagement::Action', model, delete_model: delete_model)
end
def create_bulk_import_export
namespace = create_namespace
bulk_import_exports.create!(group_id: namespace.id, status: 1, relation: 'rel')
end
def create_bulk_import_export_upload
export = create_bulk_import_export
bulk_import_export_uploads.create!(export_id: export.id, group_id: export.group_id)
end
def create_bulk_import_export_upload_upload(model: nil, delete_model: false)
model ||= create_bulk_import_export_upload
create_upload('BulkImports::ExportUpload', model, delete_model: delete_model)
end
end
# rubocop:enable RSpec/MultipleMemoizedHelpers