Commit 0731365b authored by Grzegorz Bizon's avatar Grzegorz Bizon

Add GitLab QA CE strategy and simplify inflector

parent cbba9184
......@@ -78,6 +78,4 @@ module QA
end
end
if QA::Runtime::Release.has_autoloads?
require QA::Runtime::Release.autoloads_file
end
QA::Runtime::Release.extend_autoloads!
module QA
module CE
module Strategy
extend self
def extend_autoloads!
# noop
end
def perform_before_hooks
# noop
end
end
end
end
......@@ -8,34 +8,20 @@ module QA
# CE to EE.
#
class Release
def initialize(variant = nil)
@version = variant || version
begin
require "qa/#{@version.downcase}/strategy"
rescue LoadError
# noop
end
def initialize
require "qa/#{version.downcase}/strategy"
end
def version
File.directory?("#{__dir__}/../ee") ? :EE : :CE
end
def has_strategy?
QA.const_defined?("QA::#{@version}::Strategy")
@version ||= File.directory?("#{__dir__}/../ee") ? :EE : :CE
end
def strategy
QA.const_get("QA::#{@version}::Strategy")
QA.const_get("QA::#{version}::Strategy")
end
def self.method_missing(name, *args)
@release ||= self.new
if @release.has_strategy?
@release.strategy.public_send(name, *args)
end
self.new.strategy.public_send(name, *args)
end
end
end
......
describe QA::Runtime::Release do
context 'when release version has extension strategy' do
subject { described_class.new('VER') }
let(:strategy) { spy('VER::Strategy') }
let(:strategy) { spy('strategy') }
before do
stub_const('QA::VER::Strategy', strategy)
stub_const('QA::CE::Strategy', strategy)
stub_const('QA::EE::Strategy', strategy)
end
describe '#has_strategy?' do
it 'return true' do
expect(subject.has_strategy?).to be true
describe '#version' do
it 'return either CE or EE version' do
expect(subject.version).to eq(:CE).or eq(:EE)
end
end
describe '#strategy' do
it 'return the strategy constant' do
expect(subject.strategy).to eq QA::VER::Strategy
expect(subject.strategy).to eq strategy
end
end
describe 'delegated class methods' do
before do
allow_any_instance_of(described_class)
.to receive(:has_strategy?).and_return(true)
allow_any_instance_of(described_class)
.to receive(:strategy).and_return(strategy)
end
it 'delegates all calls to strategy class' do
described_class.some_method(1, 2)
......@@ -38,37 +30,20 @@ describe QA::Runtime::Release do
end
context 'when release version does not have extension strategy' do
subject { described_class.new('NOVER') }
describe '#has_strategy?' do
it 'returns false' do
expect(subject.has_strategy?).to be false
end
before do
allow_any_instance_of(described_class)
.to receive(:version).and_return('something')
end
describe '#strategy' do
it 'raises error' do
expect { subject.strategy }.to raise_error(NameError)
expect { subject.strategy }.to raise_error(LoadError)
end
end
describe 'does not delegate class methods' do
before do
allow_any_instance_of(described_class)
.to receive(:has_strategy?).and_return(false)
end
it 'behaves like a null object and does nothing' do
expect { described_class.some_method(2, 3) }.not_to raise_error
end
it 'returns nil' do
expect(described_class.something).to be_nil
end
it 'does not delegate to strategy object' do
expect_any_instance_of(described_class)
.not_to receive(:strategy)
describe 'delegated class methods' do
it 'raises error' do
expect { described_class.some_method(2, 3) }.to raise_error(LoadError)
end
end
end
......
Markdown is supported
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