diff --git a/.rubocop_todo/rspec/feature_category.yml b/.rubocop_todo/rspec/feature_category.yml index 024b0d8c8580285dab9b8bf33c4c9280ec430f59..217ef323ee3d2bd3ca7802570f9723725c2fa358 100644 --- a/.rubocop_todo/rspec/feature_category.yml +++ b/.rubocop_todo/rspec/feature_category.yml @@ -3198,7 +3198,6 @@ RSpec/FeatureCategory: - 'spec/models/event_collection_spec.rb' - 'spec/models/external_issue_spec.rb' - 'spec/models/fork_network_member_spec.rb' - - 'spec/models/fork_network_spec.rb' - 'spec/models/generic_commit_status_spec.rb' - 'spec/models/gpg_key_spec.rb' - 'spec/models/gpg_key_subkey_spec.rb' diff --git a/app/models/fork_network.rb b/app/models/fork_network.rb index d40cba138ba235296bec52c1ccecfab5950abaf2..70d5bb25774cabcfaebe8b7f473c1bd4a330308a 100644 --- a/app/models/fork_network.rb +++ b/app/models/fork_network.rb @@ -2,7 +2,7 @@ class ForkNetwork < ApplicationRecord belongs_to :root_project, class_name: 'Project' - belongs_to :organization, class_name: 'Organizations::Organization', optional: true + belongs_to :organization, class_name: 'Organizations::Organization' has_many :fork_network_members has_many :projects, through: :fork_network_members diff --git a/db/migrate/20250415124320_add_not_null_to_fork_networks_organization_id.rb b/db/migrate/20250415124320_add_not_null_to_fork_networks_organization_id.rb new file mode 100644 index 0000000000000000000000000000000000000000..d8138ad66fadcd8b939b8f6a36ecaf77ef856c71 --- /dev/null +++ b/db/migrate/20250415124320_add_not_null_to_fork_networks_organization_id.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class AddNotNullToForkNetworksOrganizationId < Gitlab::Database::Migration[2.2] + disable_ddl_transaction! + + milestone '18.0' + + def up + change_column_null :fork_networks, :organization_id, false + end + + def down + change_column_null :fork_networks, :organization_id, true + end +end diff --git a/db/schema_migrations/20250415124320 b/db/schema_migrations/20250415124320 new file mode 100644 index 0000000000000000000000000000000000000000..f08f67131abe611058c56d9b0e2608fe6a0cbc95 --- /dev/null +++ b/db/schema_migrations/20250415124320 @@ -0,0 +1 @@ +9f7be8572dc499518d406e34e9c288c8b0814ffa7e64eb6f4b2ebf00ce2e2f81 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 9569d7557e80c4110b0c8a61b87f1f2367c8c6b2..9393178588105e26e742dd4363360b0af95ce731 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -14588,7 +14588,7 @@ CREATE TABLE fork_networks ( id bigint NOT NULL, root_project_id bigint, deleted_root_project_name character varying, - organization_id bigint + organization_id bigint NOT NULL ); CREATE SEQUENCE fork_networks_id_seq diff --git a/spec/lib/gitlab/background_migration/backfill_organization_id_on_fork_networks_spec.rb b/spec/lib/gitlab/background_migration/backfill_organization_id_on_fork_networks_spec.rb index 6391413324f671c3ebc614203ac6cee004c839d8..7581588377c7726847d879c118124235f416301e 100644 --- a/spec/lib/gitlab/background_migration/backfill_organization_id_on_fork_networks_spec.rb +++ b/spec/lib/gitlab/background_migration/backfill_organization_id_on_fork_networks_spec.rb @@ -41,8 +41,24 @@ } end + let(:connection) { ActiveRecord::Base.connection } + subject(:perform_migration) { described_class.new(**args).perform } + around do |example| + connection.transaction do + connection.execute(<<~SQL) + ALTER TABLE fork_networks ALTER COLUMN organization_id DROP NOT NULL; + SQL + + example.run + + connection.execute(<<~SQL) + ALTER TABLE fork_networks ALTER COLUMN organization_id SET NOT NULL; + SQL + end + end + context 'when root project exists' do let(:fork_network) { fork_networks_table.create!(root_project_id: project.id) } diff --git a/spec/models/fork_network_spec.rb b/spec/models/fork_network_spec.rb index f2ec0ccb4fd93c13afe76975e329640dcf87aa8c..6b7484262cb43e89e2b5d77a627797b097dedd2a 100644 --- a/spec/models/fork_network_spec.rb +++ b/spec/models/fork_network_spec.rb @@ -2,13 +2,17 @@ require 'spec_helper' -RSpec.describe ForkNetwork do +RSpec.describe ForkNetwork, feature_category: :source_code_management do include ProjectForksHelper + describe "validations" do + it { is_expected.to belong_to(:organization) } + end + describe '#add_root_as_member' do it 'adds the root project as a member when creating a new root network' do project = create(:project) - fork_network = described_class.create!(root_project: project) + fork_network = described_class.create!(root_project: project, organization_id: project.organization_id) expect(fork_network.projects).to include(project) end