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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
# frozen_string_literal: true
module Quality
class TestLevel
UnknownTestLevelError = Class.new(StandardError)
TEST_LEVEL_FOLDERS = {
migration: %w[
migrations
],
background_migration: %w[
lib/gitlab/background_migration
lib/ee/gitlab/background_migration
],
frontend_fixture: %w[
frontend/fixtures
],
unit: %w[
bin
channels
components
config
contracts
db
dependencies
elastic
elastic_integration
experiments
factories
finders
frontend
graphql
haml_lint
helpers
initializers
keeps
lib
metrics_server
models
policies
presenters
rack_servers
replicators
routing
rubocop
scripts
serializers
services
sidekiq
sidekiq_cluster
spam
support_specs
tasks
uploaders
validators
views
workers
tooling
dot_gitlab_ci
], # ^ tooling and dot_gitlab_ci might be worth to move to another level
integration: %w[
commands
controllers
mailers
requests
],
system: ['features']
}.freeze
attr_reader :prefixes
def initialize(prefixes = nil)
@prefixes = Array(prefixes)
@patterns = {}
@regexps = {}
end
def pattern(level)
@patterns[level] ||= "#{prefixes_for_pattern}spec/#{folders_pattern(level)}{,/**/}*#{suffix(level)}".freeze
end
def regexp(level, start_with = false)
@regexps[level] ||= Regexp.new("#{'^' if start_with}#{prefixes_for_regex}spec/#{folders_regex(level)}").freeze
end
def level_for(file_path)
case file_path
# Detect background migration first since some are under
# spec/lib/gitlab/background_migration
# and tests under spec/lib are unit by default
when regexp(:background_migration)
:background_migration
when regexp(:migration)
:migration
# Detect frontend fixture before matching other unit tests
when regexp(:frontend_fixture)
:frontend_fixture
when regexp(:unit)
:unit
when regexp(:integration)
:integration
when regexp(:system)
:system
else
raise UnknownTestLevelError, "Test level for #{file_path} couldn't be set. Please rename the file properly or change the test level detection regexes in #{__FILE__}."
end
end
private
def prefixes_for_pattern
return '' if prefixes.empty?
"{#{prefixes.join(',')}}"
end
def prefixes_for_regex
return '' if prefixes.empty?
regex_prefix = prefixes.map { |prefix| Regexp.escape(prefix) }.join('|')
"(#{regex_prefix})"
end
def suffix(level)
case level
when :frontend_fixture
".rb"
else
"_spec.rb"
end
end
def folders_pattern(level)
case level
when :all
'**'
else
"{#{TEST_LEVEL_FOLDERS.fetch(level).join(',')}}"
end
end
def folders_regex(level)
case level
when :all
''
else
"(#{TEST_LEVEL_FOLDERS.fetch(level).join('|')})/"
end
end
end
end
|