2019-07-07 11:18:12 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-07-28 23:09:34 +05:30
|
|
|
RSpec.describe Types::BaseField do
|
2019-07-07 11:18:12 +05:30
|
|
|
context 'when considering complexity' do
|
2019-07-31 22:56:46 +05:30
|
|
|
let(:resolver) do
|
|
|
|
Class.new(described_class) do
|
2019-09-04 21:01:54 +05:30
|
|
|
def self.resolver_complexity(args, child_complexity:)
|
2019-07-31 22:56:46 +05:30
|
|
|
2 if args[:foo]
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.complexity_multiplier(args)
|
|
|
|
0.01
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
it 'defaults to 1' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true)
|
|
|
|
|
|
|
|
expect(field.to_graphql.complexity).to eq 1
|
|
|
|
end
|
|
|
|
|
2019-09-30 21:07:59 +05:30
|
|
|
describe '#base_complexity' do
|
|
|
|
context 'with no gitaly calls' do
|
|
|
|
it 'defaults to 1' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true)
|
|
|
|
|
|
|
|
expect(field.base_complexity).to eq 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a gitaly call' do
|
|
|
|
it 'adds 1 to the default value' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, calls_gitaly: true)
|
|
|
|
|
|
|
|
expect(field.base_complexity).to eq 2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-07-07 11:18:12 +05:30
|
|
|
it 'has specified value' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, complexity: 12)
|
|
|
|
|
|
|
|
expect(field.to_graphql.complexity).to eq 12
|
|
|
|
end
|
2019-07-31 22:56:46 +05:30
|
|
|
|
2020-04-08 14:13:33 +05:30
|
|
|
context 'when field has a resolver' do
|
|
|
|
context 'when a valid complexity is already set' do
|
|
|
|
let(:field) { described_class.new(name: 'test', type: GraphQL::STRING_TYPE.connection_type, resolver_class: resolver, complexity: 2, max_page_size: 100, null: true) }
|
|
|
|
|
|
|
|
it 'uses this complexity' do
|
|
|
|
expect(field.to_graphql.complexity).to eq 2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-09-04 21:01:54 +05:30
|
|
|
context 'and is a connection' do
|
|
|
|
let(:field) { described_class.new(name: 'test', type: GraphQL::STRING_TYPE.connection_type, resolver_class: resolver, max_page_size: 100, null: true) }
|
2019-07-31 22:56:46 +05:30
|
|
|
|
2019-09-04 21:01:54 +05:30
|
|
|
it 'sets complexity depending on arguments for resolvers' do
|
|
|
|
expect(field.to_graphql.complexity.call({}, {}, 2)).to eq 4
|
|
|
|
expect(field.to_graphql.complexity.call({}, { first: 50 }, 2)).to eq 3
|
|
|
|
end
|
2019-07-31 22:56:46 +05:30
|
|
|
|
2019-09-04 21:01:54 +05:30
|
|
|
it 'sets complexity depending on number load limits for resolvers' do
|
|
|
|
expect(field.to_graphql.complexity.call({}, { first: 1 }, 2)).to eq 2
|
|
|
|
expect(field.to_graphql.complexity.call({}, { first: 1, foo: true }, 2)).to eq 4
|
|
|
|
end
|
|
|
|
end
|
2019-07-31 22:56:46 +05:30
|
|
|
|
2019-09-04 21:01:54 +05:30
|
|
|
context 'and is not a connection' do
|
|
|
|
it 'sets complexity as normal' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, resolver_class: resolver, max_page_size: 100, null: true)
|
|
|
|
|
|
|
|
expect(field.to_graphql.complexity.call({}, {}, 2)).to eq 2
|
|
|
|
expect(field.to_graphql.complexity.call({}, { first: 50 }, 2)).to eq 2
|
|
|
|
end
|
|
|
|
end
|
2019-07-31 22:56:46 +05:30
|
|
|
end
|
2019-09-30 21:07:59 +05:30
|
|
|
|
|
|
|
context 'calls_gitaly' do
|
|
|
|
context 'for fields with a resolver' do
|
|
|
|
it 'adds 1 if true' do
|
|
|
|
with_gitaly_field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, resolver_class: resolver, null: true, calls_gitaly: true)
|
|
|
|
without_gitaly_field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, resolver_class: resolver, null: true)
|
|
|
|
base_result = without_gitaly_field.to_graphql.complexity.call({}, {}, 2)
|
|
|
|
|
|
|
|
expect(with_gitaly_field.to_graphql.complexity.call({}, {}, 2)).to eq base_result + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'for fields without a resolver' do
|
|
|
|
it 'adds 1 if true' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, calls_gitaly: true)
|
|
|
|
|
|
|
|
expect(field.to_graphql.complexity).to eq 2
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'defaults to false' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true)
|
|
|
|
|
|
|
|
expect(field.base_complexity).to eq Types::BaseField::DEFAULT_COMPLEXITY
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with declared constant complexity value' do
|
|
|
|
it 'has complexity set to that constant' do
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, complexity: 12)
|
|
|
|
|
|
|
|
expect(field.to_graphql.complexity).to eq 12
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not raise an error even with Gitaly calls' do
|
|
|
|
allow(Gitlab::GitalyClient).to receive(:get_request_count).and_return([0, 1])
|
|
|
|
field = described_class.new(name: 'test', type: GraphQL::STRING_TYPE, null: true, complexity: 12)
|
|
|
|
|
|
|
|
expect(field.to_graphql.complexity).to eq 12
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-03-13 15:44:24 +05:30
|
|
|
|
|
|
|
describe '#visible?' do
|
|
|
|
context 'and has a feature_flag' do
|
|
|
|
let(:flag) { :test_feature }
|
|
|
|
let(:field) { described_class.new(name: 'test', type: GraphQL::STRING_TYPE, feature_flag: flag, null: false) }
|
|
|
|
let(:context) { {} }
|
|
|
|
|
2021-01-03 14:25:43 +05:30
|
|
|
before do
|
|
|
|
skip_feature_flags_yaml_validation
|
|
|
|
end
|
|
|
|
|
2020-03-13 15:44:24 +05:30
|
|
|
it 'returns false if the feature is not enabled' do
|
|
|
|
stub_feature_flags(flag => false)
|
|
|
|
|
|
|
|
expect(field.visible?(context)).to eq(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if the feature is enabled' do
|
|
|
|
expect(field.visible?(context)).to eq(true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-04-22 19:07:51 +05:30
|
|
|
end
|
2020-03-13 15:44:24 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
describe '#description' do
|
|
|
|
context 'feature flag given' do
|
2021-02-22 17:27:13 +05:30
|
|
|
let(:field) { described_class.new(name: 'test', type: GraphQL::STRING_TYPE, feature_flag: flag, null: false, description: 'Test description.') }
|
2020-04-22 19:07:51 +05:30
|
|
|
let(:flag) { :test_flag }
|
2020-03-13 15:44:24 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
it 'prepends the description' do
|
2021-02-22 17:27:13 +05:30
|
|
|
expect(field.description). to eq 'Test description. Available only when feature flag `test_flag` is enabled.'
|
2020-04-22 19:07:51 +05:30
|
|
|
end
|
2020-03-13 15:44:24 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
context 'falsey feature_flag values' do
|
|
|
|
using RSpec::Parameterized::TableSyntax
|
2020-03-13 15:44:24 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
where(:flag, :feature_value) do
|
|
|
|
'' | false
|
|
|
|
'' | true
|
|
|
|
nil | false
|
|
|
|
nil | true
|
|
|
|
end
|
2020-03-13 15:44:24 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
with_them do
|
|
|
|
it 'returns the correct description' do
|
2021-02-22 17:27:13 +05:30
|
|
|
expect(field.description).to eq('Test description.')
|
2020-03-13 15:44:24 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2019-07-07 11:18:12 +05:30
|
|
|
end
|
2020-04-22 19:07:51 +05:30
|
|
|
|
2020-11-24 15:15:51 +05:30
|
|
|
include_examples 'Gitlab-style deprecations' do
|
|
|
|
def subject(args = {})
|
2020-04-22 19:07:51 +05:30
|
|
|
base_args = { name: 'test', type: GraphQL::STRING_TYPE, null: true }
|
|
|
|
|
|
|
|
described_class.new(**base_args.merge(args))
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'interacts well with the `feature_flag` property' do
|
2020-11-24 15:15:51 +05:30
|
|
|
field = subject(
|
2020-04-22 19:07:51 +05:30
|
|
|
deprecated: { milestone: '1.10', reason: 'Deprecation reason' },
|
2021-02-22 17:27:13 +05:30
|
|
|
description: 'Field description.',
|
2020-04-22 19:07:51 +05:30
|
|
|
feature_flag: 'foo_flag'
|
|
|
|
)
|
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
expectation = 'Field description. Available only when feature flag `foo_flag` is enabled. Deprecated in 1.10: Deprecation reason.'
|
2020-11-24 15:15:51 +05:30
|
|
|
|
|
|
|
expect(field.description).to eq(expectation)
|
2020-04-22 19:07:51 +05:30
|
|
|
end
|
|
|
|
end
|
2019-07-07 11:18:12 +05:30
|
|
|
end
|