runner_spec.rb 4.44 KB
Newer Older
1 2
# frozen_string_literal: true

3 4
require 'active_support/core_ext/hash'

5
describe QA::Specs::Runner do
6 7 8 9 10 11 12 13
  shared_examples 'excludes orchestrated' do
    it 'excludes the orchestrated tag and includes default args' do
      expect_rspec_runner_arguments(['--tag', '~orchestrated', *described_class::DEFAULT_TEST_PATH_ARGS])

      subject.perform
    end
  end

14 15 16 17 18
  context '#perform' do
    before do
      allow(QA::Runtime::Browser).to receive(:configure!)
    end

19
    it_behaves_like 'excludes orchestrated'
20 21

    context 'when tty is set' do
22
      subject { described_class.new.tap { |runner| runner.tty = true } }
23 24

      it 'sets the `--tty` flag' do
25
        expect_rspec_runner_arguments(['--tty', '--tag', '~orchestrated', *described_class::DEFAULT_TEST_PATH_ARGS])
26 27 28 29 30 31

        subject.perform
      end
    end

    context 'when tags are set' do
32
      subject { described_class.new.tap { |runner| runner.tags = %i[orchestrated github] } }
33 34

      it 'focuses on the given tags' do
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
        expect_rspec_runner_arguments(['--tag', 'orchestrated', '--tag', 'github', *described_class::DEFAULT_TEST_PATH_ARGS])

        subject.perform
      end
    end

    context 'when "--tag smoke" is set as options' do
      subject { described_class.new.tap { |runner| runner.options = %w[--tag smoke] } }

      it 'focuses on the given tag without excluded the orchestrated tag' do
        expect_rspec_runner_arguments(['--tag', 'smoke', *described_class::DEFAULT_TEST_PATH_ARGS])

        subject.perform
      end
    end

    context 'when "qa/specs/features/foo" is set as options' do
      subject { described_class.new.tap { |runner| runner.options = %w[qa/specs/features/foo] } }

      it 'passes the given tests path and excludes the orchestrated tag' do
        expect_rspec_runner_arguments(['--tag', '~orchestrated', 'qa/specs/features/foo'])
56 57 58 59

        subject.perform
      end
    end
60

61 62
    context 'when "--tag smoke" and "qa/specs/features/foo" are set as options' do
      subject { described_class.new.tap { |runner| runner.options = %w[--tag smoke qa/specs/features/foo] } }
63

64 65
      it 'focuses on the given tag and includes the path without excluding the orchestrated tag' do
        expect_rspec_runner_arguments(['--tag', 'smoke', 'qa/specs/features/foo'])
66 67 68 69 70

        subject.perform
      end
    end

71 72 73 74 75
    context 'when SIGNUP_DISABLED is true' do
      before do
        allow(QA::Runtime::Env).to receive(:signup_disabled?).and_return(true)
      end

76
      it 'includes default args and excludes the skip_signup_disabled tag' do
77 78 79 80 81 82
        expect_rspec_runner_arguments(['--tag', '~orchestrated', '--tag', '~skip_signup_disabled', *described_class::DEFAULT_TEST_PATH_ARGS])

        subject.perform
      end
    end

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
    context 'testable features' do
      shared_examples 'one supported feature' do |feature|
        before do
          QA::Runtime::Env.supported_features.each do |tag, _|
            allow(QA::Runtime::Env).to receive(:can_test?).with(tag).and_return(false)
          end

          allow(QA::Runtime::Env).to receive(:can_test?).with(feature).and_return(true) unless feature.nil?
        end

        it 'includes default args and excludes all unsupported tags' do
          expect_rspec_runner_arguments(['--tag', '~orchestrated', *excluded_feature_tags_except(feature), *described_class::DEFAULT_TEST_PATH_ARGS])

          subject.perform
        end
98 99
      end

100 101 102
      context 'when only git protocol 2 is supported' do
        it_behaves_like 'one supported feature', :git_protocol_v2
      end
103

104 105 106
      context 'when only admin features are supported' do
        it_behaves_like 'one supported feature', :admin
      end
107

108 109
      context 'when no features are supported' do
        it_behaves_like 'one supported feature', nil
110
      end
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

      context 'when all features are supported' do
        before do
          QA::Runtime::Env.supported_features.each do |tag, _|
            allow(QA::Runtime::Env).to receive(:can_test?).with(tag).and_return(true)
          end
        end

        it_behaves_like 'excludes orchestrated'
      end

      context 'when features are not specified' do
        it_behaves_like 'excludes orchestrated'
      end
    end

    def excluded_feature_tags_except(tag)
128
      QA::Runtime::Env.supported_features.except(tag).flat_map do |tag, _|
129
        ['--tag', "~requires_#{tag}"]
130
      end
131 132
    end

133 134 135 136 137
    def expect_rspec_runner_arguments(arguments)
      expect(RSpec::Core::Runner).to receive(:run)
        .with(arguments, $stderr, $stdout)
        .and_return(0)
    end
138 139
  end
end