require 'spec_helper'
require 'cucumber/formatter/spec_helper'
require 'cucumber/formatter/junit'
require 'nokogiri'
module Cucumber
module Formatter
describe Junit do
extend SpecHelperDsl
include SpecHelper
class TestDoubleJunitFormatter < Junit
attr_reader :written_files
def write_file(feature_filename, data)
@written_files ||= {}
@written_files[feature_filename] = data
end
end
context "With no options" do
before(:each) do
allow(File).to receive(:directory?) { true }
@formatter = TestDoubleJunitFormatter.new(actual_runtime.configuration.with_options(out_stream: ''))
end
after(:each) do
$stdout = STDOUT
end
describe "is able to strip control chars from cdata" do
before(:each) do
run_defined_feature
@doc = Nokogiri.XML(@formatter.written_files.values.first)
end
define_feature "
Feature: One passing scenario, one failing scenario
Scenario: Passing
Given a passing ctrl scenario
"
class Junit
def before_step(step)
if step.name.match("a passing ctrl scenario")
Interceptor::Pipe.unwrap! :stdout
@fake_io = $stdout = StringIO.new
$stdout.sync = true
@interceptedout = Interceptor::Pipe.wrap(:stdout)
end
end
def after_step(step)
if step.name.match("a passing ctrl scenario")
@interceptedout.write("boo\b\cx\e\a\f boo ")
$stdout = STDOUT
@fake_io.close
end
end
end
it { expect(@doc.xpath('//testsuite/testcase/system-out').first.content).to match(/\s+boo boo\s+/) }
end
describe "a feature with no name" do
define_feature <<-FEATURE
Feature:
Scenario: Passing
Given a passing scenario
FEATURE
it "raises an exception" do
expect(-> {
run_defined_feature
}).to raise_error(Junit::UnNamedFeatureError)
end
end
describe "given a single feature" do
before(:each) do
run_defined_feature
@doc = Nokogiri.XML(@formatter.written_files.values.first)
end
describe "with a single scenario" do
define_feature <<-FEATURE
Feature: One passing scenario, one failing scenario
Scenario: Passing
Given a passing scenario
FEATURE
it { expect(@doc.to_s).to match /One passing scenario, one failing scenario/ }
it 'has not a root system-out node' do
expect(@doc.xpath('//testsuite/system-out').size).to eq 0
end
it 'has not a root system-err node' do
expect(@doc.xpath('//testsuite/system-err').size).to eq 0
end
it 'has a system-out node under ' do
expect(@doc.xpath('//testcase/system-out').size).to eq 1
end
it 'has a system-err node under ' do
expect(@doc.xpath('//testcase/system-err').size).to eq 1
end
end
describe "with a scenario in a subdirectory" do
define_feature %{
Feature: One passing scenario, one failing scenario
Scenario: Passing
Given a passing scenario
}, File.join('features', 'some', 'path', 'spec.feature')
it 'writes the filename including the subdirectory' do
expect(@formatter.written_files.keys.first).to eq File.join('', 'TEST-features-some-path-spec.xml')
end
end
describe "with a scenario outline table" do
define_steps do
Given(/.*/) { }
end
define_feature <<-FEATURE
Feature: Eat things when hungry
Scenario Outline: Eat things
Given
And stuff:
| foo |
| bar |
Examples: Good
| Things |
| Cucumber |
| Whisky |
Examples: Evil
| Things |
| Big Mac |
FEATURE
it { expect(@doc.to_s).to match /Eat things when hungry/ }
it { expect(@doc.to_s).to match /Cucumber/ }
it { expect(@doc.to_s).to match /Whisky/ }
it { expect(@doc.to_s).to match /Big Mac/ }
it { expect(@doc.to_s).not_to match /Things/ }
it { expect(@doc.to_s).not_to match /Good|Evil/ }
it { expect(@doc.to_s).not_to match /type="skipped"/}
end
describe "scenario with skipped test in junit report" do
define_feature <<-FEATURE
Feature: junit report with skipped test
Scenario Outline: skip a test and junit report of the same
Given a scenario
Examples:
| skip |
| undefined |
| still undefined |
FEATURE
it { expect(@doc.to_s).to match /skipped="2"/}
end
describe "with a regular data table scenario" do
define_steps do
Given(/the following items on a shortlist/) { |table| }
When(/I go.*/) { }
Then(/I should have visited at least/) { |table| }
end
define_feature <<-FEATURE
Feature: Shortlist
Scenario: Procure items
Given the following items on a shortlist:
| item |
| milk |
| cookies |
When I get some..
Then I'll eat 'em
FEATURE
# these type of tables shouldn't crash (or generate test cases)
it { expect(@doc.to_s).not_to match /milk/ }
it { expect(@doc.to_s).not_to match /cookies/ }
end
end
end
context "In --expand mode" do
let(:runtime) { Runtime.new({:expand => true}) }
before(:each) do
allow(File).to receive(:directory?) { true }
@formatter = TestDoubleJunitFormatter.new(actual_runtime.configuration.with_options(out_stream: '', :expand => true))
end
after(:each) do
$stdout = STDOUT
end
describe "given a single feature" do
before(:each) do
run_defined_feature
@doc = Nokogiri.XML(@formatter.written_files.values.first)
end
describe "with a scenario outline table" do
define_steps do
Given(/.*/) { }
end
define_feature <<-FEATURE
Feature: Eat things when hungry
Scenario Outline: Eat things
Given
And stuff:
| foo |
| bar |
Examples: Good
| Things |
| Cucumber |
| Whisky |
Examples: Evil
| Things |
| Big Mac |
FEATURE
it { expect(@doc.to_s).to match /Eat things when hungry/ }
it { expect(@doc.to_s).to match /Cucumber/ }
it { expect(@doc.to_s).to match /Whisky/ }
it { expect(@doc.to_s).to match /Big Mac/ }
it { expect(@doc.to_s).not_to match /Things/ }
it { expect(@doc.to_s).not_to match /Good|Evil/ }
it { expect(@doc.to_s).not_to match /type="skipped"/}
end
end
end
end
end
end