From 2f20e1ad64cc2e6a46ac57d1e356cb8ba9a83002 Mon Sep 17 00:00:00 2001 From: Imjaydip Date: Tue, 30 Sep 2025 19:42:18 +0530 Subject: [PATCH 1/2] Add support for verification_level in services and GraphQL --- app/models/namespace.rb | 4 + doc/api/graphql/reference/_index.md | 4 + ee/app/finders/ai/catalog/items_finder.rb | 7 ++ .../resolvers/ai/catalog/items_resolver.rb | 4 + .../types/ai/catalog/item_interface.rb | 3 + .../ai/catalog/agents/create_service.rb | 3 +- ee/app/services/ai/catalog/base_service.rb | 5 ++ .../ai/catalog/flows/create_service.rb | 3 +- .../namespaces/verify_namespace_service.rb | 5 ++ .../finders/ai/catalog/items_finder_spec.rb | 28 +++++++ .../types/ai/catalog/item_interface_spec.rb | 1 + .../api/graphql/ai/catalog/item_spec.rb | 2 + .../ai/catalog/agents/create_service_spec.rb | 19 ++++- .../ai/catalog/flows/create_service_spec.rb | 19 ++++- .../verify_namespace_service_spec.rb | 53 +++++++++++++ spec/models/namespace_spec.rb | 74 +++++++++++++++++++ 16 files changed, 228 insertions(+), 6 deletions(-) diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 80dd9b1f0b7f90..35823caa169597 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -598,6 +598,10 @@ def all_catalog_resources Ci::Catalog::Resource.where(project: all_projects) end + def all_ai_catalog_items + ::Ai::Catalog::Item.where(project: all_projects) + end + def all_projects_except_soft_deleted all_projects.not_aimed_for_deletion end diff --git a/doc/api/graphql/reference/_index.md b/doc/api/graphql/reference/_index.md index f3c6b2dacc4942..680a38562bd300 100644 --- a/doc/api/graphql/reference/_index.md +++ b/doc/api/graphql/reference/_index.md @@ -336,6 +336,7 @@ four standard [pagination arguments](#pagination-arguments): | ---- | ---- | ----------- | | `itemType` | [`AiCatalogItemType`](#aicatalogitemtype) | Type of items to retrieve. | | `search` | [`String`](#string) | Search items by name and description. | +| `verificationLevel` | [`CiCatalogResourceVerificationLevel`](#cicatalogresourceverificationlevel) | Filter items by verification level. | ### `Query.aiChatAvailableModels` @@ -23505,6 +23506,7 @@ An AI catalog agent. | `public` | [`Boolean!`](#boolean) | Whether the item is publicly visible in the catalog. | | `updatedAt` | [`Time!`](#time) | Timestamp of when the item was updated. | | `userPermissions` | [`AiCatalogItemPermissions!`](#aicatalogitempermissions) | Permissions for the current user on the resource. | +| `verificationLevel` | [`CiCatalogResourceVerificationLevel`](#cicatalogresourceverificationlevel) | Verification level of the item. | | `versions` | [`AiCatalogItemVersionConnection`](#aicatalogitemversionconnection) | Versions of the item. (see [Connections](#connections)) | #### Fields with arguments @@ -23570,6 +23572,7 @@ An AI catalog flow. | `public` | [`Boolean!`](#boolean) | Whether the item is publicly visible in the catalog. | | `updatedAt` | [`Time!`](#time) | Timestamp of when the item was updated. | | `userPermissions` | [`AiCatalogItemPermissions!`](#aicatalogitempermissions) | Permissions for the current user on the resource. | +| `verificationLevel` | [`CiCatalogResourceVerificationLevel`](#cicatalogresourceverificationlevel) | Verification level of the item. | | `versions` | [`AiCatalogItemVersionConnection`](#aicatalogitemversionconnection) | Versions of the item. (see [Connections](#connections)) | #### Fields with arguments @@ -52708,6 +52711,7 @@ Implementations: | `public` | [`Boolean!`](#boolean) | Whether the item is publicly visible in the catalog. | | `updatedAt` | [`Time!`](#time) | Timestamp of when the item was updated. | | `userPermissions` | [`AiCatalogItemPermissions!`](#aicatalogitempermissions) | Permissions for the current user on the resource. | +| `verificationLevel` | [`CiCatalogResourceVerificationLevel`](#cicatalogresourceverificationlevel) | Verification level of the item. | | `versions` | [`AiCatalogItemVersionConnection`](#aicatalogitemversionconnection) | Versions of the item. (see [Connections](#connections)) | ##### Fields with arguments diff --git a/ee/app/finders/ai/catalog/items_finder.rb b/ee/app/finders/ai/catalog/items_finder.rb index 1f9de99777d53c..54b671330117d0 100644 --- a/ee/app/finders/ai/catalog/items_finder.rb +++ b/ee/app/finders/ai/catalog/items_finder.rb @@ -15,6 +15,7 @@ def execute items = init_collection items = by_organization(items) items = by_item_type(items) + items = by_verification_level(items) by_search(items) end @@ -38,6 +39,12 @@ def by_item_type(items) items.with_item_type(params[:item_type]) end + def by_verification_level(items) + return items unless params[:verification_level] + + items.for_verification_level(params[:verification_level]) + end + def by_search(items) return items if params[:search].blank? diff --git a/ee/app/graphql/resolvers/ai/catalog/items_resolver.rb b/ee/app/graphql/resolvers/ai/catalog/items_resolver.rb index 4ca9e8ac16de1e..fab67cb6a2071a 100644 --- a/ee/app/graphql/resolvers/ai/catalog/items_resolver.rb +++ b/ee/app/graphql/resolvers/ai/catalog/items_resolver.rb @@ -18,6 +18,10 @@ class ItemsResolver < BaseResolver required: false, description: 'Search items by name and description.' + argument :verification_level, ::Types::Namespaces::VerificationLevelEnum, + required: false, + description: 'Filter items by verification level.' + def resolve_with_lookahead(**args) items = ::Ai::Catalog::ItemsFinder.new( current_user, diff --git a/ee/app/graphql/types/ai/catalog/item_interface.rb b/ee/app/graphql/types/ai/catalog/item_interface.rb index 7ffe24acbf1cfe..dfcd9367c45bd7 100644 --- a/ee/app/graphql/types/ai/catalog/item_interface.rb +++ b/ee/app/graphql/types/ai/catalog/item_interface.rb @@ -41,6 +41,9 @@ module ItemInterface argument :released, ::GraphQL::Types::Boolean, required: false, description: 'Return the latest released version.' end + field :verification_level, ::Types::Namespaces::VerificationLevelEnum, + null: true, + description: 'Verification level of the item.' orphan_types ::Types::Ai::Catalog::AgentType orphan_types ::Types::Ai::Catalog::FlowType diff --git a/ee/app/services/ai/catalog/agents/create_service.rb b/ee/app/services/ai/catalog/agents/create_service.rb index 083f96c7ba7c19..713761135828aa 100644 --- a/ee/app/services/ai/catalog/agents/create_service.rb +++ b/ee/app/services/ai/catalog/agents/create_service.rb @@ -11,7 +11,8 @@ def execute item_params.merge!( item_type: Ai::Catalog::Item::AGENT_TYPE, organization_id: project.organization_id, - project_id: project.id + project_id: project.id, + verification_level: verification_level_for_project ) version_params = { diff --git a/ee/app/services/ai/catalog/base_service.rb b/ee/app/services/ai/catalog/base_service.rb index f85656f597b316..2b83de9d4f7787 100644 --- a/ee/app/services/ai/catalog/base_service.rb +++ b/ee/app/services/ai/catalog/base_service.rb @@ -33,6 +33,11 @@ def track_ai_item_events(event_type, additional_properties = {}) additional_properties: additional_properties ) end + + def verification_level_for_project + verified_namespace = project.root_namespace.catalog_verified_namespace + verified_namespace&.verification_level || :unverified + end end end end diff --git a/ee/app/services/ai/catalog/flows/create_service.rb b/ee/app/services/ai/catalog/flows/create_service.rb index 626e96d62118b9..9bbff7471885d7 100644 --- a/ee/app/services/ai/catalog/flows/create_service.rb +++ b/ee/app/services/ai/catalog/flows/create_service.rb @@ -16,7 +16,8 @@ def execute item_params.merge!( item_type: Ai::Catalog::Item::FLOW_TYPE, organization_id: project.organization_id, - project_id: project.id + project_id: project.id, + verification_level: verification_level_for_project ) version_params = { schema_version: ::Ai::Catalog::ItemVersion::FLOW_SCHEMA_VERSION, diff --git a/ee/app/services/namespaces/verify_namespace_service.rb b/ee/app/services/namespaces/verify_namespace_service.rb index 5ec80ecba4c17a..9030b3ebc8f5a3 100644 --- a/ee/app/services/namespaces/verify_namespace_service.rb +++ b/ee/app/services/namespaces/verify_namespace_service.rb @@ -16,6 +16,7 @@ def execute create_or_update_verified_namespace update_catalog_resources + update_ai_catalog_items ServiceResponse.success end @@ -55,5 +56,9 @@ def create_or_update_verified_namespace def update_catalog_resources namespace.all_catalog_resources.update_all(verification_level: verification_level) end + + def update_ai_catalog_items + namespace.all_ai_catalog_items.update_all(verification_level: verification_level) + end end end diff --git a/ee/spec/finders/ai/catalog/items_finder_spec.rb b/ee/spec/finders/ai/catalog/items_finder_spec.rb index 83cb3618b00a22..2060f550111e27 100644 --- a/ee/spec/finders/ai/catalog/items_finder_spec.rb +++ b/ee/spec/finders/ai/catalog/items_finder_spec.rb @@ -98,6 +98,34 @@ end end + context 'when filtering by verification_level' do + ::Namespaces::VerifiedNamespace::VERIFICATION_LEVELS.each_key do |level| + context "with #{level} verification level" do + let(:params) { { verification_level: level } } + + let!(:matching_items) { create_list(:ai_catalog_flow, 2, public: true, verification_level: level) } + + let!(:non_matching_item) do + other_levels = ::Namespaces::VerifiedNamespace::VERIFICATION_LEVELS.keys - [level] + + create(:ai_catalog_flow, public: true, verification_level: other_levels.first) + end + + it "returns only items with #{level} verification level" do + expect(results.map(&:verification_level).uniq).to eq([level.to_s]) + end + end + end + + context 'with invalid verification level' do + let(:params) { { verification_level: 'invalid_level' } } + + it 'returns empty result' do + is_expected.to be_empty + end + end + end + describe 'ordering' do let_it_be(:gitlab_item_1) { create(:ai_catalog_agent, public: true) } let_it_be(:regular_item_1) { create(:ai_catalog_agent, public: true) } diff --git a/ee/spec/graphql/types/ai/catalog/item_interface_spec.rb b/ee/spec/graphql/types/ai/catalog/item_interface_spec.rb index 1cb8e2d61c7ea1..09f7381f80c171 100644 --- a/ee/spec/graphql/types/ai/catalog/item_interface_spec.rb +++ b/ee/spec/graphql/types/ai/catalog/item_interface_spec.rb @@ -15,6 +15,7 @@ item_type name latest_version + verification_level project public updated_at diff --git a/ee/spec/requests/api/graphql/ai/catalog/item_spec.rb b/ee/spec/requests/api/graphql/ai/catalog/item_spec.rb index 95f0ecf0bad36e..e3ee030e605b65 100644 --- a/ee/spec/requests/api/graphql/ai/catalog/item_spec.rb +++ b/ee/spec/requests/api/graphql/ai/catalog/item_spec.rb @@ -51,6 +51,7 @@ itemType name public + verificationLevel project { id } latestVersion { ...VersionFragment @@ -82,6 +83,7 @@ 'description' => catalog_item.description, 'itemType' => 'AGENT', 'public' => catalog_item.public, + 'verificationLevel' => catalog_item.verification_level.upcase, 'latestVersion' => a_graphql_entity_for(latest_version), 'versions' => hash_including( 'count' => 1, diff --git a/ee/spec/services/ai/catalog/agents/create_service_spec.rb b/ee/spec/services/ai/catalog/agents/create_service_spec.rb index 8dfda441ac2fd6..3cd1fe8c154f43 100644 --- a/ee/spec/services/ai/catalog/agents/create_service_spec.rb +++ b/ee/spec/services/ai/catalog/agents/create_service_spec.rb @@ -6,7 +6,7 @@ include Ai::Catalog::TestHelpers let_it_be(:maintainer) { create(:user) } - let_it_be(:project) { create(:project, maintainers: maintainer) } + let_it_be_with_reload(:project) { create(:project, maintainers: maintainer) } let(:user) { maintainer } let(:params) do @@ -59,7 +59,8 @@ name: params[:name], description: params[:description], public: true, - item_type: Ai::Catalog::Item::AGENT_TYPE.to_s + item_type: Ai::Catalog::Item::AGENT_TYPE.to_s, + verification_level: 'unverified' ) expect(item.latest_version).to have_attributes( schema_version: 1, @@ -129,4 +130,18 @@ end end end + + context 'when project root namespace has a verified namespace' do + let_it_be(:verification_level) { :gitlab_maintained } + + it "assigns verification level to the created agent" do + create(:catalog_verified_namespace, namespace: project.root_namespace, verification_level: verification_level) + project.reload + + response + + item = Ai::Catalog::Item.last + expect(item.verification_level).to eq(verification_level.to_s) + end + end end diff --git a/ee/spec/services/ai/catalog/flows/create_service_spec.rb b/ee/spec/services/ai/catalog/flows/create_service_spec.rb index 33cbfc446b91fe..049ec1455c9bce 100644 --- a/ee/spec/services/ai/catalog/flows/create_service_spec.rb +++ b/ee/spec/services/ai/catalog/flows/create_service_spec.rb @@ -6,7 +6,7 @@ include Ai::Catalog::TestHelpers let_it_be(:maintainer) { create(:user) } - let_it_be(:project) { create(:project, maintainers: maintainer) } + let_it_be_with_reload(:project) { create(:project, maintainers: maintainer) } let_it_be(:agent) { create(:ai_catalog_agent, project: project) } let_it_be(:v1_0) { create(:ai_catalog_agent_version, item: agent, version: '1.0.0') } let_it_be(:v1_1) { create(:ai_catalog_agent_version, item: agent, version: '1.1.0') } @@ -62,7 +62,8 @@ name: params[:name], description: params[:description], item_type: Ai::Catalog::Item::FLOW_TYPE.to_s, - public: true + public: true, + verification_level: 'unverified' ) expect(item.latest_version).to have_attributes( schema_version: ::Ai::Catalog::ItemVersion::FLOW_SCHEMA_VERSION, @@ -212,4 +213,18 @@ end end end + + context 'when project root namespace has a verified namespace' do + let_it_be(:verification_level) { :gitlab_maintained } + + it "assigns verification level to the created flow" do + create(:catalog_verified_namespace, namespace: project.root_namespace, verification_level: verification_level) + project.reload + + response + + item = Ai::Catalog::Item.last + expect(item.verification_level).to eq(verification_level.to_s) + end + end end diff --git a/ee/spec/services/namespaces/verify_namespace_service_spec.rb b/ee/spec/services/namespaces/verify_namespace_service_spec.rb index 9219c8d1144f83..b73830f7260593 100644 --- a/ee/spec/services/namespaces/verify_namespace_service_spec.rb +++ b/ee/spec/services/namespaces/verify_namespace_service_spec.rb @@ -32,6 +32,14 @@ create(:ci_catalog_resource, :published, project: another_group_published_project) end + let_it_be(:group_project_ai_catalog_item) { create(:ai_catalog_item, project: group_project) } + let_it_be(:subgroup_project_ai_catalog_item) { create(:ai_catalog_item, project: subgroup_project) } + let_it_be(:subgroup_public_project_ai_catalog_item) { create(:ai_catalog_item, project: subgroup_public_project) } + let_it_be(:another_group_ai_catalog_item) { create(:ai_catalog_item, project: another_group_private_project) } + let_it_be(:another_group_public_ai_catalog_item) do + create(:ai_catalog_item, public: true, project: another_group_published_project) + end + describe '#execute' do context 'when namespace is not a root namespace' do it 'returns error' do @@ -124,6 +132,19 @@ expect(another_group_published_project_resource.reload.verification_level).to eq('unverified') end + + it 'updates the verification level for all AI catalog items under the given namespace' do + response = described_class.new(group, verification_level).execute + + expect(response).to be_success + + expect(group_project_ai_catalog_item.reload.verification_level).to eq(verification_level) + expect(subgroup_project_ai_catalog_item.reload.verification_level).to eq(verification_level) + expect(subgroup_public_project_ai_catalog_item.reload.verification_level).to eq(verification_level) + + expect(another_group_ai_catalog_item.reload.verification_level).to eq('unverified') + expect(another_group_public_ai_catalog_item.reload.verification_level).to eq('unverified') + end end end end @@ -159,6 +180,22 @@ expect(another_group_published_project_resource.reload.verification_level).to eq('unverified') end + + it 'cascades the verification level to the AI catalog items' do + ::Namespaces::VerifiedNamespace.find_or_create_by!(namespace: group, + verification_level: verification_level) + + response = described_class.new(group, verification_level).execute + + expect(response).to be_success + + expect(group_project_ai_catalog_item.reload.verification_level).to eq(verification_level) + expect(subgroup_project_ai_catalog_item.reload.verification_level).to eq(verification_level) + expect(subgroup_public_project_ai_catalog_item.reload.verification_level).to eq(verification_level) + + expect(another_group_ai_catalog_item.reload.verification_level).to eq('unverified') + expect(another_group_public_ai_catalog_item.reload.verification_level).to eq('unverified') + end end context 'when on gitlab.com' do @@ -201,6 +238,22 @@ expect(another_group_published_project_resource.reload.verification_level).to eq('unverified') end + + it 'cascades the verification level to the AI catalog items' do + ::Namespaces::VerifiedNamespace.find_or_create_by!(namespace: group, + verification_level: new_verification_level) + + response = described_class.new(group, new_verification_level).execute + + expect(response).to be_success + + expect(group_project_ai_catalog_item.reload.verification_level).to eq(new_verification_level) + expect(subgroup_project_ai_catalog_item.reload.verification_level).to eq(new_verification_level) + expect(subgroup_public_project_ai_catalog_item.reload.verification_level).to eq(new_verification_level) + + expect(another_group_ai_catalog_item.reload.verification_level).to eq('unverified') + expect(another_group_public_ai_catalog_item.reload.verification_level).to eq('unverified') + end end end end diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index 0499f14c61d502..2c2404cc198758 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -2273,6 +2273,80 @@ end end + describe '#all_ai_catalog_items' do + shared_examples 'retrieves AI catalog items' do + it 'returns AI catalog items from the namespace projects' do + expect(namespace.all_ai_catalog_items).to match_array(expected_items) + end + end + + shared_examples 'returns empty collection when no projects or items' do + it 'returns empty collection' do + expect(namespace.all_ai_catalog_items).to be_empty + end + end + + context 'when namespace is a group' do + let_it_be(:namespace) { create(:group) } + let_it_be(:project1) { create(:project, namespace: namespace) } + let_it_be(:project2) { create(:project, namespace: namespace) } + let_it_be(:ai_catalog_item1) { create(:ai_catalog_item, project: project1, organization: project1.organization) } + let_it_be(:ai_catalog_item2) { create(:ai_catalog_item, project: project2, organization: project2.organization) } + let(:expected_items) { [ai_catalog_item1, ai_catalog_item2] } + + include_examples 'retrieves AI catalog items' + + context 'when namespace has no projects' do + let_it_be(:namespace) { create(:group) } + + include_examples 'returns empty collection when no projects or items' + end + + context 'when projects have no AI catalog items' do + let_it_be(:namespace) { create(:group) } + let_it_be(:project_without_items) { create(:project, namespace: namespace) } + + include_examples 'returns empty collection when no projects or items' + end + + context 'with nested groups' do + let_it_be(:child_group) { create(:group, parent: namespace) } + let_it_be(:child_project) { create(:project, namespace: child_group) } + let_it_be(:child_ai_catalog_item) { create(:ai_catalog_item, project: child_project, organization: child_project.organization) } + let(:expected_items) { [ai_catalog_item1, ai_catalog_item2, child_ai_catalog_item] } + + include_examples 'retrieves AI catalog items' + end + end + + context 'when namespace is a user namespace' do + let_it_be(:user) { create(:user) } + let_it_be(:namespace) { user.namespace } + let_it_be(:project1) { create(:project, namespace: namespace) } + let_it_be(:project2) { create(:project, namespace: namespace) } + let_it_be(:ai_catalog_item1) { create(:ai_catalog_item, project: project1, organization: project1.organization) } + let_it_be(:ai_catalog_item2) { create(:ai_catalog_item, project: project2, organization: project2.organization) } + let(:expected_items) { [ai_catalog_item1, ai_catalog_item2] } + + include_examples 'retrieves AI catalog items' + + context 'when namespace has no projects' do + let_it_be(:user) { create(:user) } + let_it_be(:namespace) { user.namespace } + + include_examples 'returns empty collection when no projects or items' + end + + context 'when projects have no AI catalog items' do + let_it_be(:user) { create(:user) } + let_it_be(:namespace) { user.namespace } + let_it_be(:project_without_items) { create(:project, namespace: namespace) } + + include_examples 'returns empty collection when no projects or items' + end + end + end + describe '#share_with_group_lock with subgroups' do context 'when creating a subgroup' do let(:subgroup) { create(:group, parent: root_group) } -- GitLab From 55ec81ce662fe25a649f9a118d95052156a5a08e Mon Sep 17 00:00:00 2001 From: Imjaydip Date: Wed, 1 Oct 2025 18:12:13 +0530 Subject: [PATCH 2/2] Add reviewer suggestion --- ee/spec/finders/ai/catalog/items_finder_spec.rb | 2 +- .../ai/catalog/agents/create_service_spec.rb | 1 - .../ai/catalog/flows/create_service_spec.rb | 1 - .../namespaces/verify_namespace_service_spec.rb | 14 ++------------ 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/ee/spec/finders/ai/catalog/items_finder_spec.rb b/ee/spec/finders/ai/catalog/items_finder_spec.rb index 2060f550111e27..8943cedc9bd20a 100644 --- a/ee/spec/finders/ai/catalog/items_finder_spec.rb +++ b/ee/spec/finders/ai/catalog/items_finder_spec.rb @@ -103,7 +103,7 @@ context "with #{level} verification level" do let(:params) { { verification_level: level } } - let!(:matching_items) { create_list(:ai_catalog_flow, 2, public: true, verification_level: level) } + let!(:matching_item) { create(:ai_catalog_flow, public: true, verification_level: level) } let!(:non_matching_item) do other_levels = ::Namespaces::VerifiedNamespace::VERIFICATION_LEVELS.keys - [level] diff --git a/ee/spec/services/ai/catalog/agents/create_service_spec.rb b/ee/spec/services/ai/catalog/agents/create_service_spec.rb index 3cd1fe8c154f43..1e755f901b3150 100644 --- a/ee/spec/services/ai/catalog/agents/create_service_spec.rb +++ b/ee/spec/services/ai/catalog/agents/create_service_spec.rb @@ -136,7 +136,6 @@ it "assigns verification level to the created agent" do create(:catalog_verified_namespace, namespace: project.root_namespace, verification_level: verification_level) - project.reload response diff --git a/ee/spec/services/ai/catalog/flows/create_service_spec.rb b/ee/spec/services/ai/catalog/flows/create_service_spec.rb index 049ec1455c9bce..3a82aaa8f0f2c7 100644 --- a/ee/spec/services/ai/catalog/flows/create_service_spec.rb +++ b/ee/spec/services/ai/catalog/flows/create_service_spec.rb @@ -219,7 +219,6 @@ it "assigns verification level to the created flow" do create(:catalog_verified_namespace, namespace: project.root_namespace, verification_level: verification_level) - project.reload response diff --git a/ee/spec/services/namespaces/verify_namespace_service_spec.rb b/ee/spec/services/namespaces/verify_namespace_service_spec.rb index b73830f7260593..fc3529383db142 100644 --- a/ee/spec/services/namespaces/verify_namespace_service_spec.rb +++ b/ee/spec/services/namespaces/verify_namespace_service_spec.rb @@ -34,11 +34,7 @@ let_it_be(:group_project_ai_catalog_item) { create(:ai_catalog_item, project: group_project) } let_it_be(:subgroup_project_ai_catalog_item) { create(:ai_catalog_item, project: subgroup_project) } - let_it_be(:subgroup_public_project_ai_catalog_item) { create(:ai_catalog_item, project: subgroup_public_project) } let_it_be(:another_group_ai_catalog_item) { create(:ai_catalog_item, project: another_group_private_project) } - let_it_be(:another_group_public_ai_catalog_item) do - create(:ai_catalog_item, public: true, project: another_group_published_project) - end describe '#execute' do context 'when namespace is not a root namespace' do @@ -140,10 +136,8 @@ expect(group_project_ai_catalog_item.reload.verification_level).to eq(verification_level) expect(subgroup_project_ai_catalog_item.reload.verification_level).to eq(verification_level) - expect(subgroup_public_project_ai_catalog_item.reload.verification_level).to eq(verification_level) expect(another_group_ai_catalog_item.reload.verification_level).to eq('unverified') - expect(another_group_public_ai_catalog_item.reload.verification_level).to eq('unverified') end end end @@ -183,7 +177,7 @@ it 'cascades the verification level to the AI catalog items' do ::Namespaces::VerifiedNamespace.find_or_create_by!(namespace: group, - verification_level: verification_level) + verification_level: 'verified_creator_self_managed') response = described_class.new(group, verification_level).execute @@ -191,10 +185,8 @@ expect(group_project_ai_catalog_item.reload.verification_level).to eq(verification_level) expect(subgroup_project_ai_catalog_item.reload.verification_level).to eq(verification_level) - expect(subgroup_public_project_ai_catalog_item.reload.verification_level).to eq(verification_level) expect(another_group_ai_catalog_item.reload.verification_level).to eq('unverified') - expect(another_group_public_ai_catalog_item.reload.verification_level).to eq('unverified') end end @@ -241,7 +233,7 @@ it 'cascades the verification level to the AI catalog items' do ::Namespaces::VerifiedNamespace.find_or_create_by!(namespace: group, - verification_level: new_verification_level) + verification_level: 'gitlab_maintained') response = described_class.new(group, new_verification_level).execute @@ -249,10 +241,8 @@ expect(group_project_ai_catalog_item.reload.verification_level).to eq(new_verification_level) expect(subgroup_project_ai_catalog_item.reload.verification_level).to eq(new_verification_level) - expect(subgroup_public_project_ai_catalog_item.reload.verification_level).to eq(new_verification_level) expect(another_group_ai_catalog_item.reload.verification_level).to eq('unverified') - expect(another_group_public_ai_catalog_item.reload.verification_level).to eq('unverified') end end end -- GitLab