# frozen_string_literal: true require 'spec_helper' require 'yaml' module Cucumber module Cli describe Main do before(:each) do allow(File).to receive(:exist?) { false } # When Configuration checks for cucumber.yml allow(Dir).to receive(:[]) { [] } # to prevent cucumber's features dir to being laoded end let(:args) { [] } let(:stdout) { StringIO.new } let(:stderr) { StringIO.new } let(:kernel) { double(:kernel) } subject { Main.new(args, stdout, stderr, kernel) } describe '#execute!' do context 'passed an existing runtime' do let(:existing_runtime) { double('runtime').as_null_object } def do_execute subject.execute!(existing_runtime) end it 'configures that runtime' do expected_configuration = double('Configuration').as_null_object allow(Configuration).to receive(:new) { expected_configuration } expect(existing_runtime).to receive(:configure).with(expected_configuration) expect(kernel).to receive(:exit).with(1) do_execute end it 'uses that runtime for running and reporting results' do expected_results = double('results', failure?: true) expect(existing_runtime).to receive(:run!) allow(existing_runtime).to receive(:results) { expected_results } expect(kernel).to receive(:exit).with(1) do_execute end end context 'interrupted with ctrl-c' do after do Cucumber.wants_to_quit = false end it 'exits with error code' do results = double('results', failure?: false) allow_any_instance_of(Runtime).to receive(:run!) allow_any_instance_of(Runtime).to receive(:results) { results } Cucumber.wants_to_quit = true expect(kernel).to receive(:exit).with(2) subject.execute! end end end [ProfilesNotDefinedError, YmlLoadError, ProfileNotFound].each do |exception_klass| it "rescues #{exception_klass}, prints the message to the error stream" do configuration = double('configuration') allow(Configuration).to receive(:new) { configuration } allow(configuration).to receive(:parse!).and_raise(exception_klass.new('error message')) allow(kernel).to receive(:exit).with(2) subject.execute! expect(stderr.string).to eq "error message\n" end end end end end