Merge pull request #2028 from reitermarkus/spec-migrator
Convert Migrator test to spec.
This commit is contained in:
commit
417afc21a7
264
Library/Homebrew/test/migrator_spec.rb
Normal file
264
Library/Homebrew/test/migrator_spec.rb
Normal file
@ -0,0 +1,264 @@
|
||||
require "migrator"
|
||||
require "test/support/fixtures/testball"
|
||||
require "tab"
|
||||
require "keg"
|
||||
|
||||
describe Migrator do
|
||||
subject { described_class.new(new_formula) }
|
||||
|
||||
let(:new_formula) { Testball.new("newname") }
|
||||
let(:old_formula) { Testball.new("oldname") }
|
||||
|
||||
let(:new_keg_record) { HOMEBREW_CELLAR/"newname/0.1" }
|
||||
let(:old_keg_record) { HOMEBREW_CELLAR/"oldname/0.1" }
|
||||
|
||||
let(:old_tab) { Tab.empty }
|
||||
|
||||
let(:keg) { Keg.new(old_keg_record) }
|
||||
let(:old_pin) { HOMEBREW_PINNED_KEGS/"oldname" }
|
||||
|
||||
before(:each) do |example|
|
||||
allow(new_formula).to receive(:oldname).and_return("oldname")
|
||||
|
||||
# do not create directories for error tests
|
||||
next if example.metadata[:description].start_with?("raises an error")
|
||||
|
||||
(old_keg_record/"bin").mkpath
|
||||
|
||||
%w[inside bindir].each do |file|
|
||||
FileUtils.touch old_keg_record/"bin/#{file}"
|
||||
end
|
||||
|
||||
old_tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
old_tab.source["path"] = "/oldname"
|
||||
old_tab.write
|
||||
|
||||
keg.link
|
||||
keg.optlink
|
||||
|
||||
old_pin.make_relative_symlink old_keg_record
|
||||
|
||||
subject # needs to be evaluated eagerly
|
||||
|
||||
(HOMEBREW_PREFIX/"bin").mkpath
|
||||
end
|
||||
|
||||
after(:each) do
|
||||
if !old_keg_record.parent.symlink? && old_keg_record.directory?
|
||||
keg.unlink
|
||||
end
|
||||
|
||||
if new_keg_record.directory?
|
||||
new_keg = Keg.new(new_keg_record)
|
||||
new_keg.unlink
|
||||
end
|
||||
end
|
||||
|
||||
describe "::new" do
|
||||
it "raises an error if there is no old name" do
|
||||
expect {
|
||||
described_class.new(old_formula)
|
||||
}.to raise_error(Migrator::MigratorNoOldnameError)
|
||||
end
|
||||
|
||||
it "raises an error if there is no old path" do
|
||||
expect {
|
||||
described_class.new(new_formula)
|
||||
}.to raise_error(Migrator::MigratorNoOldpathError)
|
||||
end
|
||||
|
||||
it "raises an error if the Taps differ" do
|
||||
keg = HOMEBREW_CELLAR/"oldname/0.1"
|
||||
keg.mkpath
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["tap"] = "homebrew/core"
|
||||
tab.write
|
||||
|
||||
expect {
|
||||
described_class.new(new_formula)
|
||||
}.to raise_error(Migrator::MigratorDifferentTapsError)
|
||||
end
|
||||
end
|
||||
|
||||
specify "#move_to_new_directory" do
|
||||
keg.unlink
|
||||
shutup do
|
||||
subject.move_to_new_directory
|
||||
end
|
||||
|
||||
expect(new_keg_record).to be_a_directory
|
||||
expect(new_keg_record/"bin").to be_a_directory
|
||||
expect(new_keg_record/"bin/inside").to be_a_file
|
||||
expect(new_keg_record/"bin/bindir").to be_a_file
|
||||
expect(old_keg_record).not_to be_a_directory
|
||||
end
|
||||
|
||||
specify "#backup_oldname_cellar" do
|
||||
old_keg_record.parent.rmtree
|
||||
(new_keg_record/"bin").mkpath
|
||||
|
||||
subject.backup_oldname_cellar
|
||||
|
||||
expect(old_keg_record/"bin").to be_a_directory
|
||||
expect(old_keg_record/"bin").to be_a_directory
|
||||
end
|
||||
|
||||
specify "#repin" do
|
||||
(new_keg_record/"bin").mkpath
|
||||
expected_relative = new_keg_record.relative_path_from HOMEBREW_PINNED_KEGS
|
||||
|
||||
subject.repin
|
||||
|
||||
expect(subject.new_pin_record).to be_a_symlink
|
||||
expect(subject.new_pin_record.readlink).to eq(expected_relative)
|
||||
expect(subject.old_pin_record).not_to exist
|
||||
end
|
||||
|
||||
specify "#unlink_oldname" do
|
||||
expect(HOMEBREW_LINKED_KEGS.children.count).to eq(1)
|
||||
expect((HOMEBREW_PREFIX/"opt").children.count).to eq(1)
|
||||
|
||||
shutup do
|
||||
subject.unlink_oldname
|
||||
end
|
||||
|
||||
expect(HOMEBREW_LINKED_KEGS).not_to exist
|
||||
expect(HOMEBREW_LIBRARY/"bin").not_to exist
|
||||
end
|
||||
|
||||
specify "#link_newname" do
|
||||
keg.unlink
|
||||
keg.uninstall
|
||||
|
||||
(new_keg_record/"bin").mkpath
|
||||
%w[inside bindir].each do |file|
|
||||
FileUtils.touch new_keg_record/"bin"/file
|
||||
end
|
||||
|
||||
shutup do
|
||||
subject.link_newname
|
||||
end
|
||||
|
||||
expect(HOMEBREW_LINKED_KEGS.children.count).to eq(1)
|
||||
expect((HOMEBREW_PREFIX/"opt").children.count).to eq(1)
|
||||
end
|
||||
|
||||
specify "#link_oldname_opt" do
|
||||
new_keg_record.mkpath
|
||||
subject.link_oldname_opt
|
||||
expect((HOMEBREW_PREFIX/"opt/oldname").realpath).to eq(new_keg_record.realpath)
|
||||
end
|
||||
|
||||
specify "#link_oldname_cellar" do
|
||||
(new_keg_record/"bin").mkpath
|
||||
keg.unlink
|
||||
keg.uninstall
|
||||
subject.link_oldname_cellar
|
||||
expect((HOMEBREW_CELLAR/"oldname").realpath).to eq(new_keg_record.parent.realpath)
|
||||
end
|
||||
|
||||
specify "#update_tabs" do
|
||||
(new_keg_record/"bin").mkpath
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"newname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["path"] = "/path/that/must/be/changed/by/update_tabs"
|
||||
tab.write
|
||||
subject.update_tabs
|
||||
expect(Tab.for_keg(new_keg_record).source["path"]).to eq(new_formula.path.to_s)
|
||||
end
|
||||
|
||||
specify "#migrate" do
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["path"] = old_formula.path.to_s
|
||||
tab.write
|
||||
|
||||
shutup do
|
||||
subject.migrate
|
||||
end
|
||||
|
||||
expect(new_keg_record).to exist
|
||||
expect(old_keg_record.parent).to be_a_symlink
|
||||
expect(HOMEBREW_LINKED_KEGS/"oldname").not_to exist
|
||||
expect((HOMEBREW_LINKED_KEGS/"newname").realpath).to eq(new_keg_record.realpath)
|
||||
expect(old_keg_record.realpath).to eq(new_keg_record.realpath)
|
||||
expect((HOMEBREW_PREFIX/"opt/oldname").realpath).to eq(new_keg_record.realpath)
|
||||
expect((HOMEBREW_CELLAR/"oldname").realpath).to eq(new_keg_record.parent.realpath)
|
||||
expect((HOMEBREW_PINNED_KEGS/"newname").realpath).to eq(new_keg_record.realpath)
|
||||
expect(Tab.for_keg(new_keg_record).source["path"]).to eq(new_formula.path.to_s)
|
||||
end
|
||||
|
||||
specify "#unlinik_oldname_opt" do
|
||||
new_keg_record.mkpath
|
||||
old_opt_record = HOMEBREW_PREFIX/"opt/oldname"
|
||||
old_opt_record.unlink if old_opt_record.symlink?
|
||||
old_opt_record.make_relative_symlink(new_keg_record)
|
||||
subject.unlink_oldname_opt
|
||||
expect(old_opt_record).not_to be_a_symlink
|
||||
end
|
||||
|
||||
specify "#unlink_oldname_cellar" do
|
||||
new_keg_record.mkpath
|
||||
keg.unlink
|
||||
keg.uninstall
|
||||
old_keg_record.parent.make_relative_symlink(new_keg_record.parent)
|
||||
subject.unlink_oldname_cellar
|
||||
expect(old_keg_record.parent).not_to be_a_symlink
|
||||
end
|
||||
|
||||
specify "#backup_oldname_cellar" do
|
||||
(new_keg_record/"bin").mkpath
|
||||
keg.unlink
|
||||
keg.uninstall
|
||||
subject.backup_oldname_cellar
|
||||
expect(old_keg_record.subdirs).not_to be_empty
|
||||
end
|
||||
|
||||
specify "#backup_old_tabs" do
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["path"] = "/should/be/the/same"
|
||||
tab.write
|
||||
migrator = Migrator.new(new_formula)
|
||||
tab.tabfile.delete
|
||||
migrator.backup_old_tabs
|
||||
expect(Tab.for_keg(old_keg_record).source["path"]).to eq("/should/be/the/same")
|
||||
end
|
||||
|
||||
describe "#backup_oldname" do
|
||||
after(:each) do
|
||||
expect(old_keg_record.parent).to be_a_directory
|
||||
expect(old_keg_record.parent.subdirs).not_to be_empty
|
||||
expect(HOMEBREW_LINKED_KEGS/"oldname").to exist
|
||||
expect(HOMEBREW_PREFIX/"opt/oldname").to exist
|
||||
expect(HOMEBREW_PINNED_KEGS/"oldname").to be_a_symlink
|
||||
expect(keg).to be_linked
|
||||
end
|
||||
|
||||
context "when cellar exists" do
|
||||
it "backs up the old name" do
|
||||
subject.backup_oldname
|
||||
end
|
||||
end
|
||||
|
||||
context "when cellar is removed" do
|
||||
it "backs up the old name" do
|
||||
(new_keg_record/"bin").mkpath
|
||||
keg.unlink
|
||||
keg.uninstall
|
||||
subject.backup_oldname
|
||||
end
|
||||
end
|
||||
|
||||
context "when cellar is linked" do
|
||||
it "backs up the old name" do
|
||||
(new_keg_record/"bin").mkpath
|
||||
keg.unlink
|
||||
keg.uninstall
|
||||
old_keg_record.parent.make_relative_symlink(new_keg_record.parent)
|
||||
subject.backup_oldname
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,251 +0,0 @@
|
||||
require "testing_env"
|
||||
require "migrator"
|
||||
require "test/support/fixtures/testball"
|
||||
require "tab"
|
||||
require "keg"
|
||||
|
||||
class Formula
|
||||
attr_writer :oldname
|
||||
end
|
||||
|
||||
class MigratorErrorsTests < Homebrew::TestCase
|
||||
def setup
|
||||
super
|
||||
@new_f = Testball.new("newname")
|
||||
@new_f.oldname = "oldname"
|
||||
@old_f = Testball.new("oldname")
|
||||
end
|
||||
|
||||
def test_no_oldname
|
||||
assert_raises(Migrator::MigratorNoOldnameError) { Migrator.new(@old_f) }
|
||||
end
|
||||
|
||||
def test_no_oldpath
|
||||
assert_raises(Migrator::MigratorNoOldpathError) { Migrator.new(@new_f) }
|
||||
end
|
||||
|
||||
def test_different_taps
|
||||
keg = HOMEBREW_CELLAR/"oldname/0.1"
|
||||
keg.mkpath
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["tap"] = "homebrew/core"
|
||||
tab.write
|
||||
assert_raises(Migrator::MigratorDifferentTapsError) { Migrator.new(@new_f) }
|
||||
end
|
||||
end
|
||||
|
||||
class MigratorTests < Homebrew::TestCase
|
||||
include FileUtils
|
||||
|
||||
def setup
|
||||
super
|
||||
|
||||
@new_f = Testball.new("newname")
|
||||
@new_f.oldname = "oldname"
|
||||
|
||||
@old_f = Testball.new("oldname")
|
||||
|
||||
@old_keg_record = HOMEBREW_CELLAR/"oldname/0.1"
|
||||
@old_keg_record.join("bin").mkpath
|
||||
@new_keg_record = HOMEBREW_CELLAR/"newname/0.1"
|
||||
|
||||
%w[inside bindir].each { |file| touch @old_keg_record.join("bin", file) }
|
||||
|
||||
@old_tab = Tab.empty
|
||||
@old_tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
@old_tab.source["path"] = "/oldname"
|
||||
@old_tab.write
|
||||
|
||||
@keg = Keg.new(@old_keg_record)
|
||||
@keg.link
|
||||
@keg.optlink
|
||||
|
||||
@old_pin = HOMEBREW_PINNED_KEGS/"oldname"
|
||||
@old_pin.make_relative_symlink @old_keg_record
|
||||
|
||||
@migrator = Migrator.new(@new_f)
|
||||
|
||||
mkpath HOMEBREW_PREFIX/"bin"
|
||||
end
|
||||
|
||||
def teardown
|
||||
if !@old_keg_record.parent.symlink? && @old_keg_record.directory?
|
||||
@keg.unlink
|
||||
end
|
||||
|
||||
if @new_keg_record.directory?
|
||||
new_keg = Keg.new(@new_keg_record)
|
||||
new_keg.unlink
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def test_move_cellar
|
||||
@keg.unlink
|
||||
shutup { @migrator.move_to_new_directory }
|
||||
assert_predicate @new_keg_record, :directory?
|
||||
assert_predicate @new_keg_record/"bin", :directory?
|
||||
assert_predicate @new_keg_record/"bin/inside", :file?
|
||||
assert_predicate @new_keg_record/"bin/bindir", :file?
|
||||
refute_predicate @old_keg_record, :directory?
|
||||
end
|
||||
|
||||
def test_backup_cellar
|
||||
@old_keg_record.parent.rmtree
|
||||
@new_keg_record.join("bin").mkpath
|
||||
|
||||
@migrator.backup_oldname_cellar
|
||||
|
||||
assert_predicate @old_keg_record, :directory?
|
||||
assert_predicate @old_keg_record/"bin", :directory?
|
||||
end
|
||||
|
||||
def test_repin
|
||||
@new_keg_record.join("bin").mkpath
|
||||
expected_relative = @new_keg_record.relative_path_from HOMEBREW_PINNED_KEGS
|
||||
|
||||
@migrator.repin
|
||||
|
||||
assert_predicate @migrator.new_pin_record, :symlink?
|
||||
assert_equal expected_relative, @migrator.new_pin_record.readlink
|
||||
refute_predicate @migrator.old_pin_record, :exist?
|
||||
end
|
||||
|
||||
def test_unlink_oldname
|
||||
assert_equal 1, HOMEBREW_LINKED_KEGS.children.size
|
||||
assert_equal 1, (HOMEBREW_PREFIX/"opt").children.size
|
||||
|
||||
shutup { @migrator.unlink_oldname }
|
||||
|
||||
refute_predicate HOMEBREW_LINKED_KEGS, :exist?
|
||||
refute_predicate HOMEBREW_LIBRARY/"bin", :exist?
|
||||
end
|
||||
|
||||
def test_link_newname
|
||||
@keg.unlink
|
||||
@keg.uninstall
|
||||
@new_keg_record.join("bin").mkpath
|
||||
%w[inside bindir].each { |file| touch @new_keg_record.join("bin", file) }
|
||||
|
||||
shutup { @migrator.link_newname }
|
||||
|
||||
assert_equal 1, HOMEBREW_LINKED_KEGS.children.size
|
||||
assert_equal 1, (HOMEBREW_PREFIX/"opt").children.size
|
||||
end
|
||||
|
||||
def test_link_oldname_opt
|
||||
@new_keg_record.mkpath
|
||||
@migrator.link_oldname_opt
|
||||
assert_equal @new_keg_record.realpath, (HOMEBREW_PREFIX/"opt/oldname").realpath
|
||||
end
|
||||
|
||||
def test_link_oldname_cellar
|
||||
@new_keg_record.join("bin").mkpath
|
||||
@keg.unlink
|
||||
@keg.uninstall
|
||||
@migrator.link_oldname_cellar
|
||||
assert_equal @new_keg_record.parent.realpath, (HOMEBREW_CELLAR/"oldname").realpath
|
||||
end
|
||||
|
||||
def test_update_tabs
|
||||
@new_keg_record.join("bin").mkpath
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"newname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["path"] = "/path/that/must/be/changed/by/update_tabs"
|
||||
tab.write
|
||||
@migrator.update_tabs
|
||||
assert_equal @new_f.path.to_s, Tab.for_keg(@new_keg_record).source["path"]
|
||||
end
|
||||
|
||||
def test_migrate
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["path"] = @old_f.path.to_s
|
||||
tab.write
|
||||
|
||||
shutup { @migrator.migrate }
|
||||
|
||||
assert_predicate @new_keg_record, :exist?
|
||||
assert_predicate @old_keg_record.parent, :symlink?
|
||||
refute_predicate HOMEBREW_LINKED_KEGS/"oldname", :exist?
|
||||
assert_equal @new_keg_record.realpath, (HOMEBREW_LINKED_KEGS/"newname").realpath
|
||||
assert_equal @new_keg_record.realpath, @old_keg_record.realpath
|
||||
assert_equal @new_keg_record.realpath, (HOMEBREW_PREFIX/"opt/oldname").realpath
|
||||
assert_equal @new_keg_record.parent.realpath, (HOMEBREW_CELLAR/"oldname").realpath
|
||||
assert_equal @new_keg_record.realpath, (HOMEBREW_PINNED_KEGS/"newname").realpath
|
||||
assert_equal @new_f.path.to_s, Tab.for_keg(@new_keg_record).source["path"]
|
||||
end
|
||||
|
||||
def test_unlinik_oldname_opt
|
||||
@new_keg_record.mkpath
|
||||
old_opt_record = HOMEBREW_PREFIX/"opt/oldname"
|
||||
old_opt_record.unlink if old_opt_record.symlink?
|
||||
old_opt_record.make_relative_symlink(@new_keg_record)
|
||||
@migrator.unlink_oldname_opt
|
||||
refute_predicate old_opt_record, :symlink?
|
||||
end
|
||||
|
||||
def test_unlink_oldname_cellar
|
||||
@new_keg_record.mkpath
|
||||
@keg.unlink
|
||||
@keg.uninstall
|
||||
@old_keg_record.parent.make_relative_symlink(@new_keg_record.parent)
|
||||
@migrator.unlink_oldname_cellar
|
||||
refute_predicate @old_keg_record.parent, :symlink?
|
||||
end
|
||||
|
||||
def test_backup_oldname_cellar
|
||||
@new_keg_record.join("bin").mkpath
|
||||
@keg.unlink
|
||||
@keg.uninstall
|
||||
@migrator.backup_oldname_cellar
|
||||
refute_predicate @old_keg_record.subdirs, :empty?
|
||||
end
|
||||
|
||||
def test_backup_old_tabs
|
||||
tab = Tab.empty
|
||||
tab.tabfile = HOMEBREW_CELLAR/"oldname/0.1/INSTALL_RECEIPT.json"
|
||||
tab.source["path"] = "/should/be/the/same"
|
||||
tab.write
|
||||
migrator = Migrator.new(@new_f)
|
||||
tab.tabfile.delete
|
||||
migrator.backup_old_tabs
|
||||
assert_equal "/should/be/the/same", Tab.for_keg(@old_keg_record).source["path"]
|
||||
end
|
||||
|
||||
# Backup tests are divided into three groups: when oldname Cellar is deleted
|
||||
# and when it still exists and when it's a symlink
|
||||
|
||||
def check_after_backup
|
||||
assert_predicate @old_keg_record.parent, :directory?
|
||||
refute_predicate @old_keg_record.parent.subdirs, :empty?
|
||||
assert_predicate HOMEBREW_LINKED_KEGS/"oldname", :exist?
|
||||
assert_predicate HOMEBREW_PREFIX/"opt/oldname", :exist?
|
||||
assert_predicate HOMEBREW_PINNED_KEGS/"oldname", :symlink?
|
||||
assert_predicate @keg, :linked?
|
||||
end
|
||||
|
||||
def test_backup_cellar_exist
|
||||
@migrator.backup_oldname
|
||||
check_after_backup
|
||||
end
|
||||
|
||||
def test_backup_cellar_removed
|
||||
@new_keg_record.join("bin").mkpath
|
||||
@keg.unlink
|
||||
@keg.uninstall
|
||||
@migrator.backup_oldname
|
||||
check_after_backup
|
||||
end
|
||||
|
||||
def test_backup_cellar_linked
|
||||
@new_keg_record.join("bin").mkpath
|
||||
@keg.unlink
|
||||
@keg.uninstall
|
||||
@old_keg_record.parent.make_relative_symlink(@new_keg_record.parent)
|
||||
@migrator.backup_oldname
|
||||
check_after_backup
|
||||
end
|
||||
end
|
||||
Loading…
x
Reference in New Issue
Block a user