debian-mirror-gitlab/spec/lib/gitlab/graphql/calls_gitaly/field_extension_spec.rb
2021-10-27 15:23:28 +05:30

88 lines
2.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::Graphql::CallsGitaly::FieldExtension, :request_store do
include GraphqlHelpers
let(:field_args) { {} }
let(:owner) { fresh_object_type }
let(:field) do
::Types::BaseField.new(name: 'value', type: GraphQL::Types::String, null: true, owner: owner, **field_args)
end
def resolve_value
resolve_field(field, { value: 'foo' }, object_type: owner)
end
context 'when the field calls gitaly' do
before do
owner.define_method :value do
Gitlab::SafeRequestStore['gitaly_call_actual'] = 1
'fresh-from-the-gitaly-mines!'
end
end
context 'when the field has a constant complexity' do
let(:field_args) { { complexity: 100 } }
it 'allows the call' do
expect { resolve_value }.not_to raise_error
end
end
context 'when the field declares that it calls gitaly' do
let(:field_args) { { calls_gitaly: true } }
it 'allows the call' do
expect { resolve_value }.not_to raise_error
end
end
context 'when the field does not have these arguments' do
let(:field_args) { {} }
it 'notices, and raises, mentioning the field' do
expect { resolve_value }.to raise_error(include('Object.value'))
end
end
end
context 'when it does not call gitaly' do
let(:field_args) { {} }
it 'does not raise' do
value = resolve_value
expect(value).to eq 'foo'
end
end
context 'when some field calls gitaly while we were waiting' do
let(:extension) { described_class.new(field: field, options: {}) }
it 'is acceptable if all are accounted for' do
object = :anything
arguments = :any_args
::Gitlab::SafeRequestStore['gitaly_call_actual'] = 3
::Gitlab::SafeRequestStore['graphql_gitaly_accounted_for'] = 0
expect do |b|
extension.resolve(object: object, arguments: arguments, &b)
end.to yield_with_args(object, arguments, [3, 0])
::Gitlab::SafeRequestStore['gitaly_call_actual'] = 13
::Gitlab::SafeRequestStore['graphql_gitaly_accounted_for'] = 10
expect { extension.after_resolve(value: 'foo', memo: [3, 0]) }.not_to raise_error
end
it 'is unacceptable if some of the calls are unaccounted for' do
::Gitlab::SafeRequestStore['gitaly_call_actual'] = 10
::Gitlab::SafeRequestStore['graphql_gitaly_accounted_for'] = 9
expect { extension.after_resolve(value: 'foo', memo: [0, 0]) }.to raise_error(include('Object.value'))
end
end
end