diff options
Diffstat (limited to 'spec/graphql/resolvers')
11 files changed, 128 insertions, 24 deletions
diff --git a/spec/graphql/resolvers/ci/catalog/resources/versions_resolver_spec.rb b/spec/graphql/resolvers/ci/catalog/resources/versions_resolver_spec.rb index 1ce0e91765f..4205259e5b9 100644 --- a/spec/graphql/resolvers/ci/catalog/resources/versions_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/catalog/resources/versions_resolver_spec.rb @@ -7,8 +7,9 @@ RSpec.describe Resolvers::Ci::Catalog::Resources::VersionsResolver, feature_cate include_context 'when there are catalog resources with versions' + let(:name) { nil } let(:sort) { nil } - let(:args) { { sort: sort }.compact } + let(:args) { { name: name, sort: sort }.compact } let(:ctx) { { current_user: current_user } } subject(:result) { resolve(described_class, ctx: ctx, obj: resource1, args: args) } @@ -19,6 +20,23 @@ RSpec.describe Resolvers::Ci::Catalog::Resources::VersionsResolver, feature_cate resource1.project.add_guest(current_user) end + context 'when name argument is provided' do + let(:name) { 'v1.0' } + + it 'returns the version that matches the name' do + expect(result.items.size).to eq(1) + expect(result.items.first.name).to eq('v1.0') + end + + context 'when no version matches the name' do + let(:name) { 'does_not_exist' } + + it 'returns empty response' do + expect(result).to be_empty + end + end + end + context 'when sort argument is not provided' do it 'returns versions ordered by released_at descending' do expect(result.items).to eq([v1_1, v1_0]) diff --git a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb index d1eec0baeea..d1726c8da6c 100644 --- a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb @@ -87,7 +87,7 @@ RSpec.describe Resolvers::Ci::GroupRunnersResolver, feature_category: :fleet_vis status_status: 'active', type_type: :group_type, tag_name: ['active_runner'], - preload: false, + preload: {}, search: 'abc', sort: 'contacted_asc', membership: :descendants, diff --git a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb index 85b55521174..59ba7d4200c 100644 --- a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb @@ -74,7 +74,7 @@ RSpec.describe Resolvers::Ci::ProjectRunnersResolver, feature_category: :fleet_v status_status: 'active', type_type: :group_type, tag_name: ['active_runner'], - preload: false, + preload: {}, search: 'abc', sort: 'contacted_asc', project: project diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb index 85a90924384..a0239a6ff34 100644 --- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb @@ -98,7 +98,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :fleet_visibili upgrade_status: 'recommended', type_type: :instance_type, tag_name: ['active_runner'], - preload: false, + preload: {}, search: 'abc', sort: 'contacted_asc', creator_id: '1', @@ -125,7 +125,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :fleet_visibili let(:expected_params) do { active: false, - preload: false + preload: {} } end @@ -145,7 +145,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :fleet_visibili let(:expected_params) do { active: false, - preload: false + preload: {} } end @@ -163,7 +163,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :fleet_visibili end let(:expected_params) do - { preload: false } + { preload: {} } end it 'calls RunnersFinder with expected arguments' do @@ -181,7 +181,7 @@ RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :fleet_visibili let(:expected_params) do { - preload: false, + preload: {}, version_prefix: 'a.b' } end diff --git a/spec/graphql/resolvers/concerns/resolves_groups_spec.rb b/spec/graphql/resolvers/concerns/resolves_groups_spec.rb index 79f3708da22..72e86d54dea 100644 --- a/spec/graphql/resolvers/concerns/resolves_groups_spec.rb +++ b/spec/graphql/resolvers/concerns/resolves_groups_spec.rb @@ -22,26 +22,27 @@ RSpec.describe ResolvesGroups do end end - let_it_be(:lookahead_fields) do + let_it_be(:preloaded_fields) do <<~FIELDS containerRepositoriesCount customEmoji { nodes { id } } fullPath + groupMembersCount path dependencyProxyBlobCount dependencyProxyBlobs { nodes { fileName } } dependencyProxyImageCount dependencyProxyImageTtlPolicy { enabled } dependencyProxySetting { enabled } + descendantGroupsCount + projectsCount FIELDS end - it 'avoids N+1 queries on the fields marked with lookahead' do + it 'avoids N+1 queries on the preloaded fields' do group_ids = groups.map(&:id) allow_next(resolver).to receive(:resolve_groups).and_return(Group.id_in(group_ids)) - # Prevent authorization queries from affecting the test. - allow(Ability).to receive(:allowed?).and_return(true) single_group_query = ActiveRecord::QueryRecorder.new do data = query_groups(limit: 1) @@ -57,7 +58,7 @@ RSpec.describe ResolvesGroups do end def query_groups(limit:) - query_string = "{ groups(first: #{limit}) { nodes { id #{lookahead_fields} } } }" + query_string = "{ groups(first: #{limit}) { nodes { id #{preloaded_fields} } } }" data = execute_query(query_type, graphql: query_string) diff --git a/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb b/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb index 5f12e8649b7..4d0f1676c7f 100644 --- a/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb +++ b/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb @@ -83,15 +83,16 @@ RSpec.describe Resolvers::ContainerRepositoryTagsResolver, feature_category: :co context 'with parameters' do using RSpec::Parameterized::TableSyntax - where(:before, :after, :sort, :name, :first, :last, :sort_value) do - nil | nil | 'NAME_DESC' | '' | 10 | nil | '-name' - 'bb' | nil | 'NAME_ASC' | 'a' | nil | 5 | 'name' - nil | 'aa' | 'NAME_DESC' | 'a' | 10 | nil | '-name' + where(:before, :after, :sort, :name, :first, :last, :sort_value, :referrers) do + nil | nil | 'NAME_DESC' | '' | 10 | nil | '-name' | nil + 'bb' | nil | 'NAME_ASC' | 'a' | nil | 5 | 'name' | false + nil | 'aa' | 'NAME_DESC' | 'a' | 10 | nil | '-name' | true end with_them do let(:args) do - { before: before, after: after, sort: sort, name: name, first: first, last: last }.compact + { before: before, after: after, sort: sort, name: name, + first: first, last: last, referrers: referrers }.compact end it 'calls ContainerRepository#tags_page with correct parameters' do @@ -100,7 +101,8 @@ RSpec.describe Resolvers::ContainerRepositoryTagsResolver, feature_category: :co last: after, sort: sort_value, name: name, - page_size: [first, last].map(&:to_i).max + page_size: [first, last].map(&:to_i).max, + referrers: referrers ) resolver(args) diff --git a/spec/graphql/resolvers/design_management/versions_resolver_spec.rb b/spec/graphql/resolvers/design_management/versions_resolver_spec.rb index eb39e5bafc5..744e7f35891 100644 --- a/spec/graphql/resolvers/design_management/versions_resolver_spec.rb +++ b/spec/graphql/resolvers/design_management/versions_resolver_spec.rb @@ -43,15 +43,15 @@ RSpec.describe Resolvers::DesignManagement::VersionsResolver do context 'loading associations' do it 'prevents N+1 queries when loading author' do - control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do resolve_versions(object).items.map(&:author) - end.count + end create_list(:design_version, 3, issue: issue) expect do resolve_versions(object).items.map(&:author) - end.not_to exceed_all_query_limit(control_count) + end.not_to exceed_all_query_limit(control) end end end diff --git a/spec/graphql/resolvers/group_labels_resolver_spec.rb b/spec/graphql/resolvers/group_labels_resolver_spec.rb index 08e17cedfcc..2e583a1703d 100644 --- a/spec/graphql/resolvers/group_labels_resolver_spec.rb +++ b/spec/graphql/resolvers/group_labels_resolver_spec.rb @@ -78,7 +78,7 @@ RSpec.describe Resolvers::GroupLabelsResolver do Gitlab::SafeRequestStore.ensure_request_store do resolve_labels(group, params).to_a end - end.not_to exceed_query_limit(control.count) + end.not_to exceed_query_limit(control) end end diff --git a/spec/graphql/resolvers/labels_resolver_spec.rb b/spec/graphql/resolvers/labels_resolver_spec.rb index 16cf2e73736..fd55c3131b4 100644 --- a/spec/graphql/resolvers/labels_resolver_spec.rb +++ b/spec/graphql/resolvers/labels_resolver_spec.rb @@ -78,7 +78,7 @@ RSpec.describe Resolvers::LabelsResolver do Gitlab::SafeRequestStore.ensure_request_store do resolve_labels(project, params).to_a end - end.not_to exceed_query_limit(control.count) + end.not_to exceed_query_limit(control) end end diff --git a/spec/graphql/resolvers/ml/find_models_resolver_spec.rb b/spec/graphql/resolvers/ml/find_models_resolver_spec.rb new file mode 100644 index 00000000000..ce85dd62515 --- /dev/null +++ b/spec/graphql/resolvers/ml/find_models_resolver_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Resolvers::Ml::FindModelsResolver, feature_category: :mlops do + include GraphqlHelpers + + describe '#resolve' do + let_it_be(:project) { create(:project) } + let_it_be(:models) { create_list(:ml_models, 2, project: project) } + let_it_be(:model_in_another_project) { create(:ml_models) } + let_it_be(:user) { project.owner } + + let(:args) { { name: 'model', orderBy: 'CREATED_AT', sort: 'desc', invalid: 'blah' } } + let(:read_model_registry) { true } + + before do + allow(Ability).to receive(:allowed?).and_call_original + allow(Ability).to receive(:allowed?) + .with(user, :read_model_registry, project) + .and_return(read_model_registry) + end + + subject(:resolve_models) do + force(resolve(described_class, obj: project, ctx: { current_user: user }, args: args))&.to_a + end + + context 'when user is allowed and model exists' do + it { is_expected.to eq(models.reverse) } + + it 'only passes name, sort_by and order to finder' do + expect(::Projects::Ml::ModelFinder).to receive(:new) + .with(project, { name: 'model', order_by: 'created_at', +sort: 'desc' }) + .and_call_original + + resolve_models + end + end + + context 'when user does not have permission' do + let(:read_model_registry) { false } + + it { is_expected.to be_nil } + end + end +end diff --git a/spec/graphql/resolvers/users_resolver_spec.rb b/spec/graphql/resolvers/users_resolver_spec.rb index 2ae1b53c40f..ecb1bbb5618 100644 --- a/spec/graphql/resolvers/users_resolver_spec.rb +++ b/spec/graphql/resolvers/users_resolver_spec.rb @@ -62,6 +62,42 @@ RSpec.describe Resolvers::UsersResolver do end end + context 'when a set of group_id is passed' do + let_it_be(:group) { create(:group, :private) } + let_it_be(:subgroup) { create(:group, :private, parent: group) } + let_it_be(:group_member) { create(:user) } + + let_it_be(:indirect_group_member) do + create(:user).tap { |u| subgroup.add_developer(u) } + end + + let_it_be(:direct_group_members) do + [current_user, user1, group_member].each { |u| group.add_developer(u) } + end + + it 'returns direct and indirect members of the group' do + expect( + resolve_users(args: { group_id: group.to_global_id }) + ).to contain_exactly(indirect_group_member, *direct_group_members) + end + + it 'raise an no resource not available error if the group do not exist group' do + expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do + resolve_users(args: { group_id: "gid://gitlab/Group/#{non_existing_record_id}" }) + end + end + + context 'when user cannot read group' do + let(:current_user) { create(:user) } + + it 'raise an no resource not available error the user cannot read the group' do + expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ResourceNotAvailable) do + resolve_users(args: { group_id: group.to_global_id }) + end + end + end + end + context 'with anonymous access' do let_it_be(:current_user) { nil } |