Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Hughes <me@iamphill.com>2019-05-09 12:27:07 +0300
committerBob Van Landuyt <bob@vanlanduyt.co>2019-05-28 11:22:02 +0300
commit11f85ae8c3b8ec5d864edd079e7c420a49cae72e (patch)
tree8da63219fc0977c7e132f7177bff20f41c997520 /spec/requests
parent2cc6e6ff2628bd71faa71f083646a981ab2bcc11 (diff)
Enables GraphQL batch requests
Enabling GraphQL batch requests allows for multiple queries to be sent in 1 request reducing the amount of requests we send to the server. Responses come come back in the same order as the queries were provided.
Diffstat (limited to 'spec/requests')
-rw-r--r--spec/requests/api/graphql/gitlab_schema_spec.rb85
-rw-r--r--spec/requests/api/graphql/multiplexed_queries_spec.rb39
2 files changed, 102 insertions, 22 deletions
diff --git a/spec/requests/api/graphql/gitlab_schema_spec.rb b/spec/requests/api/graphql/gitlab_schema_spec.rb
index dd518274f82..a724c5c3f1c 100644
--- a/spec/requests/api/graphql/gitlab_schema_spec.rb
+++ b/spec/requests/api/graphql/gitlab_schema_spec.rb
@@ -3,41 +3,82 @@ require 'spec_helper'
describe 'GitlabSchema configurations' do
include GraphqlHelpers
- let(:project) { create(:project, :repository) }
- let(:query) { graphql_query_for('project', { 'fullPath' => project.full_path }, %w(id name description)) }
- let(:current_user) { create(:user) }
+ let(:project) { create(:project) }
- describe '#max_complexity' do
- context 'when complexity is too high' do
- it 'shows an error' do
- allow(GitlabSchema).to receive(:max_query_complexity).and_return 1
+ shared_examples 'imposing query limits' do
+ describe '#max_complexity' do
+ context 'when complexity is too high' do
+ it 'shows an error' do
+ allow(GitlabSchema).to receive(:max_query_complexity).and_return 1
- post_graphql(query, current_user: nil)
+ subject
- expect(graphql_errors.first['message']).to include('which exceeds max complexity of 1')
+ expect(graphql_errors.flatten.first['message']).to include('which exceeds max complexity of 1')
+ end
end
end
- end
- describe '#max_depth' do
- context 'when query depth is too high' do
- it 'shows error' do
- errors = [{ "message" => "Query has depth of 2, which exceeds max depth of 1" }]
- allow(GitlabSchema).to receive(:max_query_depth).and_return 1
+ describe '#max_depth' do
+ context 'when query depth is too high' do
+ it 'shows error' do
+ errors = { "message" => "Query has depth of 2, which exceeds max depth of 1" }
+ allow(GitlabSchema).to receive(:max_query_depth).and_return 1
- post_graphql(query)
+ subject
- expect(graphql_errors).to eq(errors)
+ expect(graphql_errors.flatten).to include(errors)
+ end
end
+
+ context 'when query depth is within range' do
+ it 'has no error' do
+ allow(GitlabSchema).to receive(:max_query_depth).and_return 5
+
+ subject
+
+ expect(Array.wrap(graphql_errors).compact).to be_empty
+ end
+ end
+ end
+ end
+
+ context 'regular queries' do
+ subject do
+ query = graphql_query_for('project', { 'fullPath' => project.full_path }, %w(id name description))
+ post_graphql(query)
end
- context 'when query depth is within range' do
- it 'has no error' do
- allow(GitlabSchema).to receive(:max_query_depth).and_return 5
+ it_behaves_like 'imposing query limits'
+ end
+
+ context 'multiplexed queries' do
+ subject do
+ queries = [
+ { query: graphql_query_for('project', { 'fullPath' => project.full_path }, %w(id name description)) },
+ { query: graphql_query_for('echo', { 'text' => "$test" }, []), variables: { "test" => "Hello world" } }
+ ]
+
+ post_multiplex(queries)
+ end
+
+ it_behaves_like 'imposing query limits' do
+ it "fails all queries when only one of the queries is too complex" do
+ # The `project` query above has a complexity of 5
+ allow(GitlabSchema).to receive(:max_query_complexity).and_return 4
+
+ subject
- post_graphql(query)
+ # Expect a response for each query, even though it will be empty
+ expect(json_response.size).to eq(2)
+ json_response.each do |single_query_response|
+ expect(single_query_response).not_to have_key('data')
+ end
- expect(graphql_errors).to be_nil
+ # Expect errors for each query
+ expect(graphql_errors.size).to eq(2)
+ graphql_errors.each do |single_query_errors|
+ expect(single_query_errors.first['message']).to include('which exceeds max complexity of 4')
+ end
end
end
end
diff --git a/spec/requests/api/graphql/multiplexed_queries_spec.rb b/spec/requests/api/graphql/multiplexed_queries_spec.rb
new file mode 100644
index 00000000000..844fd979285
--- /dev/null
+++ b/spec/requests/api/graphql/multiplexed_queries_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+describe 'Multiplexed queries' do
+ include GraphqlHelpers
+
+ it 'returns responses for multiple queries' do
+ queries = [
+ { query: 'query($text: String) { echo(text: $text) }',
+ variables: { 'text' => 'Hello' } },
+ { query: 'query($text: String) { echo(text: $text) }',
+ variables: { 'text' => 'World' } }
+ ]
+
+ post_multiplex(queries)
+
+ first_response = json_response.first['data']['echo']
+ second_response = json_response.last['data']['echo']
+
+ expect(first_response).to eq('nil says: Hello')
+ expect(second_response).to eq('nil says: World')
+ end
+
+ it 'returns error and data combinations' do
+ queries = [
+ { query: 'query($text: String) { broken query }' },
+ { query: 'query working($text: String) { echo(text: $text) }',
+ variables: { 'text' => 'World' } }
+ ]
+
+ post_multiplex(queries)
+
+ first_response = json_response.first['errors']
+ second_response = json_response.last['data']['echo']
+
+ expect(first_response).not_to be_empty
+ expect(second_response).to eq('nil says: World')
+ end
+end