From 15788ea78da5e724e39d7a1b71852e28e50f80fd Mon Sep 17 00:00:00 2001 From: Jason Knabl Date: Wed, 10 Dec 2025 17:34:57 -0500 Subject: [PATCH 1/4] Add NOT NULL constraint Adds a NOT NULL constraint to oauth_applications.organization_id. Run CI, see what breaks. --- ..._applications_organization_id_to_not_null.rb | 17 +++++++++++++++++ db/schema_migrations/20251210222353 | 1 + db/structure.sql | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 db/post_migrate/20251210222353_change_oauth_applications_organization_id_to_not_null.rb create mode 100644 db/schema_migrations/20251210222353 diff --git a/db/post_migrate/20251210222353_change_oauth_applications_organization_id_to_not_null.rb b/db/post_migrate/20251210222353_change_oauth_applications_organization_id_to_not_null.rb new file mode 100644 index 00000000000000..cd23879cde9493 --- /dev/null +++ b/db/post_migrate/20251210222353_change_oauth_applications_organization_id_to_not_null.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +# See https://docs.gitlab.com/ee/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class ChangeOauthApplicationsOrganizationIdToNotNull < Gitlab::Database::Migration[2.3] + disable_ddl_transaction! + milestone '18.8' + + def up + add_not_null_constraint :oauth_applications, :organization_id + end + + def down + remove_not_null_constraint :oauth_applications, :organization_id + end +end diff --git a/db/schema_migrations/20251210222353 b/db/schema_migrations/20251210222353 new file mode 100644 index 00000000000000..f6e8930c1bb5bb --- /dev/null +++ b/db/schema_migrations/20251210222353 @@ -0,0 +1 @@ +9bcd2fd04a7e4ce9236c684a43b8f72b6b2c772b1fd89db1de1f91297d0d5a2f \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 3059ddcc7554d1..848699090c5999 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -21829,7 +21829,8 @@ CREATE TABLE oauth_applications ( ropc_enabled boolean DEFAULT true NOT NULL, dynamic boolean DEFAULT false NOT NULL, organization_id bigint, - CONSTRAINT check_75750847b8 CHECK ((char_length(scopes) <= 2048)) + CONSTRAINT check_75750847b8 CHECK ((char_length(scopes) <= 2048)), + CONSTRAINT check_77eda6baaa CHECK ((organization_id IS NOT NULL)) ); CREATE SEQUENCE oauth_applications_id_seq -- GitLab From 7fd0a4a3b7562689026ecda4ab1cfdcaeda3f283 Mon Sep 17 00:00:00 2001 From: Jason Knabl Date: Wed, 10 Dec 2025 17:43:17 -0500 Subject: [PATCH 2/4] Fix some usages (squashed) * OauthApplication factory needs org id * Flag GeoNode#update_oauth_applications * Flag DynamicRegistrationsController#create * Flag GitHttpSpec * Flag RackAttackGlobalSpec * Flag ReadUserSharedExamples * Flag Doorkeeper factories * Flag DoorkeeperAccessSpec * Remove from sharding key spec allowed_to_be_not_null * Flag Mattermost::SessionSpec * Flag ApplicationCable::Connection spec * Flag Gitlab::Auth spec --- app/controllers/oauth/dynamic_registrations_controller.rb | 1 + ee/app/models/geo_node.rb | 2 ++ spec/channels/application_cable/connection_spec.rb | 1 + spec/factories/doorkeeper.rb | 1 + spec/factories/oauth_applications.rb | 2 ++ spec/lib/gitlab/auth_spec.rb | 1 + spec/lib/gitlab/organizations/sharding_key_spec.rb | 3 +-- spec/lib/mattermost/session_spec.rb | 1 + spec/requests/api/doorkeeper_access_spec.rb | 1 + spec/requests/git_http_spec.rb | 8 ++++++-- spec/requests/rack_attack_global_spec.rb | 3 +++ .../requests/api/read_user_shared_examples.rb | 1 + 12 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/controllers/oauth/dynamic_registrations_controller.rb b/app/controllers/oauth/dynamic_registrations_controller.rb index 9574ab379d0135..28642de1cabc3a 100644 --- a/app/controllers/oauth/dynamic_registrations_controller.rb +++ b/app/controllers/oauth/dynamic_registrations_controller.rb @@ -30,6 +30,7 @@ def create redirect_uris = client_metadata[:redirect_uris] redirect_uris = [redirect_uris] if redirect_uris.is_a?(String) + # TODO: Need to set `organization_id` for this `oauth_applications` write application = ::Authn::OauthApplication.create( name: "[Unverified Dynamic Application] #{client_metadata[:client_name]}", redirect_uri: Array(redirect_uris).join("\n"), diff --git a/ee/app/models/geo_node.rb b/ee/app/models/geo_node.rb index 94468eab75eaaf..6384de3ca99da0 100644 --- a/ee/app/models/geo_node.rb +++ b/ee/app/models/geo_node.rb @@ -318,11 +318,13 @@ def update_clone_url self.clone_url_prefix = Gitlab.config.gitlab_shell.ssh_path_prefix end + # TODO: this creates an `oauth_applications` row on save def update_oauth_application! return unless uri if oauth_application.nil? build_oauth_application + # TODO: set `organization_id` oauth_application.trusted = true oauth_application.confidential = true end diff --git a/spec/channels/application_cable/connection_spec.rb b/spec/channels/application_cable/connection_spec.rb index 7c7690326cee54..3bbd5de54fb9cf 100644 --- a/spec/channels/application_cable/connection_spec.rb +++ b/spec/channels/application_cable/connection_spec.rb @@ -96,6 +96,7 @@ let(:user) { create(:user) } let(:application) do + # TODO: needs `organization_id` Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) end diff --git a/spec/factories/doorkeeper.rb b/spec/factories/doorkeeper.rb index 7cb09e6c25a4de..d4e79fe1cb81b9 100644 --- a/spec/factories/doorkeeper.rb +++ b/spec/factories/doorkeeper.rb @@ -19,6 +19,7 @@ end end + # TODO: this needs `organization_id` factory :doorkeeper_application, class: 'Authn::OauthApplication' do sequence(:name) { |n| "Application #{n}" } redirect_uri { 'https://app.com/callback' } diff --git a/spec/factories/oauth_applications.rb b/spec/factories/oauth_applications.rb index aa28c4e904fbe7..a85144d759ca98 100644 --- a/spec/factories/oauth_applications.rb +++ b/spec/factories/oauth_applications.rb @@ -2,11 +2,13 @@ FactoryBot.define do factory :oauth_application, class: 'Authn::OauthApplication', aliases: [:application] do + # TODO: this needs organization sequence(:name) { |n| "OAuth App #{n}" } uid { Doorkeeper::OAuth::Helpers::UniqueToken.generate } redirect_uri { generate(:url) } owner owner_type { 'User' } + organization # Maybe this is good enough end trait :group_owned do diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb index 49fd0c130ff47d..fdd7fd003ce7b7 100644 --- a/spec/lib/gitlab/auth_spec.rb +++ b/spec/lib/gitlab/auth_spec.rb @@ -544,6 +544,7 @@ def operation let_it_be(:organization) { create(:organization) } let(:user) { create(:user, organizations: [organization]) } + # TODO: needs `organization_id` let(:application) { Authn::OauthApplication.create!(name: 'MyApp', redirect_uri: 'https://app.com', owner: user) } let(:scopes) { 'api' } diff --git a/spec/lib/gitlab/organizations/sharding_key_spec.rb b/spec/lib/gitlab/organizations/sharding_key_spec.rb index 5499b288fe2164..fdc1c7b3033dcb 100644 --- a/spec/lib/gitlab/organizations/sharding_key_spec.rb +++ b/spec/lib/gitlab/organizations/sharding_key_spec.rb @@ -47,8 +47,7 @@ bulk_import_batch_trackers.project_id ], # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/213933 'security_scans.project_id', # NOT NULL constraint NOT VALID - 'keys.organization_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/577246 - 'oauth_applications.organization_id' # https://gitlab.com/gitlab-org/gitlab/-/issues/579291 + 'keys.organization_id' # https://gitlab.com/gitlab-org/gitlab/-/issues/577246 ] end diff --git a/spec/lib/mattermost/session_spec.rb b/spec/lib/mattermost/session_spec.rb index 36d5449abfe0ee..14ce2ee5f8b48d 100644 --- a/spec/lib/mattermost/session_spec.rb +++ b/spec/lib/mattermost/session_spec.rb @@ -46,6 +46,7 @@ context 'with oauth_uri' do let!(:doorkeeper) do + # TODO: needs `organization_id` Authn::OauthApplication.create!( name: 'GitLab Mattermost', redirect_uri: "#{mattermost_url}/signup/gitlab/complete\n#{mattermost_url}/login/gitlab/complete", diff --git a/spec/requests/api/doorkeeper_access_spec.rb b/spec/requests/api/doorkeeper_access_spec.rb index 51aeb79e8b4910..1f6fe8a69f59d9 100644 --- a/spec/requests/api/doorkeeper_access_spec.rb +++ b/spec/requests/api/doorkeeper_access_spec.rb @@ -5,6 +5,7 @@ RSpec.describe 'doorkeeper access', feature_category: :system_access do let_it_be(:organization) { create(:organization) } let_it_be_with_reload(:user) { create(:user) } + # TODO: needs `organization_id` let!(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } let!(:token) { Doorkeeper::AccessToken.create! application_id: application.id, resource_owner_id: user.id, scopes: "api", organization_id: organization.id } diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb index fee92d486b5a6c..12f4b6964ef89f 100644 --- a/spec/requests/git_http_spec.rb +++ b/spec/requests/git_http_spec.rb @@ -653,10 +653,12 @@ end let(:application) do + # TODO: needs `organization_id` Authn::OauthApplication.create!( name: "MyApp", redirect_uri: "https://app.com", - owner: user) + owner: user + ) end let(:scopes) { 'api' } @@ -1432,10 +1434,12 @@ def pull end let(:application) do + # TODO: needs `organization_id` Authn::OauthApplication.create!( name: "MyApp", redirect_uri: "https://app.com", - owner: user) + owner: user + ) end let(:path) { "#{project.full_path}.git" } diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb index b19a41f801d6c8..323591693f2419 100644 --- a/spec/requests/rack_attack_global_spec.rb +++ b/spec/requests/rack_attack_global_spec.rb @@ -147,10 +147,12 @@ describe 'API requests authenticated with OAuth token', :api do let(:user) { create(:user) } + # TODO: needs `organization_id` let(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } let(:token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "api", expires_in: period_in_seconds + 1) } let(:other_user) { create(:user) } + # TODO: needs `organization_id` let(:other_user_application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: other_user) } let(:other_user_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: other_user.id, scopes: "api") } @@ -1436,6 +1438,7 @@ def expect_authenticated_request end context 'authenticated with OAuth token' do + # TODO: needs `organization_id` let(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } let(:oauth_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "api", expires_in: period_in_seconds + 1) } diff --git a/spec/support/shared_examples/requests/api/read_user_shared_examples.rb b/spec/support/shared_examples/requests/api/read_user_shared_examples.rb index 8873b5a198e7f4..41731b0203a1ff 100644 --- a/spec/support/shared_examples/requests/api/read_user_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/read_user_shared_examples.rb @@ -52,6 +52,7 @@ end context 'for doorkeeper (OAuth) tokens' do + # TODO: needs `organization_id` let!(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } context 'when the requesting token has the "api" scope' do -- GitLab From c86c223f66ea44a379a9c6e0f4e302b64ceec56a Mon Sep 17 00:00:00 2001 From: Jason Knabl Date: Thu, 11 Dec 2025 15:47:31 -0500 Subject: [PATCH 3/4] Fix some usages (squashed) * Flag Ai::AmazonQ::CreateService spec * Add organization_id to doorkeeper_application factory * Replace appliaction creation in connection spec * Replace application creation in AuthSpec * Replace Mattermost::Session spec application creation * Replace usage in doorkeeper access spec * Use oauth_application factory in GitHttpSpec * Use factory in rack attack global spec * Use factory in read user shared examples * Use default org for dynamic MCP creation * WIP Geo updates * Fix rubocop --- .../oauth/dynamic_registrations_controller.rb | 5 +++-- ee/app/models/geo_node.rb | 5 ++++- ee/spec/controllers/ee/root_controller_spec.rb | 1 + .../oauth/geo_auth_controller_spec.rb | 1 + .../features/admin/geo/admin_geo_nodes_spec.rb | 2 +- ee/spec/models/geo_node_spec.rb | 1 + .../requests/api/admin/data_management_spec.rb | 1 + .../api/graphql/geo/registries_spec.rb | 2 ++ .../mutations/geo/registries/update_spec.rb | 2 ++ ee/spec/requests/api/graphql_spec.rb | 1 + ee/spec/requests/api/internal/base_spec.rb | 1 + ee/spec/requests/git_http_geo_spec.rb | 5 +++++ .../ai/amazon_q/create_service_spec.rb | 1 + .../application_cable/connection_spec.rb | 3 +-- spec/factories/doorkeeper.rb | 2 +- spec/lib/gitlab/auth_spec.rb | 3 +-- spec/lib/mattermost/session_spec.rb | 7 ++++--- spec/requests/api/doorkeeper_access_spec.rb | 3 +-- spec/requests/git_http_spec.rb | 18 ++---------------- .../dynamic_registrations_controller_spec.rb | 3 +++ spec/requests/rack_attack_global_spec.rb | 9 +++------ .../requests/api/read_user_shared_examples.rb | 3 +-- 22 files changed, 41 insertions(+), 38 deletions(-) diff --git a/app/controllers/oauth/dynamic_registrations_controller.rb b/app/controllers/oauth/dynamic_registrations_controller.rb index 28642de1cabc3a..42d861724138a0 100644 --- a/app/controllers/oauth/dynamic_registrations_controller.rb +++ b/app/controllers/oauth/dynamic_registrations_controller.rb @@ -30,13 +30,14 @@ def create redirect_uris = client_metadata[:redirect_uris] redirect_uris = [redirect_uris] if redirect_uris.is_a?(String) - # TODO: Need to set `organization_id` for this `oauth_applications` write application = ::Authn::OauthApplication.create( name: "[Unverified Dynamic Application] #{client_metadata[:client_name]}", redirect_uri: Array(redirect_uris).join("\n"), scopes: scopes, confidential: false, - dynamic: true + dynamic: true, + # TODO: confirm the correct way to find the organization in this context + organization: ::Organizations::Organization.first # rubocop:disable Gitlab/PreventOrganizationFirst -- needed ) if application.persisted? diff --git a/ee/app/models/geo_node.rb b/ee/app/models/geo_node.rb index 6384de3ca99da0..d4bc3998dc9682 100644 --- a/ee/app/models/geo_node.rb +++ b/ee/app/models/geo_node.rb @@ -324,13 +324,16 @@ def update_oauth_application! if oauth_application.nil? build_oauth_application - # TODO: set `organization_id` oauth_application.trusted = true oauth_application.confidential = true end oauth_application.name = "Geo node: #{url}" oauth_application.redirect_uri = oauth_callback_url + # TODO: verify the correct way to associate an organization here. + # * It appears that `Geo::Node` objects can have multiple organizations -- how do we select from among them? + # * What if there are no `organizations`? Do we use the instance default in that case? + oauth_application.organization = ::Organizations::Organization.first # rubocop:disable Gitlab/PreventOrganizationFirst -- todo end def expire_cache! diff --git a/ee/spec/controllers/ee/root_controller_spec.rb b/ee/spec/controllers/ee/root_controller_spec.rb index de12d1322b9710..5b1fb4a4c16b43 100644 --- a/ee/spec/controllers/ee/root_controller_spec.rb +++ b/ee/spec/controllers/ee/root_controller_spec.rb @@ -4,6 +4,7 @@ RSpec.describe RootController, feature_category: :geo_replication do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo describe 'GET #index' do context 'when user is not logged in' do diff --git a/ee/spec/controllers/oauth/geo_auth_controller_spec.rb b/ee/spec/controllers/oauth/geo_auth_controller_spec.rb index 33ccdb3c10f31b..33637a657c3a0b 100644 --- a/ee/spec/controllers/oauth/geo_auth_controller_spec.rb +++ b/ee/spec/controllers/oauth/geo_auth_controller_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Oauth::GeoAuthController, :geo, feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo # The Geo OAuth workflow depends on the OAuth application and the URL # defined on the Geo primary node, so we use let! instead of let here # to define a memoized helper method that is called in a `before` hook diff --git a/ee/spec/features/admin/geo/admin_geo_nodes_spec.rb b/ee/spec/features/admin/geo/admin_geo_nodes_spec.rb index fc60fcfc749b73..6fad71b415a6bb 100644 --- a/ee/spec/features/admin/geo/admin_geo_nodes_spec.rb +++ b/ee/spec/features/admin/geo/admin_geo_nodes_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe 'Admin Geo Sites', :js, :geo, feature_category: :geo_replication do - let_it_be(:admin) { create(:admin) } + let_it_be(:admin) { create(:admin) } # This creates an org, so nothing new necessary. Seems very implicit. let!(:geo_site) { create(:geo_node) } diff --git a/ee/spec/models/geo_node_spec.rb b/ee/spec/models/geo_node_spec.rb index 89ab746809c1dc..dade6c1fa6bf97 100644 --- a/ee/spec/models/geo_node_spec.rb +++ b/ee/spec/models/geo_node_spec.rb @@ -6,6 +6,7 @@ using RSpec::Parameterized::TableSyntax include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:dummy_url) { 'https://localhost:3000/gitlab' } let(:new_node_attrs) { { url: dummy_url } } let(:new_node) { create(:geo_node, new_node_attrs) } diff --git a/ee/spec/requests/api/admin/data_management_spec.rb b/ee/spec/requests/api/admin/data_management_spec.rb index 49369f8db5652a..3cdcd640e54802 100644 --- a/ee/spec/requests/api/admin/data_management_spec.rb +++ b/ee/spec/requests/api/admin/data_management_spec.rb @@ -6,6 +6,7 @@ include ApiHelpers include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:admin) { create(:admin) } let_it_be(:user) { create(:user) } diff --git a/ee/spec/requests/api/graphql/geo/registries_spec.rb b/ee/spec/requests/api/graphql/geo/registries_spec.rb index f723e729b61f4c..56e0a5d7e31862 100644 --- a/ee/spec/requests/api/graphql/geo/registries_spec.rb +++ b/ee/spec/requests/api/graphql/geo/registries_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe 'Gets registries', feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + it_behaves_like 'gets registries for', { field_name: 'mergeRequestDiffRegistries', registry_class_name: 'MergeRequestDiffRegistry', diff --git a/ee/spec/requests/api/graphql/mutations/geo/registries/update_spec.rb b/ee/spec/requests/api/graphql/mutations/geo/registries/update_spec.rb index 7ecd3dd2e34918..feb40de085430e 100644 --- a/ee/spec/requests/api/graphql/mutations/geo/registries/update_spec.rb +++ b/ee/spec/requests/api/graphql/mutations/geo/registries/update_spec.rb @@ -6,6 +6,8 @@ include GraphqlHelpers include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + let(:mutation_name) { :geo_registries_update } let_it_be(:current_user) { create(:user, :admin) } diff --git a/ee/spec/requests/api/graphql_spec.rb b/ee/spec/requests/api/graphql_spec.rb index 63db675cfa4fca..7ded4179b7060e 100644 --- a/ee/spec/requests/api/graphql_spec.rb +++ b/ee/spec/requests/api/graphql_spec.rb @@ -6,6 +6,7 @@ include GraphqlHelpers include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:project) { create(:project, :public) } let_it_be(:current_user) { create(:user, developer_of: [project]) } let_it_be(:resource) { create(:issue, project: project) } diff --git a/ee/spec/requests/api/internal/base_spec.rb b/ee/spec/requests/api/internal/base_spec.rb index 0d80acf46317c9..efd9bf17e3d698 100644 --- a/ee/spec/requests/api/internal/base_spec.rb +++ b/ee/spec/requests/api/internal/base_spec.rb @@ -8,6 +8,7 @@ include NamespaceStorageHelpers include GitlabSubscriptions::SubscriptionHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_url) { 'http://primary.example.com' } let_it_be(:secondary_url) { 'http://secondary.example.com' } let_it_be(:primary_node, reload: true) { create(:geo_node, :primary, url: primary_url) } diff --git a/ee/spec/requests/git_http_geo_spec.rb b/ee/spec/requests/git_http_geo_spec.rb index b27652a1ec7333..27e0982b4f43b4 100644 --- a/ee/spec/requests/git_http_geo_spec.rb +++ b/ee/spec/requests/git_http_geo_spec.rb @@ -9,6 +9,7 @@ include WorkhorseHelpers using RSpec::Parameterized::TableSyntax + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:project_with_repo) { create(:project, :repository, :private) } let_it_be(:project_no_repo) { create(:project, :private) } let_it_be(:project_registry_with_repo) { create(:geo_project_repository_registry, :verification_succeeded, project: project_with_repo, last_synced_at: project_with_repo.last_repository_updated_at + 10.seconds) } @@ -314,6 +315,7 @@ def make_request end end + # rubocop:disable RSpec/MultipleMemoizedHelpers -- todo context 'when the repository does not exist' do let_it_be(:project) { project_no_repo } @@ -321,6 +323,7 @@ def make_request it_behaves_like 'a Geo 302 redirect to Primary' end + # rubocop:enable RSpec/MultipleMemoizedHelpers context 'batch requests' do let_it_be(:project) { project_with_repo } @@ -338,6 +341,7 @@ def make_request end end + # rubocop:disable RSpec/MultipleMemoizedHelpers -- todo context 'objects are not in sync' do let(:redirect_url) { full_redirected_url } let(:registry) { create(:geo_lfs_object_registry, :started) } @@ -345,6 +349,7 @@ def make_request it_behaves_like 'a Geo 302 redirect to Primary' end + # rubocop:enable RSpec/MultipleMemoizedHelpers end where(:description, :version) do diff --git a/ee/spec/services/ai/amazon_q/create_service_spec.rb b/ee/spec/services/ai/amazon_q/create_service_spec.rb index ce125f3418f006..a7161b315fa990 100644 --- a/ee/spec/services/ai/amazon_q/create_service_spec.rb +++ b/ee/spec/services/ai/amazon_q/create_service_spec.rb @@ -7,6 +7,7 @@ let_it_be(:add_on_purchase) { create(:gitlab_subscription_add_on_purchase, :duo_amazon_q) } let_it_be(:organization) { create(:organization) } let_it_be(:user) { create(:admin, organizations: [organization]) } + # TODO: needs `organization_id` let_it_be(:doorkeeper_application) { create(:doorkeeper_application) } let_it_be(:base_params) do { role_arn: 'a', availability: 'default_on', auto_review_enabled: true, organization_id: organization.id } diff --git a/spec/channels/application_cable/connection_spec.rb b/spec/channels/application_cable/connection_spec.rb index 3bbd5de54fb9cf..cd80ba44b789e2 100644 --- a/spec/channels/application_cable/connection_spec.rb +++ b/spec/channels/application_cable/connection_spec.rb @@ -96,8 +96,7 @@ let(:user) { create(:user) } let(:application) do - # TODO: needs `organization_id` - Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) + create(:oauth_application, owner: user) end let(:oauth_token) do diff --git a/spec/factories/doorkeeper.rb b/spec/factories/doorkeeper.rb index d4e79fe1cb81b9..5867bfc825849e 100644 --- a/spec/factories/doorkeeper.rb +++ b/spec/factories/doorkeeper.rb @@ -19,9 +19,9 @@ end end - # TODO: this needs `organization_id` factory :doorkeeper_application, class: 'Authn::OauthApplication' do sequence(:name) { |n| "Application #{n}" } redirect_uri { 'https://app.com/callback' } + organization end end diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb index fdd7fd003ce7b7..991633ff8982df 100644 --- a/spec/lib/gitlab/auth_spec.rb +++ b/spec/lib/gitlab/auth_spec.rb @@ -544,8 +544,7 @@ def operation let_it_be(:organization) { create(:organization) } let(:user) { create(:user, organizations: [organization]) } - # TODO: needs `organization_id` - let(:application) { Authn::OauthApplication.create!(name: 'MyApp', redirect_uri: 'https://app.com', owner: user) } + let(:application) { create(:oauth_application, owner: user) } let(:scopes) { 'api' } let(:token) do diff --git a/spec/lib/mattermost/session_spec.rb b/spec/lib/mattermost/session_spec.rb index 14ce2ee5f8b48d..17adee9b3500a5 100644 --- a/spec/lib/mattermost/session_spec.rb +++ b/spec/lib/mattermost/session_spec.rb @@ -46,11 +46,12 @@ context 'with oauth_uri' do let!(:doorkeeper) do - # TODO: needs `organization_id` - Authn::OauthApplication.create!( + create( + :oauth_application, name: 'GitLab Mattermost', redirect_uri: "#{mattermost_url}/signup/gitlab/complete\n#{mattermost_url}/login/gitlab/complete", - scopes: '') + scopes: '' + ) end context 'without token_uri' do diff --git a/spec/requests/api/doorkeeper_access_spec.rb b/spec/requests/api/doorkeeper_access_spec.rb index 1f6fe8a69f59d9..bd13485c17aeef 100644 --- a/spec/requests/api/doorkeeper_access_spec.rb +++ b/spec/requests/api/doorkeeper_access_spec.rb @@ -5,8 +5,7 @@ RSpec.describe 'doorkeeper access', feature_category: :system_access do let_it_be(:organization) { create(:organization) } let_it_be_with_reload(:user) { create(:user) } - # TODO: needs `organization_id` - let!(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } + let!(:application) { create(:oauth_application, owner: user) } let!(:token) { Doorkeeper::AccessToken.create! application_id: application.id, resource_owner_id: user.id, scopes: "api", organization_id: organization.id } describe 'access token with composite identity scope', :request_store do diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb index 12f4b6964ef89f..886a9389f8a5d8 100644 --- a/spec/requests/git_http_spec.rb +++ b/spec/requests/git_http_spec.rb @@ -652,14 +652,7 @@ .plaintext_token end - let(:application) do - # TODO: needs `organization_id` - Authn::OauthApplication.create!( - name: "MyApp", - redirect_uri: "https://app.com", - owner: user - ) - end + let(:application) { create(:oauth_application, owner: user) } let(:scopes) { 'api' } let(:path) { "#{project.full_path}.git" } @@ -1433,14 +1426,7 @@ def pull .plaintext_token end - let(:application) do - # TODO: needs `organization_id` - Authn::OauthApplication.create!( - name: "MyApp", - redirect_uri: "https://app.com", - owner: user - ) - end + let(:application) { create(:oauth_application, owner: user) } let(:path) { "#{project.full_path}.git" } let(:env) { { user: 'oauth2', password: token } } diff --git a/spec/requests/oauth/dynamic_registrations_controller_spec.rb b/spec/requests/oauth/dynamic_registrations_controller_spec.rb index 8c56efa12fd076..2f41aef66bd26d 100644 --- a/spec/requests/oauth/dynamic_registrations_controller_spec.rb +++ b/spec/requests/oauth/dynamic_registrations_controller_spec.rb @@ -3,6 +3,9 @@ require 'spec_helper' RSpec.describe Oauth::DynamicRegistrationsController, feature_category: :system_access do + # TODO: confirm: in practice, is it possible for a GitLab install to have _no_ organization created? If so, then + # using Organization.first does not work. + let!(:default_organization) { create(:organization) } let(:oauth_registration_path) { Gitlab::Routing.url_helpers.oauth_register_path } let(:valid_request_body) do diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb index 323591693f2419..88ad4b7e5afcfc 100644 --- a/spec/requests/rack_attack_global_spec.rb +++ b/spec/requests/rack_attack_global_spec.rb @@ -147,13 +147,11 @@ describe 'API requests authenticated with OAuth token', :api do let(:user) { create(:user) } - # TODO: needs `organization_id` - let(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } + let(:application) { create(:oauth_application, owner: user) } let(:token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "api", expires_in: period_in_seconds + 1) } let(:other_user) { create(:user) } - # TODO: needs `organization_id` - let(:other_user_application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: other_user) } + let(:other_user_application) { create(:oauth_application, owner: other_user) } let(:other_user_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: other_user.id, scopes: "api") } let(:throttle_setting_prefix) { 'throttle_authenticated_api' } @@ -1438,8 +1436,7 @@ def expect_authenticated_request end context 'authenticated with OAuth token' do - # TODO: needs `organization_id` - let(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } + let(:application) { create(:oauth_application, owner: user) } let(:oauth_token) { create(:oauth_access_token, application_id: application.id, resource_owner_id: user.id, scopes: "api", expires_in: period_in_seconds + 1) } it 'request is authenticated by token in query string' do diff --git a/spec/support/shared_examples/requests/api/read_user_shared_examples.rb b/spec/support/shared_examples/requests/api/read_user_shared_examples.rb index 41731b0203a1ff..4f60d8cd2f2747 100644 --- a/spec/support/shared_examples/requests/api/read_user_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/read_user_shared_examples.rb @@ -52,8 +52,7 @@ end context 'for doorkeeper (OAuth) tokens' do - # TODO: needs `organization_id` - let!(:application) { Authn::OauthApplication.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) } + let!(:application) { create(:oauth_application, owner: user) } context 'when the requesting token has the "api" scope' do let!(:token) do -- GitLab From 131a8f647cc6bf296358b15b68585d73425432d5 Mon Sep 17 00:00:00 2001 From: Jason Knabl Date: Wed, 17 Dec 2025 17:05:21 -0500 Subject: [PATCH 4/4] Fix some more usages (squashed) * Fix Application::CreateService spec * Fix internal redirect spec * Fix SessionsController spec * Set default org_id for server config workflow api * Fix Geo graphql service spec * Fix geo design management replicator spec * Fix geo projectrepositoryreplicator spec * Fix geo pagesdeploymentreplicator spec * Fix org_id-related failures in gitlab usagedata spec * Fix geo pipelineartifactreplicator spec * Fix geo blobdownloadservice spec * Fix geo console showsyncfailuresforreplicatorclassaction spec * Fix geo registries resolver shared examples * Fix framework registry sync shared examples * Fix geo secondary registryconsistencyworker specs * Fix blob replicator shared example specs * Fix geo event service spec * Fix geo rake tasks spec * Fix geo nodestatus spec * Fix geo fileregistryremoval spec * Fix geo nodeupdateservice spec * Fix geo replication blobdownloader spec * Fix geotasks spec * Fix gitlab::geo spec * Fix org_id errors in project destroyservice spec * Fix upload spec * Fix geo pruneeventlogworker spec * Fix repository replicator shared examples * Fix repository spec * Fix repositorycheck batchworker spec * Fix postreceiveservice spec * Fix geo gitpushhttp spec * Fix geo systemcheck sshportcheck spec * Fix readonlybanner spec * Fix feo uploadreplicator spec * Fix geo registryconsistencyservice spec * Fix raketask geotask spec * Fix geonodepolicy spec * Fix geo verificationstate specs * Fix geo containerrepositoryreplicator spec * Fix geonodestatuscheck spec * Fix geo healthcheck spec --- .../workspaces_server_operations/server_config/main.rb | 2 ++ .../server_config/oauth_application_attributes_generator.rb | 5 ++++- ee/spec/controllers/concerns/internal_redirect_spec.rb | 2 ++ ee/spec/controllers/ee/sessions_controller_spec.rb | 1 + ee/spec/lib/ee/gitlab/usage_data_spec.rb | 2 ++ .../show_sync_failures_for_replicator_class_action_spec.rb | 1 + ee/spec/lib/geo/system_check/ssh_port_check_spec.rb | 1 + ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb | 1 + ee/spec/lib/gitlab/geo/geo_tasks_spec.rb | 2 ++ ee/spec/lib/gitlab/geo/git_push_http_spec.rb | 1 + ee/spec/lib/gitlab/geo/health_check_spec.rb | 1 + ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb | 1 + ee/spec/lib/gitlab/geo_spec.rb | 1 + ee/spec/lib/system_check/rake_task/geo_task_spec.rb | 1 + ee/spec/models/concerns/geo/verification_state_spec.rb | 1 + ee/spec/models/geo_node_status_spec.rb | 1 + ee/spec/models/repository_spec.rb | 1 + ee/spec/models/upload_spec.rb | 2 ++ ee/spec/policies/geo_node_policy_spec.rb | 1 + .../replicators/geo/container_repository_replicator_spec.rb | 1 + .../geo/design_management_repository_replicator_spec.rb | 1 + ee/spec/replicators/geo/pages_deployment_replicator_spec.rb | 1 + ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb | 1 + .../replicators/geo/project_repository_replicator_spec.rb | 1 + ee/spec/replicators/geo/upload_replicator_spec.rb | 1 + ee/spec/services/ee/post_receive_service_spec.rb | 1 + ee/spec/services/geo/blob_download_service_spec.rb | 1 + ee/spec/services/geo/event_service_spec.rb | 1 + ee/spec/services/geo/file_registry_removal_service_spec.rb | 1 + ee/spec/services/geo/graphql_request_service_spec.rb | 1 + ee/spec/services/geo/node_update_service_spec.rb | 1 + ee/spec/services/geo/registry_consistency_service_spec.rb | 1 + ee/spec/services/projects/destroy_service_spec.rb | 1 + .../graphql/geo/geo_registries_resolver_shared_examples.rb | 1 + .../concerns/blob_replicator_strategy_shared_examples.rb | 1 + .../repository_replicator_strategy_shared_examples.rb | 1 + .../geo/framework_registry_sync_worker_shared_examples.rb | 1 + ee/spec/tasks/geo_rake_spec.rb | 2 ++ .../views/layouts/header/_read_only_banner.html.haml_spec.rb | 1 + ee/spec/workers/ee/repository_check/batch_worker_spec.rb | 1 + ee/spec/workers/geo/prune_event_log_worker_spec.rb | 1 + .../geo/secondary/registry_consistency_worker_spec.rb | 1 + spec/services/applications/create_service_spec.rb | 5 +++-- 43 files changed, 54 insertions(+), 3 deletions(-) diff --git a/ee/lib/remote_development/workspaces_server_operations/server_config/main.rb b/ee/lib/remote_development/workspaces_server_operations/server_config/main.rb index 9dfda417ec6d2c..5f28a7b5df396b 100644 --- a/ee/lib/remote_development/workspaces_server_operations/server_config/main.rb +++ b/ee/lib/remote_development/workspaces_server_operations/server_config/main.rb @@ -12,6 +12,8 @@ class Main def self.main(context) initial_result = Gitlab::Fp::Result.ok(context) + # TODO: This flow creates an OAuth application. There was discussion about that here which may need to be + # revisited: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/194652#note_2662912641 result = initial_result .map(OauthApplicationAttributesGenerator.method(:generate)) diff --git a/ee/lib/remote_development/workspaces_server_operations/server_config/oauth_application_attributes_generator.rb b/ee/lib/remote_development/workspaces_server_operations/server_config/oauth_application_attributes_generator.rb index a49212bffb106e..1e08059d79e431 100644 --- a/ee/lib/remote_development/workspaces_server_operations/server_config/oauth_application_attributes_generator.rb +++ b/ee/lib/remote_development/workspaces_server_operations/server_config/oauth_application_attributes_generator.rb @@ -26,12 +26,15 @@ def self.generate(context) redirect_uri = api_external_url.dup redirect_uri.path = "#{redirect_uri.path}/#{OAUTH_REDIRECT_URI_PATH_SEGMENT}" + # TODO: need to set a realistic organization ID here, see + # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/194652#note_2662912641 attributes = { name: OAUTH_NAME, redirect_uri: redirect_uri.to_s, scopes: "openid", trusted: TRUSTED, - confidential: CONFIDENTIAL + confidential: CONFIDENTIAL, + organization_id: ::Organizations::Organization.first&.id # rubocop:disable Gitlab/PreventOrganizationFirst -- todo } context.merge( diff --git a/ee/spec/controllers/concerns/internal_redirect_spec.rb b/ee/spec/controllers/concerns/internal_redirect_spec.rb index c00218a146d4a2..87022c1d4370ee 100644 --- a/ee/spec/controllers/concerns/internal_redirect_spec.rb +++ b/ee/spec/controllers/concerns/internal_redirect_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe InternalRedirect, feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + let(:controller_class) do Class.new do include InternalRedirect diff --git a/ee/spec/controllers/ee/sessions_controller_spec.rb b/ee/spec/controllers/ee/sessions_controller_spec.rb index 7b2ed63437de86..fe51b22808b179 100644 --- a/ee/spec/controllers/ee/sessions_controller_spec.rb +++ b/ee/spec/controllers/ee/sessions_controller_spec.rb @@ -12,6 +12,7 @@ describe '#new' do context 'on a Geo secondary node' do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_node) { create(:geo_node, :primary) } let_it_be(:secondary_node) { create(:geo_node) } diff --git a/ee/spec/lib/ee/gitlab/usage_data_spec.rb b/ee/spec/lib/ee/gitlab/usage_data_spec.rb index 95e06b5674e504..115029a48ceb86 100644 --- a/ee/spec/lib/ee/gitlab/usage_data_spec.rb +++ b/ee/spec/lib/ee/gitlab/usage_data_spec.rb @@ -5,6 +5,8 @@ RSpec.describe Gitlab::UsageData, feature_category: :service_ping do include UsageDataHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + before do stub_usage_data_connections stub_database_flavor_check diff --git a/ee/spec/lib/geo/console/show_sync_failures_for_replicator_class_action_spec.rb b/ee/spec/lib/geo/console/show_sync_failures_for_replicator_class_action_spec.rb index 809bb4cdd837ef..3e8159c99118ab 100644 --- a/ee/spec/lib/geo/console/show_sync_failures_for_replicator_class_action_spec.rb +++ b/ee/spec/lib/geo/console/show_sync_failures_for_replicator_class_action_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Geo::Console::ShowSyncFailuresForReplicatorClassAction, feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:action) do described_class.new( replicator_class: Geo::UploadReplicator, diff --git a/ee/spec/lib/geo/system_check/ssh_port_check_spec.rb b/ee/spec/lib/geo/system_check/ssh_port_check_spec.rb index 079b71aa217842..5fc39d38c989a4 100644 --- a/ee/spec/lib/geo/system_check/ssh_port_check_spec.rb +++ b/ee/spec/lib/geo/system_check/ssh_port_check_spec.rb @@ -7,6 +7,7 @@ subject(:ssh_port_check) { described_class.new } + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_node) { create(:geo_node, :primary) } let_it_be(:secondary_node) { create(:geo_node) } diff --git a/ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb b/ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb index 443744e8785408..1b0d19e063c875 100644 --- a/ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb +++ b/ee/spec/lib/gitlab/geo/geo_node_status_check_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Gitlab::Geo::GeoNodeStatusCheck, :geo, feature_category: :geo_replication do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:current_node) { create(:geo_node) } let(:geo_node_status) do diff --git a/ee/spec/lib/gitlab/geo/geo_tasks_spec.rb b/ee/spec/lib/gitlab/geo/geo_tasks_spec.rb index 3a35e4815c1317..833dddd1e19fb9 100644 --- a/ee/spec/lib/gitlab/geo/geo_tasks_spec.rb +++ b/ee/spec/lib/gitlab/geo/geo_tasks_spec.rb @@ -5,6 +5,8 @@ RSpec.describe Gitlab::Geo::GeoTasks, feature_category: :geo_replication do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + describe '.set_primary_geo_node' do before do allow(GeoNode).to receive(:current_node_name).and_return('https://primary.geo.example.com') diff --git a/ee/spec/lib/gitlab/geo/git_push_http_spec.rb b/ee/spec/lib/gitlab/geo/git_push_http_spec.rb index a6a23ea08c6d06..95fc0156681e00 100644 --- a/ee/spec/lib/gitlab/geo/git_push_http_spec.rb +++ b/ee/spec/lib/gitlab/geo/git_push_http_spec.rb @@ -7,6 +7,7 @@ feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:gl_id) { 'user-1234' } let(:gl_repository) { 'project-77777' } let(:cache_key) { "#{described_class::CACHE_KEY_PREFIX}:#{gl_id}:#{gl_repository}" } diff --git a/ee/spec/lib/gitlab/geo/health_check_spec.rb b/ee/spec/lib/gitlab/geo/health_check_spec.rb index e1a895a16bdbf0..7b7f350a65d15a 100644 --- a/ee/spec/lib/gitlab/geo/health_check_spec.rb +++ b/ee/spec/lib/gitlab/geo/health_check_spec.rb @@ -6,6 +6,7 @@ include ::EE::GeoHelpers using RSpec::Parameterized::TableSyntax + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:secondary) { create(:geo_node) } describe '#perform_checks' do diff --git a/ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb b/ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb index f8a43d9fba9890..9ab83e62d56474 100644 --- a/ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb +++ b/ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Gitlab::Geo::Replication::BlobDownloader, feature_category: :geo_replication do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/ee/spec/lib/gitlab/geo_spec.rb b/ee/spec/lib/gitlab/geo_spec.rb index 0214c3f00f8172..ffbf8e2550065d 100644 --- a/ee/spec/lib/gitlab/geo_spec.rb +++ b/ee/spec/lib/gitlab/geo_spec.rb @@ -6,6 +6,7 @@ using RSpec::Parameterized::TableSyntax include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_node) { create(:geo_node, :primary) } let_it_be(:secondary_node) { create(:geo_node) } diff --git a/ee/spec/lib/system_check/rake_task/geo_task_spec.rb b/ee/spec/lib/system_check/rake_task/geo_task_spec.rb index 77c337929f2c07..ed12347e4b317e 100644 --- a/ee/spec/lib/system_check/rake_task/geo_task_spec.rb +++ b/ee/spec/lib/system_check/rake_task/geo_task_spec.rb @@ -5,6 +5,7 @@ RSpec.describe SystemCheck::RakeTask::GeoTask, feature_category: :geo_replication do include ::EE::GeoHelpers + let!(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:common_checks) do [ Geo::SystemCheck::LicenseCheck, diff --git a/ee/spec/models/concerns/geo/verification_state_spec.rb b/ee/spec/models/concerns/geo/verification_state_spec.rb index 08ec04fe93a50b..7b94f3da636235 100644 --- a/ee/spec/models/concerns/geo/verification_state_spec.rb +++ b/ee/spec/models/concerns/geo/verification_state_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Geo::VerificationState, feature_category: :geo_replication do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_node) { create(:geo_node, :primary) } let_it_be(:secondary_node) { create(:geo_node, :secondary) } diff --git a/ee/spec/models/geo_node_status_spec.rb b/ee/spec/models/geo_node_status_spec.rb index 23f43ba09acff9..b08bd60764c014 100644 --- a/ee/spec/models/geo_node_status_spec.rb +++ b/ee/spec/models/geo_node_status_spec.rb @@ -7,6 +7,7 @@ using RSpec::Parameterized::TableSyntax + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node, :secondary) } diff --git a/ee/spec/models/repository_spec.rb b/ee/spec/models/repository_spec.rb index 3277e7e8b487cc..2791630e3de2f7 100644 --- a/ee/spec/models/repository_spec.rb +++ b/ee/spec/models/repository_spec.rb @@ -11,6 +11,7 @@ stub_feature_flags(geo_project_repository_replication_v2: false) end + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_node) { create(:geo_node, :primary) } let_it_be(:secondary_node) { create(:geo_node) } diff --git a/ee/spec/models/upload_spec.rb b/ee/spec/models/upload_spec.rb index 570addb4edb5f6..0d02a5a5b18e09 100644 --- a/ee/spec/models/upload_spec.rb +++ b/ee/spec/models/upload_spec.rb @@ -5,6 +5,8 @@ RSpec.describe Upload, feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + it { is_expected.to have_one(:upload_state).inverse_of(:upload).class_name('Geo::UploadState') } include_examples 'a verifiable model for verification state' do diff --git a/ee/spec/policies/geo_node_policy_spec.rb b/ee/spec/policies/geo_node_policy_spec.rb index c3d9c8a297ee9e..ebbef54eb112a4 100644 --- a/ee/spec/policies/geo_node_policy_spec.rb +++ b/ee/spec/policies/geo_node_policy_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe GeoNodePolicy, feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:geo_node) { create(:geo_node) } subject(:policy) { described_class.new(current_user, geo_node) } diff --git a/ee/spec/replicators/geo/container_repository_replicator_spec.rb b/ee/spec/replicators/geo/container_repository_replicator_spec.rb index 2dafe09d749463..91831882668fd2 100644 --- a/ee/spec/replicators/geo/container_repository_replicator_spec.rb +++ b/ee/spec/replicators/geo/container_repository_replicator_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Geo::ContainerRepositoryReplicator, :geo, feature_category: :geo_replication do include_context 'container registry client stubs' + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/ee/spec/replicators/geo/design_management_repository_replicator_spec.rb b/ee/spec/replicators/geo/design_management_repository_replicator_spec.rb index 67e624d4209169..fc585608f7436b 100644 --- a/ee/spec/replicators/geo/design_management_repository_replicator_spec.rb +++ b/ee/spec/replicators/geo/design_management_repository_replicator_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe Geo::DesignManagementRepositoryReplicator, feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:model_record) { create(:design_management_repository, project: create(:project)) } include_examples 'a repository replicator' do diff --git a/ee/spec/replicators/geo/pages_deployment_replicator_spec.rb b/ee/spec/replicators/geo/pages_deployment_replicator_spec.rb index 7f360ddd449133..e5bbfea39ee621 100644 --- a/ee/spec/replicators/geo/pages_deployment_replicator_spec.rb +++ b/ee/spec/replicators/geo/pages_deployment_replicator_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe Geo::PagesDeploymentReplicator, feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:model_record) { create(:pages_deployment) } include_examples 'a blob replicator' diff --git a/ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb b/ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb index b9e0c7934d62f5..252bf6dccff180 100644 --- a/ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb +++ b/ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe Geo::PipelineArtifactReplicator, feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:model_record) { create(:ci_pipeline_artifact, :with_coverage_report) } include_examples 'a blob replicator' diff --git a/ee/spec/replicators/geo/project_repository_replicator_spec.rb b/ee/spec/replicators/geo/project_repository_replicator_spec.rb index d3b8eff04d1d70..871c0e7e81a849 100644 --- a/ee/spec/replicators/geo/project_repository_replicator_spec.rb +++ b/ee/spec/replicators/geo/project_repository_replicator_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Geo::ProjectRepositoryReplicator, feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:project) { create(:project_with_repo) } let(:model_record) { project } let(:primary_node) { create(:geo_node, :primary) } diff --git a/ee/spec/replicators/geo/upload_replicator_spec.rb b/ee/spec/replicators/geo/upload_replicator_spec.rb index 3f1db176d3c97c..b3da89979468b4 100644 --- a/ee/spec/replicators/geo/upload_replicator_spec.rb +++ b/ee/spec/replicators/geo/upload_replicator_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe Geo::UploadReplicator, feature_category: :geo_replication do + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:model_record) { create(:upload, :with_file) } include_examples 'a blob replicator' diff --git a/ee/spec/services/ee/post_receive_service_spec.rb b/ee/spec/services/ee/post_receive_service_spec.rb index 5653b043bbee4a..76e274f15dfff5 100644 --- a/ee/spec/services/ee/post_receive_service_spec.rb +++ b/ee/spec/services/ee/post_receive_service_spec.rb @@ -5,6 +5,7 @@ RSpec.describe PostReceiveService, :geo, feature_category: :team_planning do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary_url) { 'http://primary.example.com' } let_it_be(:secondary_url) { 'http://secondary.example.com' } let_it_be(:primary_node, reload: true) { create(:geo_node, :primary, url: primary_url) } diff --git a/ee/spec/services/geo/blob_download_service_spec.rb b/ee/spec/services/geo/blob_download_service_spec.rb index 827cc68275ebb6..28960fcc0cac23 100644 --- a/ee/spec/services/geo/blob_download_service_spec.rb +++ b/ee/spec/services/geo/blob_download_service_spec.rb @@ -6,6 +6,7 @@ include ::EE::GeoHelpers include ExclusiveLeaseHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/ee/spec/services/geo/event_service_spec.rb b/ee/spec/services/geo/event_service_spec.rb index 1deec62761b2f1..d223cf29e72811 100644 --- a/ee/spec/services/geo/event_service_spec.rb +++ b/ee/spec/services/geo/event_service_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Geo::EventService, feature_category: :geo_replication do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/ee/spec/services/geo/file_registry_removal_service_spec.rb b/ee/spec/services/geo/file_registry_removal_service_spec.rb index 4d2334a561a617..e86c3ca9a5dd0f 100644 --- a/ee/spec/services/geo/file_registry_removal_service_spec.rb +++ b/ee/spec/services/geo/file_registry_removal_service_spec.rb @@ -6,6 +6,7 @@ include ::EE::GeoHelpers include ExclusiveLeaseHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:secondary) { create(:geo_node) } before do diff --git a/ee/spec/services/geo/graphql_request_service_spec.rb b/ee/spec/services/geo/graphql_request_service_spec.rb index 5c2b492a51bbe1..e80b284ed8a2ba 100644 --- a/ee/spec/services/geo/graphql_request_service_spec.rb +++ b/ee/spec/services/geo/graphql_request_service_spec.rb @@ -6,6 +6,7 @@ include ::EE::GeoHelpers include ApiHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } let_it_be(:user) { create(:user) } diff --git a/ee/spec/services/geo/node_update_service_spec.rb b/ee/spec/services/geo/node_update_service_spec.rb index a6579039cfc62d..77089ad8afd1e6 100644 --- a/ee/spec/services/geo/node_update_service_spec.rb +++ b/ee/spec/services/geo/node_update_service_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Geo::NodeUpdateService, feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary, reload: true) { create(:geo_node, :primary) } let!(:geo_node) { create(:geo_node) } diff --git a/ee/spec/services/geo/registry_consistency_service_spec.rb b/ee/spec/services/geo/registry_consistency_service_spec.rb index 581fe7192853dc..37036ca43a307e 100644 --- a/ee/spec/services/geo/registry_consistency_service_spec.rb +++ b/ee/spec/services/geo/registry_consistency_service_spec.rb @@ -8,6 +8,7 @@ feature_category: :geo_replication do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:secondary) { create(:geo_node) } before do diff --git a/ee/spec/services/projects/destroy_service_spec.rb b/ee/spec/services/projects/destroy_service_spec.rb index 787025c1fce8c1..7b8d4adec8319e 100644 --- a/ee/spec/services/projects/destroy_service_spec.rb +++ b/ee/spec/services/projects/destroy_service_spec.rb @@ -6,6 +6,7 @@ include EE::GeoHelpers include BatchDestroyDependentAssociationsHelper + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let!(:user) { create(:user) } let!(:project) { create(:project, :repository, namespace: user.namespace) } let!(:project_id) { project.id } diff --git a/ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb b/ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb index 82c3d8f2d3bfea..10ec43e2070894 100644 --- a/ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb +++ b/ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb @@ -4,6 +4,7 @@ include GraphqlHelpers include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:secondary) { create(:geo_node) } before do diff --git a/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb b/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb index d6d9b85fbb0b9c..b873a037058d6a 100644 --- a/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb +++ b/ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb @@ -12,6 +12,7 @@ RSpec.shared_examples 'a blob replicator' do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb b/ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb index aabfe4a57c14a7..c9177ca5d7d0bf 100644 --- a/ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb +++ b/ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb @@ -12,6 +12,7 @@ RSpec.shared_examples 'a repository replicator' do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/ee/spec/support/shared_examples/workers/geo/framework_registry_sync_worker_shared_examples.rb b/ee/spec/support/shared_examples/workers/geo/framework_registry_sync_worker_shared_examples.rb index 00134270dbef2b..753a545aa36a39 100644 --- a/ee/spec/support/shared_examples/workers/geo/framework_registry_sync_worker_shared_examples.rb +++ b/ee/spec/support/shared_examples/workers/geo/framework_registry_sync_worker_shared_examples.rb @@ -4,6 +4,7 @@ describe '#perform', :use_sql_query_cache_for_tracking_db do include ExclusiveLeaseHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let!(:primary) { create(:geo_node, :primary) } let(:secondary) { create(:geo_node) } diff --git a/ee/spec/tasks/geo_rake_spec.rb b/ee/spec/tasks/geo_rake_spec.rb index 92159ef28353e8..023245eb14719c 100644 --- a/ee/spec/tasks/geo_rake_spec.rb +++ b/ee/spec/tasks/geo_rake_spec.rb @@ -5,6 +5,8 @@ RSpec.describe 'geo rake tasks', :geo, :silence_stdout, feature_category: :geo_replication do include ::EE::GeoHelpers + let!(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo + before do Rake.application.rake_require 'active_record/railties/databases' Rake.application.rake_require 'tasks/gitlab/db' diff --git a/ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb b/ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb index 74785175f457ca..6f445c8e66bd05 100644 --- a/ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb +++ b/ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb @@ -5,6 +5,7 @@ RSpec.describe 'layouts/header/_read_only_banner' do include EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:geo_primary) { create(:geo_node, :primary) } let_it_be(:geo_secondary) { create(:geo_node) } diff --git a/ee/spec/workers/ee/repository_check/batch_worker_spec.rb b/ee/spec/workers/ee/repository_check/batch_worker_spec.rb index f3558b1408a963..5ae608bd82c380 100644 --- a/ee/spec/workers/ee/repository_check/batch_worker_spec.rb +++ b/ee/spec/workers/ee/repository_check/batch_worker_spec.rb @@ -5,6 +5,7 @@ RSpec.describe EE::RepositoryCheck::BatchWorker, feature_category: :source_code_management do include ::EE::GeoHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let(:shard_name) { 'default' } subject(:worker) { RepositoryCheck::BatchWorker.new } diff --git a/ee/spec/workers/geo/prune_event_log_worker_spec.rb b/ee/spec/workers/geo/prune_event_log_worker_spec.rb index 1cbe9ac8fc26ec..cbdea36147ea06 100644 --- a/ee/spec/workers/geo/prune_event_log_worker_spec.rb +++ b/ee/spec/workers/geo/prune_event_log_worker_spec.rb @@ -7,6 +7,7 @@ subject(:worker) { described_class.new } + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary, refind: true) { create(:geo_node) } diff --git a/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb b/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb index 8fc396eca30766..4de492b3435027 100644 --- a/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb +++ b/ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb @@ -6,6 +6,7 @@ include EE::GeoHelpers include ExclusiveLeaseHelpers + let_it_be(:default_organization) { create(:organization, :default) } # rubocop:disable Gitlab/RSpec/AvoidCreateDefaultOrganization -- todo let_it_be(:primary) { create(:geo_node, :primary) } let_it_be(:secondary) { create(:geo_node) } diff --git a/spec/services/applications/create_service_spec.rb b/spec/services/applications/create_service_spec.rb index 82c16cbac6def9..6001b41e710071 100644 --- a/spec/services/applications/create_service_spec.rb +++ b/spec/services/applications/create_service_spec.rb @@ -7,7 +7,8 @@ let(:user) { create(:user) } - subject(:service) { described_class.new(user, test_request, params) } + # TODO: validate the _correct_ way to structure this + subject(:service) { described_class.new(user, test_request, params.merge(organization_id: user.organization.id)) } context 'when scopes are present' do let(:params) { attributes_for(:application, scopes: ['read_user']) } @@ -15,7 +16,7 @@ it { expect { subject.execute }.to change { Authn::OauthApplication.count }.by(1) } it 'leaves ROPC enabled' do - expect(service.execute.ropc_enabled?).to be_truthy + expect(subject.execute.ropc_enabled?).to be_truthy end end -- GitLab