Skip to content
Snippets Groups Projects
Commit 4469ef94 authored by Desiree Chevalier's avatar Desiree Chevalier
Browse files

Require e2e specs that toggle ff to have requires_admin tag

parent 716d2ec9
No related merge requests found
......@@ -9,6 +9,7 @@ class Feature
AuthorizationError = Class.new(RuntimeError)
UnknownScopeError = Class.new(RuntimeError)
UnknownStateError = Class.new(RuntimeError)
MissingAdminTagError = Class.new(RuntimeError)
class << self
# Documentation: https://docs.gitlab.com/ee/api/features.html
......@@ -16,6 +17,10 @@ class << self
include Support::API
def remove(key)
unless requires_admin_tag_present?
raise MissingAdminTagError, ":requires_admin tag is needed to toggle feature flags."
end
request = Runtime::API::Request.new(api_client, "/features/#{key}")
response = delete(request.url)
unless response.code == QA::Support::API::HTTP_STATUS_NO_CONTENT
......@@ -49,6 +54,10 @@ def set(flags, **scopes)
end
def enabled?(key, **scopes)
unless requires_admin_tag_present?
raise MissingAdminTagError, ":requires_admin tag is needed to toggle feature flags."
end
feature = JSON.parse(get_features).find { |flag| flag['name'] == key.to_s }
feature && (feature['state'] == 'on' || feature['state'] == 'conditional' && scopes.present? && enabled_scope?(feature['gates'], **scopes))
end
......@@ -88,6 +97,10 @@ def get_features
# enable: `true` to enable the flag, `false` to disable it
# scopes: Any scope (user, project, group) to restrict the change to
def set_and_verify(key, enable:, **scopes)
unless requires_admin_tag_present?
raise MissingAdminTagError, ":requires_admin tag is needed to toggle feature flags."
end
msg = "#{enable ? 'En' : 'Dis'}abling feature: #{key}"
msg += " for scope \"#{scopes_to_s(**scopes)}\"" if scopes.present?
QA::Runtime::Logger.info(msg)
......@@ -139,6 +152,10 @@ def scopes_to_s(**scopes)
s
end
def requires_admin_tag_present?
RSpec.current_example.metadata[:requires_admin]
end
end
end
end
......
......@@ -7,6 +7,7 @@
before do
allow(described_class).to receive(:api_client).and_return(api_client)
allow(described_class).to receive(:requires_admin_tag_present?).and_return(true)
end
where(:feature_flag) do
......@@ -112,6 +113,14 @@
let(:actor) { "foo" }
end
end
it 'raises an error when the :requires_admin tag is missing' do
allow(described_class).to receive(:requires_admin_tag_present?).and_return(false)
expect(described_class).not_to receive(:set_feature)
expect { described_class.enable(feature_flag) }.to raise_error(QA::Runtime::Feature::MissingAdminTagError, ':requires_admin tag is needed to toggle feature flags.')
end
end
describe '.disable' do
......@@ -160,6 +169,14 @@
let(:actor) { "foo" }
end
end
it 'raises an error when the :requires_admin tag is missing' do
allow(described_class).to receive(:requires_admin_tag_present?).and_return(false)
expect(described_class).not_to receive(:set_feature)
expect { described_class.disable(feature_flag) }.to raise_error(QA::Runtime::Feature::MissingAdminTagError, ':requires_admin tag is needed to toggle feature flags.')
end
end
describe '.enabled?' do
......@@ -224,6 +241,14 @@
let(:gates) { %q([{"key": "groups", "value": ["foo"]}]) }
end
end
it 'raises an error when the :requires_admin tag is missing' do
allow(described_class).to receive(:requires_admin_tag_present?).and_return(false)
expect(described_class).not_to receive(:get_features)
expect { described_class.enabled?(feature_flag) }.to raise_error(QA::Runtime::Feature::MissingAdminTagError, ':requires_admin tag is needed to toggle feature flags.')
end
end
end
......@@ -259,5 +284,13 @@
described_class.set({ flag1: 'enabled', flag2: 'disabled' }, **scope)
end
it 'raises an error when the :requires_admin tag is missing' do
allow(described_class).to receive(:requires_admin_tag_present?).and_return(false)
expect(described_class).not_to receive(:set_feature)
expect { described_class.set({ flag1: 'enabled', flag2: 'disabled' }, **scope) }.to raise_error(QA::Runtime::Feature::MissingAdminTagError, ':requires_admin tag is needed to toggle feature flags.')
end
end
end
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment