diff options
Diffstat (limited to 'spec/graphql/types/issue_type_spec.rb')
-rw-r--r-- | spec/graphql/types/issue_type_spec.rb | 102 |
1 files changed, 100 insertions, 2 deletions
diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb index a8f7edcfe8e..4a86b07ab1c 100644 --- a/spec/graphql/types/issue_type_spec.rb +++ b/spec/graphql/types/issue_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe GitlabSchema.types['Issue'] do +RSpec.describe GitlabSchema.types['Issue'] do specify { expect(described_class).to expose_permissions_using(Types::PermissionTypes::Issue) } specify { expect(described_class.graphql_name).to eq('Issue') } @@ -12,7 +12,7 @@ describe GitlabSchema.types['Issue'] do specify { expect(described_class.interfaces).to include(Types::Notes::NoteableType) } it 'has specific fields' do - fields = %i[iid title description state reference author assignees participants labels milestone due_date + fields = %i[id iid title description state reference author assignees participants labels milestone due_date confidential discussion_locked upvotes downvotes user_notes_count web_path web_url relative_position subscribed time_estimate total_time_spent closed_at created_at updated_at task_completion_status designs design_collection] @@ -22,6 +22,104 @@ describe GitlabSchema.types['Issue'] do end end + describe 'pagination and count' do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :public) } + let_it_be(:now) { Time.now.change(usec: 0) } + let_it_be(:issues) { create_list(:issue, 10, project: project, created_at: now) } + + let(:count_path) { %w(data project issues count) } + let(:page_size) { 3 } + let(:query) do + <<~GRAPHQL + query project($fullPath: ID!, $first: Int, $after: String) { + project(fullPath: $fullPath) { + issues(first: $first, after: $after) { + count + edges { + node { + iid + } + } + pageInfo { + endCursor + hasNextPage + } + } + } + } + GRAPHQL + end + + subject do + GitlabSchema.execute( + query, + context: { current_user: user }, + variables: { + fullPath: project.full_path, + first: page_size + } + ).to_h + end + + context 'when user does not have the permission' do + it 'returns no data' do + allow(Ability).to receive(:allowed?).with(user, :read_project, project).and_return(false) + + expect(subject.dig(:data, :project)).to eq(nil) + end + end + + context 'count' do + let(:end_cursor) { %w(data project issues pageInfo endCursor) } + let(:issues_edges) { %w(data project issues edges) } + + it 'returns total count' do + expect(subject.dig(*count_path)).to eq(issues.count) + end + + it 'total count does not change between pages' do + old_count = subject.dig(*count_path) + new_cursor = subject.dig(*end_cursor) + + new_page = GitlabSchema.execute( + query, + context: { current_user: user }, + variables: { + fullPath: project.full_path, + first: page_size, + after: new_cursor + } + ).to_h + + new_count = new_page.dig(*count_path) + expect(old_count).to eq(new_count) + end + + context 'pagination' do + let(:page_size) { 9 } + + it 'returns new ids during pagination' do + old_edges = subject.dig(*issues_edges) + new_cursor = subject.dig(*end_cursor) + + new_edges = GitlabSchema.execute( + query, + context: { current_user: user }, + variables: { + fullPath: project.full_path, + first: page_size, + after: new_cursor + } + ).to_h.dig(*issues_edges) + + expect(old_edges.count).to eq(9) + expect(new_edges.count).to eq(1) + end + end + end + end + describe "issue notes" do let(:user) { create(:user) } let(:project) { create(:project, :public) } |