a1bee1a09d
Creates reports for parallel specs and collates them into a single HTML report and displays results on the merge request.
84 lines
2.2 KiB
Ruby
Executable file
84 lines
2.2 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
require 'nokogiri'
|
|
|
|
main_report_file = ARGV.shift
|
|
unless main_report_file
|
|
puts 'usage: merge-html-reports <main-report> <base-artifact-url> [parallel reports...]'
|
|
exit 1
|
|
end
|
|
|
|
base_artifact_url = ARGV.shift
|
|
unless base_artifact_url
|
|
puts 'usage: merge-html-reports <main-report> <base-artifact-url> [parallel reports...]'
|
|
exit 1
|
|
end
|
|
|
|
# Create the base report with empty body tag
|
|
new_report = Nokogiri::HTML.parse(File.read(ARGV[0]))
|
|
new_report.at_css('body').remove
|
|
empty_body = Nokogiri::XML::Node.new('body', new_report)
|
|
new_report.at_css('head').add_next_sibling(empty_body)
|
|
|
|
ARGV.each do |report_file|
|
|
report = Nokogiri::HTML.parse(File.read(report_file))
|
|
|
|
report.css('a').each do |link|
|
|
link_suffix = link['href'].slice(19..-1)
|
|
link['href'] = base_artifact_url + link_suffix
|
|
end
|
|
|
|
header = report.css('div #rspec-header')
|
|
tests = report.css('dt[id^="example_group_"]')
|
|
|
|
tests.each do |test|
|
|
title = test.parent
|
|
group = title.parent
|
|
script = title.css('script')
|
|
|
|
if script.inner_html.include? 'makeYellow'
|
|
test.remove_class('passed')
|
|
test.add_class('not_implemented')
|
|
|
|
group.remove_class('passed')
|
|
group.add_class('not_implemented')
|
|
header.add_class('not_implemented')
|
|
|
|
script.remove
|
|
test.next_sibling.remove
|
|
test.next_sibling.remove
|
|
|
|
elsif script.inner_html.include? 'makeRed'
|
|
test.remove_class('passed')
|
|
test.add_class('failed')
|
|
|
|
group.remove_class('passed')
|
|
group.add_class('failed')
|
|
header.add_class('failed')
|
|
|
|
script.remove
|
|
test.next_sibling.remove
|
|
test.next_sibling.remove
|
|
end
|
|
end
|
|
|
|
duration = report.at_css('p#duration')
|
|
totals = report.at_css('p#totals')
|
|
|
|
duration_script = report.css('div.results script')[-2]
|
|
totals_script = report.css('div.results script')[-1]
|
|
|
|
duration_text = duration_script.text.slice(49..-3)
|
|
totals_text = totals_script.text.slice(47..-3)
|
|
|
|
duration.inner_html = duration_text
|
|
totals.inner_html = totals_text
|
|
|
|
duration_script.remove
|
|
totals_script.remove
|
|
|
|
# Add the new result after the last one to keep the test order
|
|
new_report.css('body')[-1].add_next_sibling(report.at_css('body'))
|
|
end
|
|
|
|
File.write(main_report_file, new_report)
|