diff options
author | Phil Hughes <me@iamphill.com> | 2019-05-09 12:27:07 +0300 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2019-05-28 11:22:02 +0300 |
commit | 11f85ae8c3b8ec5d864edd079e7c420a49cae72e (patch) | |
tree | 8da63219fc0977c7e132f7177bff20f41c997520 /spec/requests | |
parent | 2cc6e6ff2628bd71faa71f083646a981ab2bcc11 (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.rb | 85 | ||||
-rw-r--r-- | spec/requests/api/graphql/multiplexed_queries_spec.rb | 39 |
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 |