From 613b08208b438b39370a3c0ca2018259f7ebc7de Mon Sep 17 00:00:00 2001 From: RongRongTeng Date: Fri, 17 Jun 2022 11:17:56 +0800 Subject: [PATCH] Fix RelationConnections when relation already has limit --- lib/graphql/pagination/relation_connection.rb | 2 ++ .../active_record_relation_connection_spec.rb | 33 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/graphql/pagination/relation_connection.rb b/lib/graphql/pagination/relation_connection.rb index 2354d4e84f..0e6b091474 100644 --- a/lib/graphql/pagination/relation_connection.rb +++ b/lib/graphql/pagination/relation_connection.rb @@ -117,6 +117,8 @@ def calculate_sliced_nodes_parameters return else next_offset = relation_offset(items) || 0 + relation_limit = relation_limit(items) + if after_offset next_offset += after_offset end diff --git a/spec/graphql/pagination/active_record_relation_connection_spec.rb b/spec/graphql/pagination/active_record_relation_connection_spec.rb index 93790112bd..65bf7d2c8f 100644 --- a/spec/graphql/pagination/active_record_relation_connection_spec.rb +++ b/spec/graphql/pagination/active_record_relation_connection_spec.rb @@ -27,14 +27,16 @@ def total_count total_count_connection_class: RelationConnectionWithTotalCount, get_items: -> { if Food.respond_to?(:scoped) - Food.scoped # Rails 3-friendly version of .all + Food.scoped.limit(limit) # Rails 3-friendly version of .all else - Food.all + Food.all.limit(limit) end } ) } + let(:limit) { nil } + include ConnectionAssertions it "maintains an application-provided offset" do @@ -62,6 +64,33 @@ def total_count assert_equal ["Cucumber", "Dill"], results["data"]["offsetItems"]["nodes"].map { |n| n["name"] } end + describe 'with application-provided limit, which is smaller than the max_page_size' do + let(:limit) { 1 } + + it "maintains an application-provided limit" do + results = schema.execute("{ + limitedItems { + nodes { name } + } + }") + assert_equal ["Avocado"], results["data"]["limitedItems"]["nodes"].map { |n| n["name"] } + end + end + + describe 'with application-provided limit, which is larger than the max_page_size' do + let(:limit) { 3 } + + it "applies a field-level max-page-size configuration" do + results = schema.execute("{ + limitedItems { + nodes { name } + } + }") + assert_equal ["Avocado", "Beet"], results["data"]["limitedItems"]["nodes"].map { |n| n["name"] } + end + end + + it "doesn't run pageInfo queries when not necessary" do results = nil log = with_active_record_log do