diff options
Diffstat (limited to 'qa/spec/spec_helper.rb')
-rw-r--r-- | qa/spec/spec_helper.rb | 65 |
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 |