summaryrefslogtreecommitdiff
path: root/qa/spec/spec_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qa/spec/spec_helper.rb')
-rw-r--r--qa/spec/spec_helper.rb65
1 files changed, 34 insertions, 31 deletions
diff --git a/qa/spec/spec_helper.rb b/qa/spec/spec_helper.rb
index c5c33596d55..f1b4203d422 100644
--- a/qa/spec/spec_helper.rb
+++ b/qa/spec/spec_helper.rb
@@ -19,35 +19,16 @@ RSpec.configure do |config|
end
end
- # If quarantine is focussed, skip tests/contexts that have other metadata
- # unless they're also focussed. This lets us run quarantined tests in a
- # particular category without running tests in other categories.
- # E.g., if a test is tagged 'smoke' and 'quarantine', and another is tagged
- # 'ldap' and 'quarantine', if we wanted to run just quarantined smoke tests
- # using `--tag quarantine --tag smoke`, without this check we'd end up
- # running that ldap test as well.
- config.before(:context, :quarantine) do
- if config.inclusion_filter[:quarantine] && self.class.metadata.keys.include?(:quarantine)
- skip("Only running contexts tagged with :quarantine and any of #{filters_other_than_quarantine(config)}") unless quarantine_and_optional_other_tag?(self.class.metadata.keys, config)
+ config.before(:context) do
+ if self.class.metadata.keys.include?(:quarantine)
+ skip_or_run_quarantined_tests(self.class.metadata.keys, config.inclusion_filter.rules.keys)
end
end
+
config.before do |example|
QA::Runtime::Logger.debug("Starting test: #{example.full_description}") if QA::Runtime::Env.debug?
- if config.inclusion_filter[:quarantine]
- skip("Only running tests tagged with :quarantine and any of #{filters_other_than_quarantine(config)}") unless quarantine_and_optional_other_tag?(example.metadata.keys, config)
- end
- end
-
- # Skip tests in quarantine unless we explicitly focus on them.
- # Skip the entire context if a context is tagged. This avoids running before
- # blocks unnecessarily.
- # We could use an exclusion filter, but this way the test report will list
- # the quarantined tests when they're not run so that we're aware of them
- [:context, :each].each do |scope|
- config.before(:context, :quarantine) do |context|
- skip('In quarantine') unless config.inclusion_filter[:quarantine]
- end
+ skip_or_run_quarantined_tests(example.metadata.keys, config.inclusion_filter.rules.keys)
end
config.expect_with :rspec do |expectations|
@@ -66,19 +47,41 @@ RSpec.configure do |config|
Kernel.srand config.seed
end
-def filters_other_than_quarantine(config)
- config.inclusion_filter.rules.keys.reject { |key| key == :quarantine }
+# Skip tests in quarantine unless we explicitly focus on them.
+# Skip the entire context if a context is tagged. This avoids running before
+# blocks unnecessarily.
+# If quarantine is focussed, skip tests/contexts that have other metadata
+# unless they're also focussed. This lets us run quarantined tests in a
+# particular category without running tests in other categories.
+# E.g., if a test is tagged 'smoke' and 'quarantine', and another is tagged
+# 'ldap' and 'quarantine', if we wanted to run just quarantined smoke tests
+# using `--tag quarantine --tag smoke`, without this check we'd end up
+# running that ldap test as well.
+# We could use an exclusion filter, but this way the test report will list
+# the quarantined tests when they're not run so that we're aware of them
+def skip_or_run_quarantined_tests(metadata_keys, filter_keys)
+ included_filters = filters_other_than_quarantine(filter_keys)
+
+ if filter_keys.include?(:quarantine)
+ skip("Only running tests tagged with :quarantine and any of #{included_filters}") unless quarantine_and_optional_other_tag?(metadata_keys, included_filters)
+ else
+ skip('In quarantine') if metadata_keys.include?(:quarantine)
+ end
+end
+
+def filters_other_than_quarantine(filter_keys)
+ filter_keys.reject { |key| key == :quarantine }
end
# Checks if a test has the 'quarantine' tag and other tags in the inclusion filter.
#
# Returns true if
# - the metadata includes the quarantine tag
-# - and the metadata and inclusion filter both have any other tag
-# - or no other tags are in the inclusion filter
-def quarantine_and_optional_other_tag?(metadata_keys, config)
+# - and the metadata and inclusion filter both have any other tag
+# - or no other tags are in the inclusion filter
+def quarantine_and_optional_other_tag?(metadata_keys, included_filters)
return false unless metadata_keys.include? :quarantine
- return true if filters_other_than_quarantine(config).empty?
+ return true if included_filters.empty?
- filters_other_than_quarantine(config).any? { |key| metadata_keys.include? key }
+ included_filters.any? { |key| metadata_keys.include? key }
end