diff --git a/Gemfile b/Gemfile index 01f34c5964247..b956c7e85e4d2 100644 --- a/Gemfile +++ b/Gemfile @@ -95,7 +95,6 @@ gem "aws-sdk-sns", require: false gem "webmock" group :ujs do - gem "qunit-selenium" gem "webdrivers" end diff --git a/Gemfile.lock b/Gemfile.lock index 43f3c44eed0a6..d3b10b59b3711 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -349,9 +349,6 @@ GEM puma (5.3.2) nio4r (~> 2.0) que (0.14.3) - qunit-selenium (0.0.4) - selenium-webdriver - thor raabro (1.4.0) racc (1.5.2) rack (2.2.3) @@ -568,7 +565,6 @@ DEPENDENCIES puma que queue_classic! - qunit-selenium racc (>= 1.4.6) rack-cache (~> 1.2) rails! diff --git a/ci/qunit-selenium-runner.rb b/ci/qunit-selenium-runner.rb index b7013c258abec..615196835f791 100644 --- a/ci/qunit-selenium-runner.rb +++ b/ci/qunit-selenium-runner.rb @@ -1,22 +1,103 @@ # frozen_string_literal: true -require "qunit/selenium/test_runner" +require "webdrivers" -if ARGV[1] - driver = ::Selenium::WebDriver.for(:remote, url: ARGV[1], desired_capabilities: :chrome) -else - require "webdrivers" +# This class based on https://github.com/smontanari/qunit-selenium, with a few tweaks to make it easier to read output. +# The license from https://github.com/smontanari/qunit-selenium is enclosed: +# +# The MIT License (MIT) +# +# Copyright (c) 2014 Silvio Montanari +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +class TestRun + TestResult = Struct.new(:tests, :assertions, :duration, :raw_output) + + ID_TESTRESULT = "qunit-testresult" + ID_TESTS = "qunit-tests" + + def initialize(driver) + @qunit_testresult = driver[ID_TESTRESULT] + @qunit_tests = driver[ID_TESTS] + end + + def completed? + @qunit_testresult.text =~ /Tests completed/ + end + + def result + assertions = { total: total_assertions, passed: passed_assertions, failed: failed_assertions } + tests = { total: total_tests, passed: pass_tests, failed: fail_tests } + TestResult.new(tests, assertions, duration, raw_output) + end + + private + def raw_output + @qunit_tests.text + end + + def duration + match = /Tests completed in (?\d+) milliseconds/.match @qunit_testresult.text + match[:milliseconds].to_i / 1000 + end + %w(total passed failed).each do |result| + define_method("#{result}_assertions".to_sym) do + @qunit_testresult.find_elements(:class, result).first.text.to_i + end + end + + def total_tests + @qunit_tests.find_elements(:css, "##{ID_TESTS} > *").count + end + + %w(pass fail).each do |result| + define_method("#{result}_tests".to_sym) do + @qunit_tests.find_elements(:css, "##{ID_TESTS} > .#{result}").count + end + end +end + +driver = if ARGV[1] + ::Selenium::WebDriver.for(:remote, url: ARGV[1], desired_capabilities: :chrome) +else driver_options = Selenium::WebDriver::Chrome::Options.new driver_options.add_argument("--headless") driver_options.add_argument("--disable-gpu") driver_options.add_argument("--no-sandbox") - driver = ::Selenium::WebDriver.for(:chrome, options: driver_options) + ::Selenium::WebDriver.for(:chrome, options: driver_options) end -result = QUnit::Selenium::TestRunner.new(driver).open(ARGV[0], timeout: 60) +driver.get(ARGV[0]) + +result = TestRun.new(driver).tap do |run| + ::Selenium::WebDriver::Wait.new(timeout: 60).until do + run.completed? + end +end.result + driver.quit puts "Time: #{result.duration} seconds, Total: #{result.assertions[:total]}, Passed: #{result.assertions[:passed]}, Failed: #{result.assertions[:failed]}" +if result.tests[:failed] > 0 + puts "Qunit output follows. Look for lines that have failures, eg (1, n, n) - those are your failing lines\r\n\r\n#{result.raw_output}" +end exit(result.tests[:failed] > 0 ? 1 : 0)