spec/unit/packagers/base_spec.rb (129 lines of code) (raw):
require "stringio"
module Omnibus
describe Packager::Base do
let(:project) do
Project.new.tap do |project|
project.name("project")
project.install_dir(File.join(tmp_path, "opt/project"))
project.homepage("https://example.com")
project.build_version("1.2.3")
project.build_iteration("2")
project.maintainer("Chef Software")
end
end
before do
# Force the Dir.mktmpdir call on staging_dir
allow(Dir).to receive(:mktmpdir).and_return(File.join(tmp_path, "tmp/dir"))
Config.package_dir(tmp_path)
end
subject { described_class.new(project) }
it "includes Cleanroom" do
expect(subject).to be_a(Cleanroom)
end
it "includes Digestable" do
expect(subject).to be_a(Digestable)
end
it "includes Logging" do
expect(subject).to be_a(Logging)
end
it "includes NullArgumentable" do
expect(subject).to be_a(NullArgumentable)
end
it "includes Templating" do
expect(subject).to be_a(Templating)
end
it "includes Util" do
expect(subject).to be_a(Util)
end
describe ".id" do
it "defines the id method on the instance" do
described_class.id(:base)
expect(subject.id).to eq(:base)
end
end
describe ".setup" do
it "sets the value of the block" do
block = proc {}
described_class.setup(&block)
expect(described_class.setup).to eq(block)
end
end
describe ".build" do
it "sets the value of the block" do
block = proc {}
described_class.build(&block)
expect(described_class.build).to eq(block)
end
end
describe "#install_dir" do
it "is a DSL method" do
expect(subject).to have_exposed_method(:install_dir)
end
it "returns the project instances install_dir" do
expect(subject.install_dir).to eq(project.install_dir)
end
end
describe "#windows_safe_path" do
it "is a DSL method" do
expect(subject).to have_exposed_method(:windows_safe_path)
end
end
describe "#skip_packager" do
it "is a DSL method" do
expect(subject).to have_exposed_method(:skip_packager)
end
it "requires the value to be a TrueClass or a FalseClass" do
expect do
subject.skip_packager(Object.new)
end.to raise_error(InvalidValue)
end
it "returns the given value" do
subject.skip_packager(true)
expect(subject.skip_packager).to be_truthy
end
end
describe "#run!" do
before do
allow(subject).to receive(:remove_directory)
allow(Metadata).to receive(:generate)
allow(described_class).to receive(:setup).and_return(proc {})
allow(described_class).to receive(:build).and_return(proc {})
allow(subject).to receive(:package_name).and_return("foo")
end
it "calls the methods in order" do
expect(described_class).to receive(:setup).ordered
expect(described_class).to receive(:build).ordered
subject.run!
end
end
describe "#staging_dir" do
it "creates a temporary directory" do
expect(Dir).to receive(:mktmpdir)
subject.send(:staging_dir)
end
end
describe "#resource_path" do
let(:id) { :base }
before { allow(subject).to receive(:id).and_return(id) }
context "when a local resource exists" do
let(:resources_path) { File.join(tmp_path, "/resources/path") }
before do
project.resources_path(resources_path)
allow(File).to receive(:exist?)
.with(/#{resources_path}/)
.and_return(true)
end
it "returns the local path" do
expect(subject.resource_path("foo/bar.erb")).to eq("#{resources_path}/#{id}/foo/bar.erb")
end
it "returns the path with the id" do
expect(subject.resources_path).to eq("#{resources_path}/#{id}")
end
end
context "when a local resource does not exist" do
it "returns the remote path" do
expect(subject.resource_path("foo/bar.erb")).to eq("#{Omnibus.source_root.join("resources/#{id}/foo/bar.erb")}")
end
end
end
end
end