summaryrefslogtreecommitdiff
path: root/scripts/merge-html-reports
blob: 7d1e15186c8b9ba9de8a2b7aaa0a83d034b1a04a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/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)