spec/unit/changelogprinter_spec.rb (120 lines of code) (raw):
require "spec_helper"
require "omnibus/changelog_printer"
require "omnibus/manifest_diff"
module Omnibus
describe ChangeLogPrinter do
describe "#print" do
def manifest_entry_for(name, dv, lv, source_type = :local)
Omnibus::ManifestEntry.new(name, { described_version: dv,
locked_version: lv,
locked_source: {
git: "git://#{name}@example.com" },
source_type: source_type,
})
end
let(:changelog) do
double(ChangeLog,
changelog_entries: %w{entry1 entry2},
authors: %w{alice bob})
end
let(:git_changelog) do
double(ChangeLog,
changelog_entries:
%w{sub-entry1 sub-entry2})
end
let(:now) { double(Time) }
let(:emptydiff) { EmptyManifestDiff.new }
let(:old_manifest) do
m = Manifest.new
m.add("updated-comp", manifest_entry_for("updated-comp", "v9", "v9"))
m.add("updated-comp-2", manifest_entry_for("updated-comp-2", "someref0", "someref0", :git))
m.add("removed-comp", manifest_entry_for("removed-comp", "v9", "v9"))
m.add("removed-comp-2", manifest_entry_for("removed-comp-2", "v10", "v10"))
m
end
let(:new_manifest) do
m = Manifest.new
m.add("updated-comp", manifest_entry_for("updated-comp", "v10", "v10"))
m.add("updated-comp-2", manifest_entry_for("updated-comp-2", "someotherref", "someotherref", :git))
m.add("added-comp", manifest_entry_for("added-comp", "v100", "v100"))
m.add("added-comp-2", manifest_entry_for("added-comp-2", "v101", "v101"))
m
end
let(:diff) { ManifestDiff.new(old_manifest, new_manifest) }
it "starts with a changelog version header including the time" do
expect(Time).to receive(:now).and_return(now)
expect(now).to receive(:strftime).with("%Y-%m-%d")
.and_return("1970-01-01")
expect { ChangeLogPrinter.new(changelog, diff).print("v1.0.1") }
.to output(/## v1\.0\.1 \(1970-01-01\)/).to_stdout
end
it "outputs the list of changelog entries" do
[ /entry1/, /entry2/ ].each do |re|
expect { ChangeLogPrinter.new(changelog, diff).print("v1") }
.to output(re).to_stdout
end
end
it "outputs the component sections when there are changes" do
expect { ChangeLogPrinter.new(changelog, diff).print("v1") }
.to output(/### Components/).to_stdout
end
it "does not output a component sections when there are no changes" do
expect { ChangeLogPrinter.new(changelog, emptydiff).print("v1") }
.not_to output(/### Components/).to_stdout
end
it "outputs the list of new components" do
[
/New Components/,
/added-comp \(v100\)/,
/added-comp-2 \(v101\)/,
].each do |re|
expect { ChangeLogPrinter.new(changelog, diff).print("v1") }
.to output(re).to_stdout
end
end
it "outputs the list of updated components" do
source_path = "path/to/source/"
allow(File).to receive(:directory?).with("#{source_path}updated-comp-2/.git")
.and_return(false)
[ /Updated Components/,
/updated-comp \(v9 -> v10\)/,
/updated-comp-2 \(someref0 -> someothe\)/,
].each do |re|
expect { ChangeLogPrinter.new(changelog, diff, source_path).print("v1") }
.to output(re).to_stdout
end
end
it "uses git commit log for components in git repositories" do
git_repo = double(GitRepository)
source_path = "path/to/source/"
allow(File).to receive(:directory?).with("#{source_path}updated-comp-2/.git")
.and_return(true)
allow(GitRepository).to receive(:new).with("#{source_path}updated-comp-2")
.and_return(git_repo)
allow(ChangeLog).to receive(:new).with("someref0", "someotherref", git_repo)
.and_return(git_changelog)
[ / \* sub-entry1/,
/ \* sub-entry2/,
].each do |re|
expect { ChangeLogPrinter.new(changelog, diff, source_path).print("v1") }
.to output(re).to_stdout
end
end
it "outputs the list of removed components" do
[ /Removed Components/,
/removed-comp \(v9\)/,
/removed-comp-2 \(v10\)/,
].each do |re|
expect { ChangeLogPrinter.new(changelog, diff).print("v1") }
.to output(re).to_stdout
end
end
it "outputs the list of contributors" do
[ /### Contributors/, /alice/, /bob/ ].each do |re|
expect { ChangeLogPrinter.new(changelog, diff).print("v1") }
.to output(re).to_stdout
end
end
end
end
end