spec/unit/manifest_spec.rb (130 lines of code) (raw):
require "spec_helper"
require "omnibus/manifest"
require "omnibus/manifest_entry"
module Omnibus
describe Manifest do
subject { described_class.new }
describe "#add" do
it "stores manifest entries" do
me = ManifestEntry.new("womabt", {})
expect { subject.add("wombat", me) }.to_not raise_error
end
it "raises an error if it isn't given a ManifestEntry" do
expect { subject.add("foobar", {}) }.to raise_error Manifest::NotAManifestEntry
end
end
describe "#entry_for" do
it "returns a ManifestEntry for the requested software" do
me = ManifestEntry.new("foobar", {})
subject.add("foobar", me)
expect(subject.entry_for(:foobar)).to eq(me)
end
it "raises an error if no such manifest entry exists" do
expect { subject.entry_for("non-existant-entry") }.to raise_error Manifest::MissingManifestEntry
end
end
describe "#each" do
it "yields each item to the block" do
first = ManifestEntry.new("foobar", {})
second = ManifestEntry.new("wombat", {})
subject.add("foobar", first)
subject.add("wombat", second)
expect { |b| subject.each(&b) }.to yield_successive_args(first, second)
end
end
describe "#entry_names" do
it "returns an array of software names present in the manifest" do
first = ManifestEntry.new("foobar", {})
second = ManifestEntry.new("wombat", {})
subject.add("foobar", first)
subject.add("wombat", second)
expect(subject.entry_names).to eq(%i{foobar wombat})
end
end
describe "#to_hash" do
it "returns a Hash containg the current manifest format" do
expect(subject.to_hash[:manifest_format]).to eq(Manifest::LATEST_MANIFEST_FORMAT)
end
it "includes entries for software in the manifest" do
subject.add("foobar", ManifestEntry.new("foobar", {}))
expect(subject.to_hash[:software]).to have_key(:foobar)
end
it "converts the manifest entries to hashes" do
subject.add("foobar", ManifestEntry.new("foobar", {}))
expect(subject.to_hash[:software][:foobar]).to be_a(Hash)
end
it "returns a build_version if one was passed in" do
expect(Omnibus::Manifest.new("1.2.3").to_hash[:build_version]).to eq("1.2.3")
end
it "returns a build_git_revision if one was passed in" do
expect(Omnibus::Manifest.new("1.2.3", "e8e8e8").to_hash[:build_git_revision]).to eq("e8e8e8")
end
it "returns a license if one was passed in" do
expect(Omnibus::Manifest.new("1.2.3", "e8e8e8", "Apache").to_hash[:license]).to eq("Apache")
end
end
describe "#from_hash" do
let(:manifest) do
{ manifest_format: 1,
build_version: "12.4.0+20150629082811",
build_git_revision: "2e763ac957b308ba95cef256c2491a5a55a163cc",
software: {
zlib: {
locked_source: {
url: "an_url",
},
locked_version: "new.newer",
source_type: "url",
described_version: "new.newer",
},
},
}
end
it "has a build_version" do
expect(Manifest.from_hash(manifest).build_version).to eq("12.4.0+20150629082811")
end
it "has a build_git_revision" do
expect(Manifest.from_hash(manifest).build_git_revision).to eq("2e763ac957b308ba95cef256c2491a5a55a163cc")
end
it "returns a manifest from a hash" do
expect(Manifest.from_hash(manifest)).to be_a(Manifest)
end
it "normalizes the source to use symbols" do
expect(Manifest.from_hash(manifest).entry_for(:zlib).locked_source).to eq({ url: "an_url" })
end
context "v2 manifest" do
let(:manifest) do
{ manifest_format: 2,
build_version: "12.4.0+20150629082811",
build_git_revision: "2e763ac957b308ba95cef256c2491a5a55a163cc",
license: "Unspecified",
software: {
zlib: {
locked_source: {
url: "an_url",
},
locked_version: "new.newer",
source_type: "url",
described_version: "new.newer",
license: "Zlib",
},
},
}
end
it "has a license" do
expect(Manifest.from_hash(manifest).license).to eq("Unspecified")
end
end
context "unsupported manifest" do
let(:manifest) do
{
manifest_format: 99,
}
end
it "raises an error if it doesn't recognize the manifest version" do
expect { Manifest.from_hash(manifest) }.to raise_error Manifest::InvalidManifestFormat
end
end
end
end
end