Skip to content
Snippets Groups Projects
Commit 69f36108 authored by Markus Reiter's avatar Markus Reiter
Browse files

Convert Migrator test to spec.

parent f8d49dbe
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