Skip to content
Snippets Groups Projects
Commit 417afc21 authored by Markus Reiter's avatar Markus Reiter Committed by GitHub
Browse files

Merge pull request #2028 from reitermarkus/spec-migrator

Convert Migrator test to spec.
parents c68d84d6 69f36108
No related branches found
No related tags found
No related merge requests found
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
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment