debian-mirror-gitlab/qa/spec/spec_helper.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

136 lines
5.2 KiB
Ruby
Raw Normal View History

2019-07-31 22:56:46 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
require_relative '../qa'
2021-11-11 11:23:49 +05:30
2021-10-27 15:23:28 +05:30
require_relative 'qa_deprecation_toolkit_env'
QaDeprecationToolkitEnv.configure!
2022-03-02 08:16:31 +05:30
Knapsack::Adapters::RSpecAdapter.bind if QA::Runtime::Env.knapsack?
2019-09-04 21:01:54 +05:30
2022-03-02 08:16:31 +05:30
QA::Runtime::Browser.configure! unless QA::Runtime::Env.dry_run
2021-09-04 01:27:46 +05:30
QA::Runtime::AllureReport.configure!
QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
2019-09-30 21:07:59 +05:30
2020-11-24 15:15:51 +05:30
Dir[::File.join(__dir__, "support/shared_examples/*.rb")].sort.each { |f| require f }
2021-11-18 22:05:49 +05:30
Dir[::File.join(__dir__, "support/shared_contexts/*.rb")].sort.each { |f| require f }
2018-03-17 18:26:18 +05:30
2017-08-17 22:00:37 +05:30
RSpec.configure do |config|
2021-11-11 11:23:49 +05:30
config.include QA::Support::Matchers::EventuallyMatcher
config.include QA::Support::Matchers::HaveMatcher
2021-01-29 00:20:46 +05:30
2021-11-11 11:23:49 +05:30
config.add_formatter QA::Support::Formatters::ContextFormatter
config.add_formatter QA::Support::Formatters::QuarantineFormatter
2022-06-21 17:19:12 +05:30
config.add_formatter QA::Support::Formatters::FeatureFlagFormatter
2021-11-11 11:23:49 +05:30
config.add_formatter QA::Support::Formatters::TestStatsFormatter if QA::Runtime::Env.export_metrics?
2019-03-02 22:35:43 +05:30
2022-04-04 11:22:00 +05:30
config.before(:suite) do |suite|
QA::Resource::ReusableCollection.register_resource_classes do |collection|
QA::Resource::ReusableProject.register(collection)
QA::Resource::ReusableGroup.register(collection)
end
end
2021-12-11 22:18:48 +05:30
config.prepend_before do |example|
2022-05-07 20:08:51 +05:30
QA::Runtime::Logger.info("Starting test: #{Rainbow(example.full_description).bright}")
2022-04-04 11:22:00 +05:30
QA::Runtime::Example.current = example
2021-12-11 22:18:48 +05:30
# Reset fabrication counters tracked in resource base
Thread.current[:api_fabrication] = 0
Thread.current[:browser_ui_fabrication] = 0
2019-12-26 22:10:19 +05:30
end
2021-03-08 18:12:59 +05:30
config.after do
# If a .netrc file was created during the test, delete it so that subsequent tests don't try to use the same logins
QA::Git::Repository.new.delete_netrc
end
2021-12-11 22:18:48 +05:30
# Add fabrication time to spec metadata
config.append_after do |example|
example.metadata[:api_fabrication] = Thread.current[:api_fabrication]
example.metadata[:browser_ui_fabrication] = Thread.current[:browser_ui_fabrication]
end
2019-12-26 22:10:19 +05:30
config.after(:context) do
if !QA::Runtime::Browser.blank_page? && QA::Page::Main::Menu.perform(&:signed_in?)
QA::Page::Main::Menu.perform(&:sign_out)
raise(
<<~ERROR
The test left the browser signed in.
Usually, Capybara prevents this from happening but some things can
interfere. For example, if it has an `after(:context)` block that logs
in, the browser will stay logged in and this will cause the next test
to fail.
Please make sure the test does not leave the browser signed in.
ERROR
)
end
2018-12-13 13:39:08 +05:30
end
2022-01-26 12:08:38 +05:30
config.after(:suite) do |suite|
2022-03-02 08:16:31 +05:30
# Write all test created resources to JSON file
2022-05-07 20:08:51 +05:30
QA::Tools::TestResourceDataProcessor.write_to_file(suite.reporter.failed_examples.any?)
2022-04-04 11:22:00 +05:30
# If requested, confirm that resources were used appropriately (e.g., not left with changes that interfere with
# further reuse)
QA::Resource::ReusableCollection.validate_resource_reuse if QA::Runtime::Env.validate_resource_reuse?
# If any tests failed, leave the resources behind to help troubleshoot, otherwise remove them.
2022-05-07 20:08:51 +05:30
# Do not remove the shared resource on live environments
2022-06-21 17:19:12 +05:30
begin
next if suite.reporter.failed_examples.present?
next unless QA::Runtime::Scenario.attributes.include?(:gitlab_address)
next if QA::Runtime::Env.running_on_dot_com?
QA::Resource::ReusableCollection.remove_all_via_api!
rescue QA::Resource::Errors::InternalServerError => e
# Temporarily prevent this error from failing jobs while the cause is investigated
# See https://gitlab.com/gitlab-org/gitlab/-/issues/354387
QA::Runtime::Logger.debug(e.message)
end
2022-03-02 08:16:31 +05:30
end
config.append_after(:suite) do
QA::Tools::KnapsackReport.move_regenerated_report if QA::Runtime::Env.knapsack?
2022-01-26 12:08:38 +05:30
end
2017-08-17 22:00:37 +05:30
config.expect_with :rspec do |expectations|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
end
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
config.shared_context_metadata_behavior = :apply_to_host_groups
config.disable_monkey_patching!
config.expose_dsl_globally = true
config.profile_examples = 10
config.order = :random
Kernel.srand config.seed
2019-03-13 22:55:13 +05:30
# show retry status in spec process
config.verbose_retry = true
# show exception that triggers a retry if verbose_retry is set to true
config.display_try_failure_messages = true
2022-06-21 17:19:12 +05:30
# This option allows to use shorthand aliases for adding :focus metadata - fit, fdescribe and fcontext
config.filter_run_when_matching :focus
2020-01-01 13:55:28 +05:30
if ENV['CI'] && !QA::Runtime::Env.disable_rspec_retry?
2020-04-22 19:07:51 +05:30
non_quarantine_retries = QA::Runtime::Env.ci_project_name =~ /staging|canary|production/ ? 3 : 2
2019-09-04 21:01:54 +05:30
config.around do |example|
2022-03-02 08:16:31 +05:30
quarantine = example.metadata[:quarantine]
different_quarantine_context = QA::Specs::Helpers::Quarantine.quarantined_different_context?(quarantine)
focused_quarantine = QA::Specs::Helpers::Quarantine.filters.key?(:quarantine)
# Do not disable retry when spec is quarantined but on different environment
next example.run_with_retry(retry: non_quarantine_retries) if different_quarantine_context && !focused_quarantine
example.run_with_retry(retry: quarantine ? 1 : non_quarantine_retries)
2019-09-04 21:01:54 +05:30
end
2019-03-13 22:55:13 +05:30
end
2017-08-17 22:00:37 +05:30
end