minitest-junit 1.1.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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