minitest-junit 1.1.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e9e6fe53a55b11d36289c47953e13279e41afff916cb27a7161d64baa61d914
4
- data.tar.gz: 9311c1d71be9be105f06c0f035bd8411e74f7c3a468d77e85a9cca34b11097f7
3
+ metadata.gz: 28a6272dfe9b52525afbcfc9a98fa0610bca6531d685f2e1c2bb5c838ac55480
4
+ data.tar.gz: 561f4eb58db6d84edd0c6da41aa463f736a14984870aa7b4f00e6bdefae09133
5
5
  SHA512:
6
- metadata.gz: 5fd510f4009f0c504c3d7c75f8dc8c217c61a895c92fabb912908d20ccfdfb63454152cf56257e5deb16ae499244505bfbbae768a26b9894650f1a8fa0733d9c
7
- data.tar.gz: d47bf2f92fb7a8814be1a4337826cbe4e0cb803ac8f6d0a55e285b2a77e3ae642f7f2c597127300f080f25305d887b5a433da6e1906ff81dcca64d4d9734d18a
6
+ metadata.gz: 57482ae234635c9a5f9f697d964361b614e8d47da5a5a60e9e49ae4a7f1aab7b7771af7f902f0cbb49272c2404bd9e612913d7926a7c8c437a116d9b01dc2f58
7
+ data.tar.gz: 33b11351e74c51bd4ba23549165b4138837574396d08a2da97c0e33e51ae0efcf9a84c5367d1d2f328005deb66763372462ef209968b96d0ae20111a71715dfc
@@ -0,0 +1,34 @@
1
+ name: Main
2
+ on:
3
+ push:
4
+ branches: [release]
5
+ pull_request:
6
+ types: [opened, synchronize]
7
+
8
+ jobs:
9
+ tests:
10
+ name: Tests
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ ruby: ["2.7", "3.0", "3.1", "3.2"]
16
+
17
+ steps:
18
+ - name: Checkout code
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Setup Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby }}
25
+ bundler-cache: true
26
+
27
+ - name: Generate lockfile
28
+ run: bundle lock
29
+
30
+ - name: Bundle
31
+ run: bundle check || bundle install
32
+
33
+ - name: Run tests
34
+ run: bundle exec rake test
@@ -1,6 +1,6 @@
1
1
  module Minitest
2
2
  # :nodoc:
3
3
  module Junit
4
- VERSION = '1.1.0'
4
+ VERSION = '2.0.1'
5
5
  end
6
6
  end
@@ -1,6 +1,6 @@
1
1
  require 'minitest/junit/version'
2
2
  require 'minitest'
3
- require 'builder'
3
+ require 'ox'
4
4
  require 'socket'
5
5
  require 'time'
6
6
 
@@ -28,36 +28,55 @@ module Minitest
28
28
  end
29
29
 
30
30
  def report
31
- xml = Builder::XmlMarkup.new(:indent => 2)
32
- xml.testsuite(name: 'minitest',
33
- timestamp: @options[:timestamp],
34
- hostname: @options[:hostname],
35
- tests: @results.count,
36
- skipped: @results.count { |result| result.skipped? },
37
- failures: @results.count { |result| !result.error? && result.failure },
38
- errors: @results.count { |result| result.error? },
39
- time: format_time(@results.inject(0) { |a, e| a += e.time })) do
40
- @results.each { |result| format(result, xml) }
41
- end
42
- @io.puts xml.target!
31
+ doc = Ox::Document.new(version: '1.0', encoding: 'UTF-8')
32
+ instruct = Ox::Instruct.new(:xml)
33
+ instruct[:version] = '1.0'
34
+ instruct[:encoding] = 'UTF-8'
35
+ doc << instruct
36
+
37
+ testsuite = Ox::Element.new('testsuite')
38
+ testsuite['name'] = @options[:name] || 'minitest'
39
+ testsuite['timestamp'] = @options[:timestamp]
40
+ testsuite['hostname'] = @options[:hostname]
41
+ testsuite['tests'] = @results.size
42
+ testsuite['skipped'] = @results.count(&:skipped?)
43
+ testsuite['failures'] = @results.count { |result| !result.error? && result.failure }
44
+ testsuite['errors'] = @results.count(&:error?)
45
+ testsuite['time'] = format_time(@results.map(&:time).inject(0, :+))
46
+ @results.each do |result|
47
+ testsuite << format(result)
48
+ end
49
+
50
+ testsuites = Ox::Element.new('testsuites')
51
+ testsuites << testsuite
52
+
53
+ doc << testsuites
54
+ @io << Ox.dump(doc)
43
55
  end
44
56
 
45
57
  def format(result, parent = nil)
46
- xml = Builder::XmlMarkup.new(:target => parent, :indent => 2)
47
- xml.testcase classname: format_class(result),
48
- name: format_name(result),
49
- time: format_time(result.time),
50
- assertions: result.assertions do |t|
51
- if result.skipped?
52
- t.skipped message: result
53
- else
54
- result.failures.each do |failure|
55
- type = classify failure
56
- xml.tag! type, format_backtrace(failure), message: result
57
- end
58
+ testcase = Ox::Element.new('testcase')
59
+ testcase['classname'] = format_class(result)
60
+ testcase['name'] = format_name(result)
61
+ testcase['time'] = format_time(result.time)
62
+ testcase['file'] = relative_to_cwd(result.source_location.first)
63
+ testcase['line'] = result.source_location.last
64
+ testcase['assertions'] = result.assertions
65
+ if result.skipped?
66
+ skipped = Ox::Element.new('skipped')
67
+ skipped['message'] = result
68
+ skipped << ""
69
+ testcase << skipped
70
+ else
71
+ result.failures.each do |failure|
72
+ failure_tag = Ox::Element.new(classify(failure))
73
+ failure_tag['message'] = result
74
+ failure_tag << format_backtrace(failure)
75
+ testcase << failure_tag
58
76
  end
59
77
  end
60
- xml
78
+
79
+ testcase
61
80
  end
62
81
 
63
82
  private
@@ -70,8 +89,18 @@ module Minitest
70
89
  end
71
90
  end
72
91
 
92
+ def working_directory
93
+ @working_directory ||= Dir.getwd
94
+ end
95
+
96
+ def relative_to_cwd(path)
97
+ path.sub(working_directory, '.')
98
+ end
99
+
73
100
  def format_backtrace(failure)
74
- failure.backtrace.join("\n")
101
+ Minitest.filter_backtrace(failure.backtrace).map do |line|
102
+ relative_to_cwd(line)
103
+ end.join("\n")
75
104
  end
76
105
 
77
106
  def format_class(result)
@@ -19,9 +19,11 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_dependency 'minitest', '~> 5.11'
22
- spec.add_dependency 'builder', '~> 3.2'
22
+ spec.add_dependency 'ox', '~> 2', '>= 2.14.2'
23
23
 
24
24
  spec.add_development_dependency 'bundler'
25
- spec.add_development_dependency 'rake', '~> 10.3.2'
26
- spec.add_development_dependency 'rubocop', '~> 0.24.1'
25
+ spec.add_development_dependency 'nokogiri'
26
+ spec.add_development_dependency 'pry-byebug'
27
+ spec.add_development_dependency 'rake', '~> 13'
28
+ spec.add_development_dependency 'rubocop', '~> 1'
27
29
  end
@@ -1,17 +1,34 @@
1
1
  require 'minitest/autorun'
2
- require 'builder'
3
2
  require 'stringio'
4
3
  require 'time'
4
+ require 'nokogiri'
5
5
 
6
6
  require 'minitest/junit'
7
7
 
8
+ class FakeTestName; end
9
+
8
10
  class ReporterTest < Minitest::Test
9
11
  def test_no_tests_generates_an_empty_suite
10
12
  reporter = create_reporter
11
13
 
12
14
  reporter.report
13
15
 
14
- assert_match(/^<testsuite name="minitest" timestamp="[^"]+" hostname="[^"]+" tests="0" skipped="0" failures="0" errors="0" time="0.000000">\n<\/testsuite>\n$/, reporter.output)
16
+ assert_match(
17
+ %r{<?xml version="1.0" encoding="UTF-8"\?>\n<testsuites>\n <testsuite name="minitest" timestamp="[^"]+" hostname="[^"]+" tests="0" skipped="0" failures="0" errors="0" time="0.000000"\/>\n<\/testsuites>\n},
18
+ reporter.output
19
+ )
20
+ end
21
+
22
+ # NOTE: This test will generate a temp file: "test/tmp/report.xml"
23
+ def test_encoding
24
+ # Enforce File.external_encoding to UTF-8 to ensure that ASCII character will be correctly converted to UTF-8
25
+ file = File.new('test/tmp/report.xml', 'w:UTF-8')
26
+ reporter = Minitest::Junit::Reporter.new file, { hostname: '‹foo›' }
27
+ reporter.start
28
+ reporter.report
29
+ file.close
30
+
31
+ assert_match(/hostname="‹foo›"/, File.new('test/tmp/report.xml', 'r:UTF-8').read)
15
32
  end
16
33
 
17
34
  def test_formats_each_successful_result_with_a_formatter
@@ -28,11 +45,23 @@ class ReporterTest < Minitest::Test
28
45
  reporter = create_reporter
29
46
 
30
47
  results = do_formatting_test(reporter, count: rand(100), cause_failures: 1)
31
-
48
+ parsed_report = Nokogiri::XML(reporter.output)
32
49
  results.each do |result|
33
- assert_match("<testcase classname=\"FakeTestName\" name=\"#{result.name}\"", reporter.output)
34
- assert_match(/<failure/, reporter.output)
50
+ parsed_report.xpath("//testcase[@name='#{result.name}']").any?
35
51
  end
52
+ # Check if some testcase has a failure
53
+ assert parsed_report.xpath("//testcase//failure").any?
54
+ end
55
+
56
+ def test_xml_nodes_has_file_and_line_attributes
57
+ reporter = create_reporter
58
+ results = do_formatting_test(reporter, count: 2, cause_failures: 1)
59
+ parsed_report = Nokogiri::XML(reporter.output)
60
+ example_node = parsed_report.xpath("//testcase").first
61
+ assert example_node.has_attribute?('file')
62
+ assert example_node.has_attribute?('line')
63
+ assert_equal 'unknown', example_node.attribute('file').value
64
+ assert_equal '-1', example_node.attribute('line').value
36
65
  end
37
66
 
38
67
  private
@@ -60,7 +89,7 @@ class ReporterTest < Minitest::Test
60
89
  test.failures = failures.times.map do |i|
61
90
  Class.new Minitest::Assertion do
62
91
  define_method 'backtrace' do
63
- ["Model failure \##{i}", 'This is a test backtrace']
92
+ ["Model failure \##{i}", 'This is a test backtrace', "#{__FILE__}:#{__LINE__}"]
64
93
  end
65
94
  end.new
66
95
  end
@@ -17,7 +17,10 @@ class TestCaseFormatter < Minitest::Test
17
17
  test = create_test_result
18
18
  reporter = create_reporter
19
19
 
20
- assert_match test.name, reporter.format(test).target!
20
+ assert_match(
21
+ test.name,
22
+ reporter.format(test).attributes['name']
23
+ )
21
24
  end
22
25
 
23
26
  def test_skipped_tests_generates_skipped_tag
@@ -28,7 +31,7 @@ class TestCaseFormatter < Minitest::Test
28
31
 
29
32
  reporter.report
30
33
 
31
- assert_match(/<skipped message="[^<>]+"\/>\n<\/testcase>\n<\/testsuite>\n/, reporter.output)
34
+ assert_match(/<skipped message="[^<>]+"\><\/skipped>\n\s+<\/testcase>\n\s*<\/testsuite>\n/, reporter.output)
32
35
  end
33
36
 
34
37
  def test_failing_tests_creates_failure_tag
data/test/tmp/.keep ADDED
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-junit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Allan Espinosa
@@ -25,19 +25,25 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.11'
27
27
  - !ruby/object:Gem::Dependency
28
- name: builder
28
+ name: ox
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.2'
33
+ version: '2'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 2.14.2
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
41
  - - "~>"
39
42
  - !ruby/object:Gem::Version
40
- version: '3.2'
43
+ version: '2'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.14.2
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: bundler
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -52,34 +58,62 @@ dependencies:
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: nokogiri
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry-byebug
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
55
89
  - !ruby/object:Gem::Dependency
56
90
  name: rake
57
91
  requirement: !ruby/object:Gem::Requirement
58
92
  requirements:
59
93
  - - "~>"
60
94
  - !ruby/object:Gem::Version
61
- version: 10.3.2
95
+ version: '13'
62
96
  type: :development
63
97
  prerelease: false
64
98
  version_requirements: !ruby/object:Gem::Requirement
65
99
  requirements:
66
100
  - - "~>"
67
101
  - !ruby/object:Gem::Version
68
- version: 10.3.2
102
+ version: '13'
69
103
  - !ruby/object:Gem::Dependency
70
104
  name: rubocop
71
105
  requirement: !ruby/object:Gem::Requirement
72
106
  requirements:
73
107
  - - "~>"
74
108
  - !ruby/object:Gem::Version
75
- version: 0.24.1
109
+ version: '1'
76
110
  type: :development
77
111
  prerelease: false
78
112
  version_requirements: !ruby/object:Gem::Requirement
79
113
  requirements:
80
114
  - - "~>"
81
115
  - !ruby/object:Gem::Version
82
- version: 0.24.1
116
+ version: '1'
83
117
  description: Junit reporter for Minitest ~> 5.0
84
118
  email:
85
119
  - allan.espinosa@outlook.com
@@ -87,6 +121,7 @@ executables: []
87
121
  extensions: []
88
122
  extra_rdoc_files: []
89
123
  files:
124
+ - ".github/workflows/main.yml"
90
125
  - ".gitignore"
91
126
  - Gemfile
92
127
  - LICENSE.txt
@@ -100,6 +135,7 @@ files:
100
135
  - test/junit_plugin_test.rb
101
136
  - test/reporter_test.rb
102
137
  - test/testcase_formatter_test.rb
138
+ - test/tmp/.keep
103
139
  homepage: http://github.com/aespinosa/minitest-junit
104
140
  licenses:
105
141
  - MIT
@@ -119,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
155
  - !ruby/object:Gem::Version
120
156
  version: '0'
121
157
  requirements: []
122
- rubygems_version: 3.2.26
158
+ rubygems_version: 3.4.13
123
159
  signing_key:
124
160
  specification_version: 4
125
161
  summary: Junit reporter for Minitest ~> 5.0
@@ -128,3 +164,4 @@ test_files:
128
164
  - test/junit_plugin_test.rb
129
165
  - test/reporter_test.rb
130
166
  - test/testcase_formatter_test.rb
167
+ - test/tmp/.keep