brew/Library/Homebrew/test/test_updater.rb
Martin Afanasjew 1288e3110d update: always report changes to branch 'master'
If the user's working copy is *not* on the 'master' branch, the revision
recorded after the update to the 'master' branch is not the one of the
updated 'master' branch but that of whatever the user's current branch
is. This tends to be not very helpful.

This change records the revision *after* the update to the 'master'
branch, but *before* switching back to the user's current branch prior
to the update, effectively causing the report to show changes to the
'master' branch.

Closes Homebrew/homebrew#42074.

Signed-off-by: Mike McQuaid <mike@mikemcquaid.com>
2015-08-27 13:53:28 +01:00

133 lines
4.0 KiB
Ruby

require "testing_env"
require "cmd/update"
require "formula_versions"
require "yaml"
class UpdaterTests < Homebrew::TestCase
class UpdaterMock < ::Updater
attr_accessor :diff, :expected, :called
def initialize(*)
super
@outputs = Hash.new { |h, k| h[k] = [] }
@expected = []
@called = []
end
def in_repo_expect(cmd, output = "")
@expected << cmd
@outputs[cmd] << output
end
def `(*args)
cmd = args.join(" ")
if @expected.include?(cmd) && !@outputs[cmd].empty?
@called << cmd
@outputs[cmd].shift
else
raise "#{inspect} unexpectedly called backticks: `#{cmd}`"
end
end
alias_method :safe_system, :`
alias_method :system, :`
def inspect
"#<#{self.class.name}>"
end
end
def fixture(name)
self.class.fixture_data[name] || ""
end
def self.fixture_data
@fixture_data ||= YAML.load_file("#{TEST_DIRECTORY}/fixtures/updater_fixture.yaml")
end
def setup
@updater = UpdaterMock.new(HOMEBREW_REPOSITORY)
@report = Report.new
end
def teardown
FileUtils.rm_rf HOMEBREW_LIBRARY.join("Taps")
end
def perform_update(fixture_name = "")
Formulary.stubs(:factory).returns(stub(:pkg_version => "1.0"))
FormulaVersions.stubs(:new).returns(stub(:formula_at_revision => "2.0"))
@updater.diff = fixture(fixture_name)
@updater.in_repo_expect("git diff --quiet", true)
@updater.in_repo_expect("git symbolic-ref --short HEAD", "master")
@updater.in_repo_expect("git rev-parse -q --verify HEAD", "1234abcd")
@updater.in_repo_expect("git config core.autocrlf false")
@updater.in_repo_expect("git pull --quiet origin refs/heads/master:refs/remotes/origin/master")
@updater.in_repo_expect("git rev-parse -q --verify HEAD", "3456cdef")
@updater.pull!(:silent => true)
@updater.in_repo_expect("git rev-parse -q --verify HEAD", "3456cdef")
@report.update(@updater.report)
assert_equal @updater.expected, @updater.called
end
def test_update_homebrew_without_any_changes
perform_update
assert_empty @report
end
def test_update_homebrew_without_formulae_changes
perform_update("update_git_diff_output_without_formulae_changes")
assert_empty @report.select_formula(:M)
assert_empty @report.select_formula(:A)
assert_empty @report.select_formula(:D)
end
def test_update_homebrew_with_formulae_changes
perform_update("update_git_diff_output_with_formulae_changes")
assert_equal %w[xar yajl], @report.select_formula(:M)
assert_equal %w[antiword bash-completion ddrescue dict lua], @report.select_formula(:A)
end
def test_update_homebrew_with_removed_formulae
perform_update("update_git_diff_output_with_removed_formulae")
assert_equal %w[libgsasl], @report.select_formula(:D)
end
def test_update_homebrew_with_changed_filetype
perform_update("update_git_diff_output_with_changed_filetype")
end
def test_update_homebrew_with_restructured_tap
repo = HOMEBREW_LIBRARY.join("Taps", "foo", "bar")
@updater = UpdaterMock.new(repo)
repo.join("Formula").mkpath
perform_update("update_git_diff_output_with_restructured_tap")
assert_equal %w[foo/bar/git foo/bar/lua], @report.select_formula(:A)
assert_empty @report.select_formula(:D)
end
def test_update_homebrew_simulate_homebrew_php_restructuring
repo = HOMEBREW_LIBRARY.join("Taps", "foo", "bar")
@updater = UpdaterMock.new(repo)
repo.join("Formula").mkpath
perform_update("update_git_diff_simulate_homebrew_php_restructuring")
assert_empty @report.select_formula(:A)
assert_equal %w[foo/bar/git foo/bar/lua], @report.select_formula(:D)
end
def test_update_homebrew_with_tap_formulae_changes
repo = HOMEBREW_LIBRARY.join("Taps", "foo", "bar")
@updater = UpdaterMock.new(repo)
repo.join("Formula").mkpath
perform_update("update_git_diff_output_with_tap_formulae_changes")
assert_equal %w[foo/bar/lua], @report.select_formula(:A)
assert_equal %w[foo/bar/git], @report.select_formula(:M)
assert_empty @report.select_formula(:D)
end
end