spec/unit/build_version_dsl_spec.rb (123 lines of code) (raw):
require "spec_helper"
module Omnibus
describe BuildVersionDSL do
let(:subject_with_version) { described_class.new(version_string) }
let(:subject_with_description) { described_class.new(&description) }
let(:version_string) { "1.0.0" }
let(:description) { nil }
let(:today_string) { Time.now.utc.strftime(Omnibus::BuildVersion::TIMESTAMP_FORMAT) }
let(:zoo_version) { double("BuildVersion", semver: "5.5.5", custom: "7.7.7", build_start_time: today_string) }
let(:zoo_software) { double("software", name: "zoo", project_dir: "/etc/zoo", version: "6.6.6") }
describe "when given nil" do
it "fails" do
expect { subject.build_version }.to raise_error(RuntimeError)
end
end
describe "when given a string" do
it "sets the version to the string" do
expect(subject_with_version.build_version).to eq("1.0.0")
end
end
describe "when Config.append_timestamp is true" do
let(:description) do
proc do
source(:git, from_dependency: "zoo")
end
end
before { Config.append_timestamp(true) }
it "appends a timestamp to a static (String) version" do
expect(subject_with_version.build_version).to eq("1.0.0+#{today_string}")
end
it "doesn't append timestamp to something that already looks like it has a timestamp" do
semver = "1.0.0+#{today_string}.git.222.694b062"
expect(described_class.new(semver).build_version).to eq("1.0.0+#{today_string}.git.222.694b062")
end
it "appends a timestamp to a DSL-built version" do
allow(BuildVersion).to receive(:new).and_return(BuildVersion.new)
allow(BuildVersion).to receive(:new).with("/etc/zoo").and_return(zoo_version)
subject_with_description.resolve(zoo_software)
expect(subject_with_description.build_version).to eq("5.5.5+#{today_string}")
end
end
describe "when given a :git source" do
describe "when given a software as source" do
let(:description) do
proc do
source(:git, from_dependency: "zoo")
end
end
describe "before resolving version" do
it "mentions the version is not ready yet" do
expect(subject_with_description.explain).to match(/will be determined/)
end
it "includes the dependency name in the message" do
expect(subject_with_description.explain).to match(/zoo/)
end
end
describe "after resolving version" do
before do
expect(BuildVersion).to receive(:new).with("/etc/zoo").and_return(zoo_version)
subject_with_description.resolve(zoo_software)
end
it "creates the version with path from source with semver" do
expect(subject_with_description.explain).to eq("Build Version: 5.5.5")
end
end
end
describe "when not given a software as source" do
let(:description) do
proc { source(:git) }
end
it "creates the version with default path as semver" do
expect(BuildVersion).to receive(:new).with(no_args).and_return(zoo_version)
expect(subject_with_description.build_version).to eq("5.5.5")
end
end
describe "when given an output format" do
let(:description) do
proc do
source(:git)
output_format(:custom)
end
end
it "outputs the version with given function" do
expect(BuildVersion).to receive(:new).with(no_args).and_return(zoo_version)
expect(subject_with_description.build_version).to eq("7.7.7")
end
end
end
describe "when given a :version source" do
describe "when given a software as source" do
let(:description) do
proc do
source(:version, from_dependency: "zoo")
end
end
it "creates the version with version from source" do
subject_with_description.resolve(zoo_software)
expect(subject_with_description.build_version).to eq("6.6.6")
end
end
describe "when not given a software as source" do
let(:description) do
proc do
source(:version)
end
end
it "fails" do
expect { subject_with_description.build_version }.to raise_error(RuntimeError)
end
end
end
describe "when given an unknown source" do
let(:description) do
proc do
source(:park)
end
end
it "fails" do
expect { subject_with_description.build_version }.to raise_error(RuntimeError)
end
end
end
end