gitlab-org--gitlab-foss/spec/requests/api/graphql/namespace/projects_spec.rb

117 lines
3.2 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'getting projects' do
include GraphqlHelpers
let(:group) { create(:group) }
let!(:project) { create(:project, namespace: subject) }
let(:nested_group) { create(:group, parent: group) }
let!(:nested_project) { create(:project, group: nested_group) }
let!(:public_project) { create(:project, :public, namespace: subject) }
let(:user) { create(:user) }
let(:include_subgroups) { true }
subject { group }
let(:query) do
graphql_query_for(
'namespace',
{ 'fullPath' => subject.full_path },
<<~QUERY
projects(includeSubgroups: #{include_subgroups}) {
edges {
node {
#{all_graphql_fields_for('Project', max_depth: 1)}
}
}
}
QUERY
)
end
before do
group.add_owner(user)
end
shared_examples 'a graphql namespace' do
it_behaves_like 'a working graphql query' do
before do
post_graphql(query, current_user: user)
end
end
it "includes the packages size if the user can read the statistics" do
post_graphql(query, current_user: user)
count = if include_subgroups
subject.all_projects.count
else
subject.projects.count
end
expect(graphql_data['namespace']['projects']['edges'].size).to eq(count)
end
context 'with no user' do
it 'finds only public projects' do
post_graphql(query, current_user: nil)
expect(graphql_data['namespace']).to be_nil
end
end
end
it_behaves_like 'a graphql namespace'
context 'when the namespace is a user' do
subject { user.namespace }
let(:include_subgroups) { false }
it_behaves_like 'a graphql namespace'
end
context 'when not including subgroups' do
let(:include_subgroups) { false }
it_behaves_like 'a graphql namespace'
end
describe 'sorting and pagination' do
let_it_be(:ns) { create(:group) }
let_it_be(:current_user) { create(:user) }
let_it_be(:project_1) { create(:project, name: 'Project', path: 'project', namespace: ns) }
let_it_be(:project_2) { create(:project, name: 'Test Project', path: 'test-project', namespace: ns) }
let_it_be(:project_3) { create(:project, name: 'Test', path: 'test', namespace: ns) }
let_it_be(:project_4) { create(:project, name: 'Test Project Other', path: 'other-test-project', namespace: ns) }
let(:data_path) { [:namespace, :projects] }
let(:ns_args) { { full_path: ns.full_path } }
let(:search) { 'test' }
before do
ns.add_owner(current_user)
end
def pagination_query(params)
arguments = params.merge(include_subgroups: include_subgroups, search: search)
graphql_query_for(:namespace, ns_args, query_graphql_field(:projects, arguments, <<~GQL))
#{page_info}
nodes { name }
GQL
end
context 'when sorting by similarity' do
it_behaves_like 'sorted paginated query' do
let(:node_path) { %w[name] }
let(:sort_param) { :SIMILARITY }
let(:first_param) { 2 }
let(:all_records) { [project_3.name, project_2.name, project_4.name] }
end
end
end
end