summaryrefslogtreecommitdiff
path: root/spec/graphql/types/issue_type_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/graphql/types/issue_type_spec.rb')
-rw-r--r--spec/graphql/types/issue_type_spec.rb102
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) }