diff options
Diffstat (limited to 'qa/spec/specs/scenario_shared_examples.rb')
-rw-r--r-- | qa/spec/specs/scenario_shared_examples.rb | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/qa/spec/specs/scenario_shared_examples.rb b/qa/spec/specs/scenario_shared_examples.rb new file mode 100644 index 00000000000..7d806d50d21 --- /dev/null +++ b/qa/spec/specs/scenario_shared_examples.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +module QA + RSpec.shared_examples 'a QA scenario class' do + let(:attributes) { class_spy('Runtime::Scenario') } + let(:runner) { class_spy('Specs::Runner') } + let(:release) { class_spy('Runtime::Release') } + let(:feature) { class_spy('Runtime::Feature') } + + let(:args) { { gitlab_address: 'http://gitlab_address' } } + let(:named_options) { %w[--address http://gitlab_address] } + let(:tags) { [] } + let(:options) { %w[path1 path2] } + + before do + stub_const('QA::Specs::Runner', runner) + stub_const('QA::Runtime::Release', release) + stub_const('QA::Runtime::Scenario', attributes) + stub_const('QA::Runtime::Feature', feature) + + allow(attributes).to receive(:gitlab_address).and_return(args[:gitlab_address]) + allow(runner).to receive(:perform).and_yield(runner) + allow(QA::Runtime::Address).to receive(:valid?).and_return(true) + end + + it 'responds to perform' do + expect(subject).to respond_to(:perform) + end + + it 'sets an address of the subject' do + subject.perform(args) + + expect(attributes).to have_received(:define).with(:gitlab_address, 'http://gitlab_address').at_least(:once) + end + + it 'performs before hooks only once' do + subject.perform(args) + + expect(release).to have_received(:perform_before_hooks).once + end + + it 'sets tags on runner' do + subject.perform(args) + + expect(runner).to have_received(:tags=).with(tags) + end + + context 'with RSpec options' do + it 'sets options on runner' do + subject.perform(args, *options) + + expect(runner).to have_received(:options=).with(options) + end + end + + context 'with named command-line options' do + it 'converts options to attributes' do + described_class.launch!(named_options) + + args do |k, v| + expect(attributes).to have_received(:define).with(k, v) + end + end + + it 'raises an error if the option is invalid' do + expect { described_class.launch!(['--foo']) }.to raise_error(OptionParser::InvalidOption) + end + + it 'passes on options after --' do + expect(described_class).to receive(:perform).with(attributes, *%w[--tag quarantine]) + + described_class.launch!(named_options.push(*%w[-- --tag quarantine])) + end + end + end +end |