Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'qa/spec/support/page_error_checker_spec.rb')
-rw-r--r--qa/spec/support/page_error_checker_spec.rb217
1 files changed, 217 insertions, 0 deletions
diff --git a/qa/spec/support/page_error_checker_spec.rb b/qa/spec/support/page_error_checker_spec.rb
new file mode 100644
index 00000000000..764b6110e08
--- /dev/null
+++ b/qa/spec/support/page_error_checker_spec.rb
@@ -0,0 +1,217 @@
+# frozen_string_literal: true
+
+RSpec.describe QA::Support::PageErrorChecker do
+ let(:test_path) { '/test/path' }
+
+ let(:page) { double(Capybara.page) }
+
+ describe '.report!' do
+ context 'reports errors' do
+ let(:expected_chrome_error) do
+ "chrome errors\n\n"\
+ "Path: #{test_path}"
+ end
+
+ let(:expected_basic_error) do
+ "foo status\n\n"\
+ "Path: #{test_path}"
+ end
+
+ it 'reports error message on chrome browser' do
+ allow(QA::Support::PageErrorChecker).to receive(:return_chrome_errors).and_return('chrome errors')
+ allow(page).to receive(:current_path).and_return(test_path)
+ allow(QA::Runtime::Env).to receive(:browser).and_return(:chrome)
+
+ expect { QA::Support::PageErrorChecker.report!(page, 500) }.to raise_error(RuntimeError, expected_chrome_error)
+ end
+
+ it 'reports basic message on non-chrome browser' do
+ allow(QA::Support::PageErrorChecker).to receive(:status_code_report).and_return('foo status')
+ allow(page).to receive(:current_path).and_return(test_path)
+ allow(QA::Runtime::Env).to receive(:browser).and_return(:firefox)
+
+ expect { QA::Support::PageErrorChecker.report!(page, 500) }.to raise_error(RuntimeError, expected_basic_error)
+ end
+ end
+ end
+
+ describe '.return_chrome_errors' do
+ context 'returns error message' do
+ before do
+ single_log = Class.new do
+ def level
+ 'SEVERE'
+ end
+ end
+ stub_const('SingleLog', single_log)
+ one_error_mocked_logs = Class.new do
+ def self.select
+ [SingleLog]
+ end
+ end
+ stub_const('OneErrorMockedLogs', one_error_mocked_logs)
+ three_errors_mocked_logs = Class.new do
+ def self.select
+ [SingleLog, SingleLog, SingleLog]
+ end
+ end
+ stub_const('ThreeErrorsMockedLogs', three_errors_mocked_logs)
+ no_error_mocked_logs = Class.new do
+ def self.select
+ []
+ end
+ end
+ stub_const('NoErrorMockedLogs', no_error_mocked_logs)
+ end
+
+ let(:expected_single_error) do
+ "There was 1 SEVERE level error:\n\n"\
+ "bar foo"
+ end
+
+ let(:expected_multiple_error) do
+ "There were 3 SEVERE level errors:\n\n"\
+ "bar foo\n"\
+ "foo\n"\
+ "bar"
+ end
+
+ it 'returns status code report on no severe errors found' do
+ allow(QA::Support::PageErrorChecker).to receive(:logs).with(page).and_return(NoErrorMockedLogs)
+ allow(QA::Support::PageErrorChecker).to receive(:status_code_report).with('123').and_return('Test Status Code return 123')
+
+ expect(QA::Support::PageErrorChecker.return_chrome_errors(page, '123')).to eq('Test Status Code return 123')
+ end
+
+ it 'returns report on 1 severe error found' do
+ allow(QA::Support::PageErrorChecker).to receive(:error_report_for).with([SingleLog]).and_return('bar foo')
+ allow(QA::Support::PageErrorChecker).to receive(:logs).with(page).and_return(OneErrorMockedLogs)
+ allow(page).to receive(:current_path).and_return(test_path)
+
+ expect(QA::Support::PageErrorChecker.return_chrome_errors(page, '123')).to eq(expected_single_error)
+ end
+
+ it 'returns report on multiple severe errors found' do
+ allow(QA::Support::PageErrorChecker).to receive(:error_report_for)
+ .with([SingleLog, SingleLog, SingleLog]).and_return("bar foo\nfoo\nbar")
+ allow(QA::Support::PageErrorChecker).to receive(:logs).with(page).and_return(ThreeErrorsMockedLogs)
+ allow(page).to receive(:current_path).and_return(test_path)
+
+ expect(QA::Support::PageErrorChecker.return_chrome_errors(page, '123')).to eq(expected_multiple_error)
+ end
+ end
+ end
+
+ describe '.check_page_for_error_code' do
+ require 'nokogiri'
+ before do
+ nokogiri_parse = Class.new do
+ def self.parse(str)
+ Nokogiri::HTML.parse(str)
+ end
+ end
+ stub_const('NokogiriParse', nokogiri_parse)
+ end
+ let(:error_404_str) do
+ "<div class=\"error\">"\
+ "<img src=\"404.png\" alt=\"404\" />"\
+ "</div>"
+ end
+
+ let(:error_500_str) { "<h1> 500 </h1>"}
+ let(:backtrace_str) {"<body><section class=\"backtrace\">foo</section></body>"}
+ let(:no_error_str) {"<body>no 404 or 500 or backtrace</body>"}
+
+ it 'calls report with 404 if 404 found' do
+ allow(page).to receive(:html).and_return(error_404_str)
+ allow(Nokogiri::HTML).to receive(:parse).with(error_404_str).and_return(NokogiriParse.parse(error_404_str))
+
+ expect(QA::Support::PageErrorChecker).to receive(:report!).with(page, 404)
+ QA::Support::PageErrorChecker.check_page_for_error_code(page)
+ end
+ it 'calls report with 500 if 500 found' do
+ allow(page).to receive(:html).and_return(error_500_str)
+ allow(Nokogiri::HTML).to receive(:parse).with(error_500_str).and_return(NokogiriParse.parse(error_500_str))
+
+ expect(QA::Support::PageErrorChecker).to receive(:report!).with(page, 500)
+ QA::Support::PageErrorChecker.check_page_for_error_code(page)
+ end
+ it 'calls report with 500 if GDK backtrace found' do
+ allow(page).to receive(:html).and_return(backtrace_str)
+ allow(Nokogiri::HTML).to receive(:parse).with(backtrace_str).and_return(NokogiriParse.parse(backtrace_str))
+
+ expect(QA::Support::PageErrorChecker).to receive(:report!).with(page, 500)
+ QA::Support::PageErrorChecker.check_page_for_error_code(page)
+ end
+ it 'does not call report if no 404, 500 or backtrace found' do
+ allow(page).to receive(:html).and_return(no_error_str)
+ allow(Nokogiri::HTML).to receive(:parse).with(no_error_str).and_return(NokogiriParse.parse(no_error_str))
+
+ expect(QA::Support::PageErrorChecker).not_to receive(:report!)
+ QA::Support::PageErrorChecker.check_page_for_error_code(page)
+ end
+ end
+
+ describe '.error_report_for' do
+ before do
+ logs_class_one = Class.new do
+ def self.message
+ 'foo\\n'
+ end
+ end
+ stub_const('LogOne', logs_class_one)
+ logs_class_two = Class.new do
+ def self.message
+ 'bar'
+ end
+ end
+ stub_const('LogTwo', logs_class_two)
+ end
+
+ it 'returns error report array of log messages' do
+ expect(QA::Support::PageErrorChecker.error_report_for([LogOne, LogTwo]))
+ .to eq(%W(foo\n bar))
+ end
+ end
+
+ describe '.logs' do
+ before do
+ logs_class = Class.new do
+ def self.get(level)
+ "logs at #{level} level"
+ end
+ end
+ stub_const('Logs', logs_class)
+ manage_class = Class.new do
+ def self.logs
+ Logs
+ end
+ end
+ stub_const('Manage', manage_class)
+ browser_class = Class.new do
+ def self.manage
+ Manage
+ end
+ end
+ stub_const('Browser', browser_class)
+ driver_class = Class.new do
+ def self.browser
+ Browser
+ end
+ end
+ stub_const('Driver', driver_class)
+ end
+
+ it 'gets driver browser logs' do
+ allow(page).to receive(:driver).and_return(Driver)
+
+ expect(QA::Support::PageErrorChecker.logs(page)).to eq('logs at browser level')
+ end
+ end
+
+ describe '.status_code_report' do
+ it 'returns a string message containing the status code' do
+ expect(QA::Support::PageErrorChecker.status_code_report(1234)).to eq('Status code 1234 found')
+ end
+ end
+end