summaryrefslogtreecommitdiff
path: root/qa/qa/specs/helpers/context_selector.rb
blob: caa5ace430fb05c53bbf98ceff5c1ec0ea6d54b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# frozen_string_literal: true

require 'rspec/core'

module QA
  module Specs
    module Helpers
      module ContextSelector
        extend self

        def except?(*options)
          return false if Runtime::Env.ci_job_name.blank? && options.any? { |o| o.is_a?(Hash) && o[:job].present? }
          return false if Runtime::Env.ci_project_name.blank? && options.any? { |o| o.is_a?(Hash) && o[:pipeline].present? }
          return false if Runtime::Scenario.attributes[:gitlab_address].blank?

          context_matches?(*options)
        end

        def context_matches?(*options)
          return false unless Runtime::Scenario.attributes[:gitlab_address]
          return false if Runtime::Scenario.attributes[:test_metadata_only]

          opts = {}
          opts[:domain] = '.+'
          opts[:tld] = '.com'

          uri = URI(Runtime::Scenario.gitlab_address)

          options.each do |option|
            opts[:domain] = 'gitlab' if option == :production

            next unless option.is_a?(Hash)

            opts.merge!(option)

            if option[:pipeline].present?
              return true if Runtime::Env.ci_project_name.blank?

              return pipeline_matches?(option[:pipeline])

            elsif option[:job].present?
              return true if Runtime::Env.ci_job_name.blank?

              return job_matches?(option[:job])

            elsif option[:subdomain].present?
              opts[:subdomain] = case option[:subdomain]
                                 when Array
                                   "(#{option[:subdomain].join("|")})\\."
                                 when Regexp
                                   option[:subdomain]
                                 else
                                   "(#{option[:subdomain]})\\."
                                 end
            end
          end

          uri.host.match?(/^#{opts[:subdomain]}#{opts[:domain]}#{opts[:tld]}$/)
        end

        alias_method :dot_com?, :context_matches?

        def job_matches?(job_patterns)
          Array(job_patterns).any? do |job|
            pattern = job.is_a?(Regexp) ? job : Regexp.new(job)
            pattern = Regexp.new(pattern.source, pattern.options | Regexp::IGNORECASE)
            pattern =~ Runtime::Env.ci_job_name
          end
        end

        def pipeline_matches?(pipeline_to_run_in)
          Array(pipeline_to_run_in).any? { |pipeline| pipeline.to_s.casecmp?(pipeline_from_project_name(Runtime::Env.ci_project_name)) }
        end

        def pipeline_from_project_name(project_name)
          project_name.to_s.start_with?('gitlab-qa') ? Runtime::Env.default_branch : project_name
        end
      end
    end
  end
end