summaryrefslogtreecommitdiff
path: root/spec/support_specs
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-05-20 14:34:42 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-05-20 14:34:42 +0000
commit9f46488805e86b1bc341ea1620b866016c2ce5ed (patch)
treef9748c7e287041e37d6da49e0a29c9511dc34768 /spec/support_specs
parentdfc92d081ea0332d69c8aca2f0e745cb48ae5e6d (diff)
downloadgitlab-ce-9f46488805e86b1bc341ea1620b866016c2ce5ed.tar.gz
Add latest changes from gitlab-org/gitlab@13-0-stable-ee
Diffstat (limited to 'spec/support_specs')
-rw-r--r--spec/support_specs/helpers/active_record/query_recorder_spec.rb8
-rw-r--r--spec/support_specs/helpers/stub_feature_flags_spec.rb130
2 files changed, 136 insertions, 2 deletions
diff --git a/spec/support_specs/helpers/active_record/query_recorder_spec.rb b/spec/support_specs/helpers/active_record/query_recorder_spec.rb
index 0827ce37b07..d15fbb5d4c3 100644
--- a/spec/support_specs/helpers/active_record/query_recorder_spec.rb
+++ b/spec/support_specs/helpers/active_record/query_recorder_spec.rb
@@ -3,8 +3,12 @@
require 'spec_helper'
describe ActiveRecord::QueryRecorder do
- class TestQueries < ActiveRecord::Base
- self.table_name = 'schema_migrations'
+ before do
+ stub_const('TestQueries', Class.new(ActiveRecord::Base))
+
+ TestQueries.class_eval do
+ self.table_name = 'schema_migrations'
+ end
end
describe 'detecting the right number of calls and their origin' do
diff --git a/spec/support_specs/helpers/stub_feature_flags_spec.rb b/spec/support_specs/helpers/stub_feature_flags_spec.rb
new file mode 100644
index 00000000000..b6e230075f2
--- /dev/null
+++ b/spec/support_specs/helpers/stub_feature_flags_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe StubFeatureFlags do
+ before do
+ # reset stub introduced by `stub_feature_flags`
+ allow(Feature).to receive(:enabled?).and_call_original
+ end
+
+ context 'if not stubbed' do
+ it 'features are disabled by default' do
+ expect(Feature.enabled?(:test_feature)).to eq(false)
+ end
+ end
+
+ describe '#stub_feature_flags' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:feature_name) { :test_feature }
+
+ context 'when checking global state' do
+ where(:feature_actors, :expected_result) do
+ false | false
+ true | true
+ :A | false
+ %i[A] | false
+ %i[A B] | false
+ end
+
+ with_them do
+ before do
+ stub_feature_flags(feature_name => feature_actors)
+ end
+
+ it { expect(Feature.enabled?(feature_name)).to eq(expected_result) }
+ it { expect(Feature.disabled?(feature_name)).not_to eq(expected_result) }
+
+ context 'default_enabled does not impact feature state' do
+ it { expect(Feature.enabled?(feature_name, default_enabled: true)).to eq(expected_result) }
+ it { expect(Feature.disabled?(feature_name, default_enabled: true)).not_to eq(expected_result) }
+ end
+ end
+ end
+
+ context 'when checking scoped state' do
+ where(:feature_actors, :tested_actor, :expected_result) do
+ false | nil | false
+ true | nil | true
+ false | :A | false
+ true | :A | true
+ :A | nil | false
+ :A | :A | true
+ :A | :B | false
+ %i[A] | nil | false
+ %i[A] | :A | true
+ %i[A] | :B | false
+ %i[A B] | nil | false
+ %i[A B] | :A | true
+ %i[A B] | :B | true
+ end
+
+ with_them do
+ before do
+ stub_feature_flags(feature_name => feature_actors)
+ end
+
+ it { expect(Feature.enabled?(feature_name, tested_actor)).to eq(expected_result) }
+ it { expect(Feature.disabled?(feature_name, tested_actor)).not_to eq(expected_result) }
+
+ context 'default_enabled does not impact feature state' do
+ it { expect(Feature.enabled?(feature_name, tested_actor, default_enabled: true)).to eq(expected_result) }
+ it { expect(Feature.disabled?(feature_name, tested_actor, default_enabled: true)).not_to eq(expected_result) }
+ end
+ end
+ end
+
+ context 'type handling' do
+ context 'raises error' do
+ where(:feature_actors) do
+ ['string', 1, 1.0, OpenStruct.new]
+ end
+
+ with_them do
+ subject { stub_feature_flags(feature_name => feature_actors) }
+
+ it { expect { subject }.to raise_error(ArgumentError, /accepts only/) }
+ end
+ end
+
+ context 'does not raise error' do
+ where(:feature_actors) do
+ [true, false, nil, :symbol, double, User.new]
+ end
+
+ with_them do
+ subject { stub_feature_flags(feature_name => feature_actors) }
+
+ it { expect { subject }.not_to raise_error }
+ end
+ end
+ end
+
+ it 'subsquent run changes state' do
+ # enable FF only on A
+ stub_feature_flags(test_feature: %i[A])
+ expect(Feature.enabled?(:test_feature)).to eq(false)
+ expect(Feature.enabled?(:test_feature, :A)).to eq(true)
+ expect(Feature.enabled?(:test_feature, :B)).to eq(false)
+
+ # enable FF only on B
+ stub_feature_flags(test_feature: %i[B])
+ expect(Feature.enabled?(:test_feature)).to eq(false)
+ expect(Feature.enabled?(:test_feature, :A)).to eq(false)
+ expect(Feature.enabled?(:test_feature, :B)).to eq(true)
+
+ # enable FF on all
+ stub_feature_flags(test_feature: true)
+ expect(Feature.enabled?(:test_feature)).to eq(true)
+ expect(Feature.enabled?(:test_feature, :A)).to eq(true)
+ expect(Feature.enabled?(:test_feature, :B)).to eq(true)
+
+ # disable FF on all
+ stub_feature_flags(test_feature: false)
+ expect(Feature.enabled?(:test_feature)).to eq(false)
+ expect(Feature.enabled?(:test_feature, :A)).to eq(false)
+ expect(Feature.enabled?(:test_feature, :B)).to eq(false)
+ end
+ end
+end