Add RSpec support for integration commands.

This commit is contained in:
Markus Reiter 2017-02-15 19:20:38 +01:00
parent b6a161bc67
commit 8bb46baebb
2 changed files with 95 additions and 0 deletions

View File

@ -16,6 +16,7 @@ require "tap"
require "test/support/helper/shutup"
require "test/support/helper/fixtures"
require "test/support/helper/spec/shared_context/integration_test"
TEST_DIRECTORIES = [
CoreTap.instance.path/"Formula",

View File

@ -0,0 +1,94 @@
require "rspec"
require "open3"
RSpec::Matchers.define_negated_matcher :not_to_output, :output
RSpec::Matchers.define_negated_matcher :be_a_failure, :be_a_success
RSpec.shared_context "integration test" do
extend RSpec::Matchers::DSL
matcher :be_a_success do
match do |actual|
status = actual.is_a?(Proc) ? actual.call : actual
status.respond_to?(:success?) && status.success?
end
def supports_block_expectations?
true
end
# It needs to be nested like this:
#
# expect {
# expect {
# # command
# }.to be_a_success
# }.to output(something).to_stdout
#
# rather than this:
#
# expect {
# expect {
# # command
# }.to output(something).to_stdout
# }.to be_a_success
#
def expects_call_stack_jump?
true
end
end
before(:each) do
(HOMEBREW_PREFIX/"bin").mkpath
FileUtils.touch HOMEBREW_PREFIX/"bin/brew"
end
after(:each) do
FileUtils.rm HOMEBREW_PREFIX/"bin/brew"
FileUtils.rmdir HOMEBREW_PREFIX/"bin"
end
# Generate unique ID to be able to
# properly merge coverage results.
def command_id_from_args(args)
@command_count ||= 0
pretty_args = args.join(" ").gsub(TEST_TMPDIR, "@TMPDIR@")
file_and_line = caller[1].sub(/(.*\d+):.*/, '\1')
.sub("#{HOMEBREW_LIBRARY_PATH}/test/", "")
"#{file_and_line}:brew #{pretty_args}:#{@command_count += 1}"
end
# Runs a `brew` command with the test configuration
# and with coverage reporting enabled.
def brew(*args)
env = args.last.is_a?(Hash) ? args.pop : {}
env.merge!(
"HOMEBREW_BREW_FILE" => HOMEBREW_PREFIX/"bin/brew",
"HOMEBREW_INTEGRATION_TEST" => command_id_from_args(args),
"HOMEBREW_TEST_TMPDIR" => TEST_TMPDIR,
"HOMEBREW_DEVELOPER" => ENV["HOMEBREW_DEVELOPER"],
)
ruby_args = [
"-W0",
"-I", "#{HOMEBREW_LIBRARY_PATH}/test/support/lib",
"-I", HOMEBREW_LIBRARY_PATH.to_s,
"-rconfig"
]
ruby_args << "-rsimplecov" if ENV["HOMEBREW_TESTS_COVERAGE"]
ruby_args << "-rtest/support/helper/integration_mocks"
ruby_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s
Bundler.with_original_env do
stdout, stderr, status = Open3.capture3(env, RUBY_PATH, *ruby_args, *args)
$stdout.print stdout
$stderr.print stderr
status
end
end
end
RSpec.configure do |config|
config.include_context "integration test", :integration_test
end