gitlab-ce/qa/spec/service/docker_run/video_spec.rb

206 lines
7.1 KiB
Ruby

# frozen_string_literal: true
module QA
RSpec.describe Service::DockerRun::Video do
include QA::Support::Helpers::StubEnv
let(:rspec_config) { instance_double('RSpec::Core::Configuration', prepend_before: nil, prepend_after: nil) }
let(:video_recorder_image) { 'presidenten/selenoid-manual-video-recorder' }
let(:video_recorder_version) { 'latest' }
let(:selenoid_browser_image) { 'selenoid/chrome' }
let(:selenoid_browser_version) { '111.0' }
let(:remote_grid) { 'selenoid:4444' }
let(:record_video) { 'true' }
let(:use_selenoid) { 'true' }
let(:allure_report) { 'false' }
let(:docs_link) do
'https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/running_against_remote_grid.md#testing-with-selenoid'
end
shared_examples 'video set up fails' do
it 'does not perform configuration' do
aggregate_failures do
expect(QA::Runtime::Logger).to have_received(:warn)
.with(/Test failure video recording setup failed!/)
expect(RSpec).not_to have_received(:configure)
end
end
end
shared_examples 'video set up missing variable' do |missing_variable|
let(:failure_message) do
<<~FAIL.tr("\n", ' ').strip
Aborting video recording setup!
Missing variables: #{missing_variable} is required!
See docs: #{docs_link}
FAIL
end
it 'aborts video setup with warning' do
aggregate_failures do
expect(QA::Runtime::Logger).to have_received(:warn)
.with(failure_message)
expect(described_class).not_to have_received(:get_container_name)
expect(RSpec).not_to have_received(:configure)
end
end
end
before do
stub_env('QA_VIDEO_RECORDER_IMAGE', video_recorder_image)
stub_env('QA_VIDEO_RECORDER_VERSION', video_recorder_version)
stub_env('QA_SELENOID_BROWSER_IMAGE', selenoid_browser_image)
stub_env('QA_SELENOID_BROWSER_VERSION', selenoid_browser_version)
stub_env('QA_REMOTE_GRID', remote_grid)
stub_env('USE_SELENOID', use_selenoid)
stub_env('QA_RECORD_VIDEO', record_video)
stub_env('QA_GENERATE_ALLURE_REPORT', allure_report)
allow(RSpec).to receive(:configure).and_yield(rspec_config)
allow(described_class).to receive(:get_container_name)
allow(described_class).to receive(:shell)
allow(QA::Runtime::Logger).to receive(:warn)
allow(QA::Runtime::Logger).to receive(:info)
end
context 'with video disabled' do
let(:record_video) { 'false' }
before do
described_class.configure!
end
it 'skips configuration' do
aggregate_failures do
expect(described_class).not_to have_received(:get_container_name)
expect(described_class).not_to have_received(:shell)
expect(RSpec).not_to have_received(:configure)
end
end
end
context 'with use_selenoid disabled' do
let(:use_selenoid) { 'false' }
before do
described_class.configure!
end
it_behaves_like 'video set up missing variable', 'USE_SELENOID'
end
context 'without video_recorder_image set' do
let(:video_recorder_image) { nil }
before do
described_class.configure!
end
it_behaves_like 'video set up missing variable', 'QA_VIDEO_RECORDER_IMAGE'
end
context 'without selenoid_browser_image set' do
let(:selenoid_browser_image) { nil }
before do
described_class.configure!
end
it_behaves_like 'video set up missing variable', 'QA_SELENOID_BROWSER_IMAGE'
end
context 'without selenoid_browser_version set' do
let(:selenoid_browser_version) { nil }
before do
described_class.configure!
end
it_behaves_like 'video set up missing variable', 'QA_SELENOID_BROWSER_VERSION'
end
context 'without browser_container_hostname' do
before do
allow(described_class).to receive(:get_container_name)
.with(video_recorder_image)
.and_return('recorder_container_name')
allow(described_class).to receive(:get_container_name)
.with("#{selenoid_browser_image}:#{selenoid_browser_version}")
.and_return('browser_image_hostname')
allow(described_class).to receive(:shell)
.and_return(false)
described_class.configure!
end
it_behaves_like 'video set up fails'
end
context 'without recorder_container_name' do
before do
allow(described_class).to receive(:get_container_name)
.with(video_recorder_image)
.and_return('')
allow(described_class).to receive(:get_container_name)
.with("#{selenoid_browser_image}:#{selenoid_browser_version}")
.and_return('browser_image_hostname')
allow(described_class).to receive(:shell)
.and_return('browser_container_hostname')
described_class.configure!
end
it_behaves_like 'video set up fails'
end
context 'with recorder_container_name and browser_container_hostname' do
before do
allow(described_class).to receive(:get_container_name)
.with(video_recorder_image)
.and_return('recorder_container_name')
allow(described_class).to receive(:get_container_name)
.with("#{selenoid_browser_image}:#{selenoid_browser_version}")
.and_return('browser_image_hostname')
allow(described_class).to receive(:shell)
.and_return('browser_container_hostname')
described_class.configure!
end
it 'performs configuration' do
aggregate_failures do
expect(QA::Runtime::Logger).to have_received(:info)
.with(/Test failure video recording setup complete!/)
expect(RSpec).to have_received(:configure)
expect(rspec_config).to have_received(:prepend_before)
expect(rspec_config).to have_received(:prepend_after)
end
end
context 'with generate_allure_report' do
let(:rspec_config) do
instance_double('RSpec::Core::Configuration',
prepend_before: nil,
prepend_after: nil,
append_after: nil)
end
let(:allure_report) { 'true' }
it 'performs configuration with allure report' do
aggregate_failures do
expect(QA::Runtime::Logger).to have_received(:info)
.with(/Test failure video recording setup complete!/)
expect(RSpec).to have_received(:configure).twice
expect(rspec_config).to have_received(:prepend_before)
expect(rspec_config).to have_received(:prepend_after)
expect(rspec_config).to have_received(:append_after)
end
end
end
end
end
end