# frozen_string_literal: true require 'cucumber/formatter/rerun' require 'cucumber/core' require 'cucumber/core/gherkin/writer' require 'support/standard_step_actions' require 'cucumber/configuration' require 'support/fake_objects' module Cucumber module Formatter describe Rerun do include Cucumber::Core::Gherkin::Writer include Cucumber::Core let(:config) { Cucumber::Configuration.new(out_stream: io) } let(:io) { StringIO.new } # after_test_case context 'when 2 scenarios fail in the same file' do it 'Prints the locations of the failed scenarios' do gherkin = gherkin('foo.feature') do feature do scenario do step 'failing' end scenario do step 'failing' end scenario do step 'passing' end end end Rerun.new(config) execute [gherkin], [StandardStepActions.new], config.event_bus config.event_bus.test_run_finished expect(io.string).to eq 'foo.feature:3:6' end end context 'with failures in multiple files' do it 'prints the location of the failed scenarios in each file' do foo = gherkin('foo.feature') do feature do scenario do step 'failing' end scenario do step 'failing' end scenario do step 'passing' end end end bar = gherkin('bar.feature') do feature do scenario do step 'failing' end end end Rerun.new(config) execute [foo, bar], [StandardStepActions.new], config.event_bus config.event_bus.test_run_finished expect(io.string).to eq "foo.feature:3:6\nbar.feature:3" end end context 'when there are no failing scenarios' do it 'prints nothing' do gherkin = gherkin('foo.feature') do feature do scenario do step 'passing' end end end Rerun.new(config) execute [gherkin], [StandardStepActions.new], config.event_bus config.event_bus.test_run_finished expect(io.string).to eq '' end end context 'with only a flaky scenarios' do context 'with option --no-strict-flaky' do it 'prints nothing' do gherkin = gherkin('foo.feature') do feature do scenario do step 'flaky' end end end Rerun.new(config) execute [gherkin], [FakeObjects::FlakyStepActions.new], config.event_bus config.event_bus.test_run_finished expect(io.string).to eq '' end end context 'with option --strict-flaky' do let(:config) { Configuration.new(out_stream: io, strict: Core::Test::Result::StrictConfiguration.new([:flaky])) } it 'prints the location of the flaky scenario' do foo = gherkin('foo.feature') do feature do scenario do step 'flaky' end end end Rerun.new(config) execute [foo], [FakeObjects::FlakyStepActions.new], config.event_bus config.event_bus.test_run_finished expect(io.string).to eq 'foo.feature:3' end it 'does not include retried failing scenarios more than once' do foo = gherkin('foo.feature') do feature do scenario do step 'failing' end end end Rerun.new(config) execute [foo, foo], [StandardStepActions.new], config.event_bus config.event_bus.test_run_finished expect(io.string).to eq 'foo.feature:3' end end end end end end