86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env ruby
 | |
| # frozen_string_literal: true
 | |
| 
 | |
| 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)
 |