summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb')
-rw-r--r--spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb135
1 files changed, 135 insertions, 0 deletions
diff --git a/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb b/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb
new file mode 100644
index 00000000000..320c6b52308
--- /dev/null
+++ b/spec/lib/gitlab/graphql/pagination/active_record_array_connection_spec.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Graphql::Pagination::ActiveRecordArrayConnection do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:items) { create_list(:package_build_info, 3) }
+
+ let_it_be(:context) do
+ GraphQL::Query::Context.new(
+ query: GraphQL::Query.new(GitlabSchema, document: nil, context: {}, variables: {}),
+ values: {},
+ object: nil
+ )
+ end
+
+ let(:first) { nil }
+ let(:last) { nil }
+ let(:after) { nil }
+ let(:before) { nil }
+ let(:max_page_size) { nil }
+
+ let(:connection) do
+ described_class.new(
+ items,
+ context: context,
+ first: first,
+ last: last,
+ after: after,
+ before: before,
+ max_page_size: max_page_size
+ )
+ end
+
+ it_behaves_like 'a connection with collection methods'
+
+ it_behaves_like 'a redactable connection' do
+ let(:unwanted) { items[1] }
+ end
+
+ describe '#nodes' do
+ subject { connection.nodes }
+
+ it { is_expected.to match_array(items) }
+
+ context 'with first set' do
+ let(:first) { 2 }
+
+ it { is_expected.to match_array([items[0], items[1]]) }
+ end
+
+ context 'with last set' do
+ let(:last) { 2 }
+
+ it { is_expected.to match_array([items[1], items[2]]) }
+ end
+ end
+
+ describe '#next_page?' do
+ subject { connection.next_page? }
+
+ where(:before, :first, :max_page_size, :result) do
+ nil | nil | nil | false
+ 1 | nil | nil | true
+ nil | 1 | nil | true
+ nil | 10 | nil | false
+ nil | 1 | 1 | true
+ nil | 1 | 10 | true
+ nil | 10 | 10 | false
+ end
+
+ with_them do
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '#previous_page?' do
+ subject { connection.previous_page? }
+
+ where(:after, :last, :max_page_size, :result) do
+ nil | nil | nil | false
+ 1 | nil | nil | true
+ nil | 1 | nil | true
+ nil | 10 | nil | false
+ nil | 1 | 1 | true
+ nil | 1 | 10 | true
+ nil | 10 | 10 | false
+ end
+
+ with_them do
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '#cursor_for' do
+ let(:item) { items[0] }
+ let(:expected_result) do
+ GitlabSchema.cursor_encoder.encode(
+ Gitlab::Json.dump(id: item.id.to_s),
+ nonce: true
+ )
+ end
+
+ subject { connection.cursor_for(item) }
+
+ it { is_expected.to eq(expected_result) }
+
+ context 'with a BatchLoader::GraphQL item' do
+ let_it_be(:user) { create(:user) }
+
+ let(:item) { ::Gitlab::Graphql::Loaders::BatchModelLoader.new(::User, user.id).find }
+ let(:expected_result) do
+ GitlabSchema.cursor_encoder.encode(
+ Gitlab::Json.dump(id: user.id.to_s),
+ nonce: true
+ )
+ end
+
+ it { is_expected.to eq(expected_result) }
+ end
+ end
+
+ describe '#dup' do
+ subject { connection.dup }
+
+ it 'properly handles items duplication' do
+ connection2 = subject
+
+ connection2 << create(:package_build_info)
+
+ expect(connection.items).not_to eq(connection2.items)
+ end
+ end
+end