diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4d96d89895f..c958e4758be 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@
* [#7654](https://github.com/rubocop-hq/rubocop/issues/7654): Support `with_fixed_indentation` option for `Layout/ArrayAlignment` cop. ([@nikitasakov][])
+### Bug fixes
+
+* [#7733](https://github.com/rubocop-hq/rubocop/issues/7733): Fix rubocop-junit-formatter imcompatibility XML for JUnit formatter. ([@koic][])
+
## 0.80.1 (2020-02-29)
### Bug fixes
diff --git a/lib/rubocop/formatter/junit_formatter.rb b/lib/rubocop/formatter/junit_formatter.rb
index 3bfc5f6567a..fe20f09d23a 100644
--- a/lib/rubocop/formatter/junit_formatter.rb
+++ b/lib/rubocop/formatter/junit_formatter.rb
@@ -29,18 +29,29 @@ def initialize(output, options = {})
end
def file_finished(file, offenses)
- offenses.group_by(&:cop_name).each do |cop_name, grouped_offenses|
+ # TODO: Returns all cops with the same behavior as
+ # the original rubocop-junit-formatter.
+ # https://github.com/mikian/rubocop-junit-formatter/blob/v0.1.4/lib/rubocop/formatter/junit_formatter.rb#L9
+ #
+ # In the future, it would be preferable to return only enabled cops.
+ Cop::Cop.all.each do |cop|
REXML::Element.new('testcase', @testsuite).tap do |testcase|
- testcase.attributes['classname'] = file.gsub(
- /\.rb\Z/, ''
- ).gsub("#{Dir.pwd}/", '').tr('/', '.')
- testcase.attributes['name'] = cop_name
+ testcase.attributes['classname'] = classname_attribute_value(file)
+ testcase.attributes['name'] = cop.cop_name
- add_failure_to(testcase, grouped_offenses, cop_name)
+ target_offenses = offenses.select do |offense|
+ offense.cop_name == cop.cop_name
+ end
+
+ add_failure_to(testcase, target_offenses, cop.cop_name)
end
end
end
+ def classname_attribute_value(file)
+ file.gsub(/\.rb\Z/, '').gsub("#{Dir.pwd}/", '').tr('/', '.')
+ end
+
def finished(_inspected_files)
@document.write(output, 2)
end
diff --git a/spec/rubocop/formatter/junit_formatter_spec.rb b/spec/rubocop/formatter/junit_formatter_spec.rb
index 4057a5604cc..f713a3f73ee 100644
--- a/spec/rubocop/formatter/junit_formatter_spec.rb
+++ b/spec/rubocop/formatter/junit_formatter_spec.rb
@@ -6,8 +6,8 @@
let(:output) { StringIO.new }
describe '#file_finished' do
- it 'displays parsable text' do
- cop = RuboCop::Cop::Cop.new
+ before do
+ cop = RuboCop::Cop::Layout::SpaceInsideBlockBraces.new
source_buffer = Parser::Source::Buffer.new('test', 1)
source_buffer.source = %w[foo bar baz].join("\n")
@@ -26,30 +26,53 @@
formatter.file_finished('test_2', cop.offenses)
formatter.finished(nil)
+ end
- expect(output.string).to eq(<<~XML.chop)
+ it 'displays start of parsable text' do
+ expect(output.string).to start_with(<<~XML)
-
-
- test:1:1
-
-
- test:3:2
-
-
-
-
- test:1:1
-
-
- test:3:2
-
-
+ XML
+ end
+
+ it 'displays end of parsable text' do
+ expect(output.string).to end_with(<<~XML.chop)
XML
end
+
+ it "displays an offfense for `classname='test_1` in parsable text" do
+ expect(output.string).to include(<<-XML)
+
+
+ test:1:1
+
+
+ test:3:2
+
+
+ XML
+ end
+
+ it "displays an offfense for `classname='test_2` in parsable text" do
+ expect(output.string).to include(<<-XML)
+
+
+ test:1:1
+
+
+ test:3:2
+
+
+ XML
+ end
+
+ it 'displays a non-offfense element in parsable text' do
+ expect(output.string).to include(<<~XML)
+
+ XML
+ end
end
end