spec/unit/library_spec.rb (123 lines of code) (raw):
require "spec_helper"
module Omnibus
describe Library do
#
# Helper method for generating a fake software definition.
#
def generate_software(name, version, dependencies: [],
build_dependencies: [], system_dependencies: [])
software = Software.new(project, "#{name}.rb")
software.name(name)
software.default_version(version)
dependencies.each do |dependency|
software.dependency(dependency)
end
build_dependencies.each do |dependency|
software.build_dependency(dependency)
end
system_dependencies.each do |dependency|
software.system_dependency(dependency)
end
software
end
let(:project) do
Project.new.evaluate do
name "chef-dk"
maintainer "Chef Software, Inc"
homepage "http://getchef.com"
build_version "1.0.0"
install_dir "/opt/chefdk"
system_dependency "libc"
dependency "preparation"
dependency "erchef"
dependency "postgresql"
dependency "ruby"
dependency "chef"
dependency "chefdk"
end
end
let(:library) { Library.new(project) }
let(:bundler) { generate_software("bundler", "1.5.4", dependencies: %w{ruby}) }
let(:curl) { generate_software("curl", "1.5.4", dependencies: %w{openssl zlib}) }
let(:cmake) { generate_software("cmake", "3.28.1") }
let(:chef) { generate_software("chef", "1.0.0", dependencies: %w{bundler ohai ruby}) }
let(:erchef) { generate_software("erchef", "4b19a96d57bff9bbf4764d7323b92a0944009b9e", dependencies: %w{curl erlang rsync}) }
let(:erlang) { generate_software("erlang", "R15B03-1", dependencies: %w{openssl zlib}) }
let(:ncurses) { generate_software("ncurses", "5.9", system_dependencies: %w{libgcc}) }
let(:ohai) { generate_software("ohai", "master", dependencies: %w{ruby rubygems yajl}) }
let(:openssl) { generate_software("openssl", "1.0.1g", dependencies: %w{zlib}) }
let(:postgresql) { generate_software("postgresql", "9.2.8", dependencies: %w{zlib openssl}) }
let(:preparation) { generate_software("preparation", "1.0.0") }
let(:rsync) { generate_software("rsync", "3.0.9") }
let(:ruby) { generate_software("ruby", "1.9.3-p481", dependencies: %w{zlib ncurses}) }
let(:rubygems) { generate_software("rubygems", "1.8.24", dependencies: %w{ruby}) }
let(:skitch) { generate_software("skitch", "4.4.1", dependencies: %w{postgresql}) }
let(:yajl) { generate_software("yajl", "1.1.0", dependencies: %w{rubygems}) }
let(:zlib) { generate_software("zlib", "1.2.6", build_dependencies: %w{cmake}, system_dependencies: %w{libgcc}) }
describe "#component_added" do
it "adds the software to the component list" do
library.component_added(erchef)
expect(library.components).to eql([erchef])
end
it "does not add a component more than once" do
library.component_added(erchef)
library.component_added(erchef)
expect(library.components).to eql([erchef])
end
end
describe "#build_order" do
let(:library) do
library = Library.new(project)
library.component_added(preparation)
library.component_added(erlang)
library.component_added(postgresql) # as a skitch trans dep
library.component_added(skitch)
library.component_added(erchef)
library.component_added(ruby)
library.component_added(chef)
library
end
it "returns an array of software descriptions, with all top level deps first" do
expect(library.build_order).to eq([
preparation,
erlang,
postgresql,
skitch,
ruby,
erchef,
chef,
])
end
context "with a complex dep tree" do
let(:chefdk) { generate_software("chefdk", "1.0.0.alpha", dependencies: %w{bundler ruby}) }
let(:library) do
# This is the LOAD ORDER
library = Library.new(project)
library.component_added(preparation) # via project
library.component_added(erlang) # via erchef
library.component_added(postgresql) # via skitch
library.component_added(skitch) # via erchef
library.component_added(erchef) # erchef
library.component_added(ruby) # via project
library.component_added(bundler) # via chef
library.component_added(ohai) # via chef
library.component_added(chef) # via project
library.component_added(chefdk) # via project
library
end
it "returns an array of software descriptions, with all top level deps first, assuming they are not themselves transitive deps" do
expect(library.build_order).to eql(
[
preparation, # first
erlang, # via erchef project
postgresql, # via skitch transitive
skitch, # via erchef project
ruby, # via bundler transitive
bundler, # via chef
ohai, # via chef
erchef, # project dep
chef, # project dep
chefdk, # project dep
]
)
end
end
end
end
end