summaryrefslogtreecommitdiff
path: root/spec/unit/module_tool
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/module_tool')
-rw-r--r--spec/unit/module_tool/applications/builder_spec.rb378
-rw-r--r--spec/unit/module_tool/applications/uninstaller_spec.rb22
-rw-r--r--spec/unit/module_tool/applications/unpacker_spec.rb40
-rw-r--r--spec/unit/module_tool/applications/upgrader_spec.rb22
-rw-r--r--spec/unit/module_tool/installed_modules_spec.rb49
-rw-r--r--spec/unit/module_tool/metadata_spec.rb76
-rw-r--r--spec/unit/module_tool/tar/mini_spec.rb3
7 files changed, 571 insertions, 19 deletions
diff --git a/spec/unit/module_tool/applications/builder_spec.rb b/spec/unit/module_tool/applications/builder_spec.rb
index e2b63c192..291473db9 100644
--- a/spec/unit/module_tool/applications/builder_spec.rb
+++ b/spec/unit/module_tool/applications/builder_spec.rb
@@ -1,4 +1,5 @@
require 'spec_helper'
+require 'puppet/file_system'
require 'puppet/module_tool/applications'
require 'puppet_spec/modules'
@@ -12,6 +13,330 @@ describe Puppet::ModuleTool::Applications::Builder do
let(:tarball) { File.join(path, 'pkg', release_name) + ".tar.gz" }
let(:builder) { Puppet::ModuleTool::Applications::Builder.new(path) }
+ shared_examples "a packagable module" do
+ def target_exists?(file)
+ File.exist?(File.join(path, "pkg", "#{module_name}-#{version}", file))
+ end
+
+ def build
+ tarrer = mock('tarrer')
+ Puppet::ModuleTool::Tar.expects(:instance).returns(tarrer)
+ Dir.expects(:chdir).with(File.join(path, 'pkg')).yields
+ tarrer.expects(:pack).with(release_name, tarball)
+
+ builder.run
+ end
+
+ def create_regular_files
+ Puppet::FileSystem.touch(File.join(path, '.dotfile'))
+ Puppet::FileSystem.touch(File.join(path, 'file.foo'))
+ Puppet::FileSystem.touch(File.join(path, 'REVISION'))
+ Puppet::FileSystem.touch(File.join(path, '~file'))
+ Puppet::FileSystem.touch(File.join(path, '#file'))
+ Puppet::FileSystem.mkpath(File.join(path, 'pkg'))
+ Puppet::FileSystem.mkpath(File.join(path, 'coverage'))
+ Puppet::FileSystem.mkpath(File.join(path, 'sub'))
+ Puppet::FileSystem.touch(File.join(path, 'sub/.dotfile'))
+ Puppet::FileSystem.touch(File.join(path, 'sub/file.foo'))
+ Puppet::FileSystem.touch(File.join(path, 'sub/REVISION'))
+ Puppet::FileSystem.touch(File.join(path, 'sub/~file'))
+ Puppet::FileSystem.touch(File.join(path, 'sub/#file'))
+ Puppet::FileSystem.mkpath(File.join(path, 'sub/pkg'))
+ Puppet::FileSystem.mkpath(File.join(path, 'sub/coverage'))
+ end
+
+ def create_symlinks
+ Puppet::FileSystem.touch(File.join(path, 'symlinkedfile'))
+ Puppet::FileSystem.symlink(File.join(path, 'symlinkedfile'), File.join(path, 'symlinkfile'))
+ end
+
+ def create_ignored_files
+ Puppet::FileSystem.touch(File.join(path, 'gitignored.foo'))
+ Puppet::FileSystem.mkpath(File.join(path, 'gitdirectory/sub'))
+ Puppet::FileSystem.touch(File.join(path, 'gitdirectory/gitartifact'))
+ Puppet::FileSystem.touch(File.join(path, 'gitdirectory/gitimportantfile'))
+ Puppet::FileSystem.touch(File.join(path, 'gitdirectory/sub/artifact'))
+ Puppet::FileSystem.touch(File.join(path, 'pmtignored.foo'))
+ Puppet::FileSystem.mkpath(File.join(path, 'pmtdirectory/sub'))
+ Puppet::FileSystem.touch(File.join(path, 'pmtdirectory/pmtimportantfile'))
+ Puppet::FileSystem.touch(File.join(path, 'pmtdirectory/pmtartifact'))
+ Puppet::FileSystem.touch(File.join(path, 'pmtdirectory/sub/artifact'))
+ end
+
+ def create_pmtignore_file
+ Puppet::FileSystem.open(File.join(path, '.pmtignore'), 0600, 'w') do |f|
+ f << <<-PMTIGNORE
+pmtignored.*
+pmtdirectory/sub/**
+pmtdirectory/pmt*
+!pmtimportantfile
+PMTIGNORE
+ end
+ end
+
+ def create_gitignore_file
+ Puppet::FileSystem.open(File.join(path, '.gitignore'), 0600, 'w') do |f|
+ f << <<-GITIGNORE
+gitignored.*
+gitdirectory/sub/**
+gitdirectory/git*
+!gitimportantfile
+GITIGNORE
+ end
+ end
+
+ def create_symlink_gitignore_file
+ Puppet::FileSystem.open(File.join(path, '.gitignore'), 0600, 'w') do |f|
+ f << <<-GITIGNORE
+symlinkfile
+ GITIGNORE
+ end
+ end
+
+ shared_examples "regular files are present" do
+ it "has metadata" do
+ expect(target_exists?('metadata.json')).to eq true
+ end
+
+ it "has checksums" do
+ expect(target_exists?('checksums.json')).to eq true
+ end
+
+ it "copies regular files" do
+ expect(target_exists?('file.foo')).to eq true
+ end
+ end
+
+ shared_examples "default artifacts are removed in module dir but not in subdirs" do
+ it "ignores dotfiles" do
+ expect(target_exists?('.dotfile')).to eq false
+ expect(target_exists?('sub/.dotfile')).to eq true
+ end
+
+ it "does not have .gitignore" do
+ expect(target_exists?('.gitignore')).to eq false
+ end
+
+ it "does not have .pmtignore" do
+ expect(target_exists?('.pmtignore')).to eq false
+ end
+
+ it "does not have pkg" do
+ expect(target_exists?('pkg')).to eq false
+ expect(target_exists?('sub/pkg')).to eq true
+ end
+
+ it "does not have coverage" do
+ expect(target_exists?('coverage')).to eq false
+ expect(target_exists?('sub/coverage')).to eq true
+ end
+
+ it "does not have REVISION" do
+ expect(target_exists?('REVISION')).to eq false
+ expect(target_exists?('sub/REVISION')).to eq true
+ end
+
+ it "does not have ~files" do
+ expect(target_exists?('~file')).to eq false
+ expect(target_exists?('sub/~file')).to eq true
+ end
+
+ it "does not have #files" do
+ expect(target_exists?('#file')).to eq false
+ expect(target_exists?('sub/#file')).to eq true
+ end
+ end
+
+ shared_examples "gitignored files are present" do
+ it "leaves regular files" do
+ expect(target_exists?('gitignored.foo')).to eq true
+ end
+
+ it "leaves directories" do
+ expect(target_exists?('gitdirectory')).to eq true
+ end
+
+ it "leaves files in directories" do
+ expect(target_exists?('gitdirectory/gitartifact')).to eq true
+ end
+
+ it "leaves exceptional files" do
+ expect(target_exists?('gitdirectory/gitimportantfile')).to eq true
+ end
+
+ it "leaves subdirectories" do
+ expect(target_exists?('gitdirectory/sub')).to eq true
+ end
+
+ it "leaves files in subdirectories" do
+ expect(target_exists?('gitdirectory/sub/artifact')).to eq true
+ end
+ end
+
+ shared_examples "gitignored files are not present" do
+ it "ignores regular files" do
+ expect(target_exists?('gitignored.foo')).to eq false
+ end
+
+ it "ignores directories" do
+ expect(target_exists?('gitdirectory')).to eq true
+ end
+
+ it "ignores files in directories" do
+ expect(target_exists?('gitdirectory/gitartifact')).to eq false
+ end
+
+ it "copies exceptional files" do
+ expect(target_exists?('gitdirectory/gitimportantfile')).to eq true
+ end
+
+ it "ignores subdirectories" do
+ expect(target_exists?('gitdirectory/sub')).to eq false
+ end
+
+ it "ignores files in subdirectories" do
+ expect(target_exists?('gitdirectory/sub/artifact')).to eq false
+ end
+ end
+
+ shared_examples "pmtignored files are present" do
+ it "leaves regular files" do
+ expect(target_exists?('pmtignored.foo')).to eq true
+ end
+
+ it "leaves directories" do
+ expect(target_exists?('pmtdirectory')).to eq true
+ end
+
+ it "ignores files in directories" do
+ expect(target_exists?('pmtdirectory/pmtartifact')).to eq true
+ end
+
+ it "leaves exceptional files" do
+ expect(target_exists?('pmtdirectory/pmtimportantfile')).to eq true
+ end
+
+ it "leaves subdirectories" do
+ expect(target_exists?('pmtdirectory/sub')).to eq true
+ end
+
+ it "leaves files in subdirectories" do
+ expect(target_exists?('pmtdirectory/sub/artifact')).to eq true
+ end
+ end
+
+ shared_examples "pmtignored files are not present" do
+ it "ignores regular files" do
+ expect(target_exists?('pmtignored.foo')).to eq false
+ end
+
+ it "ignores directories" do
+ expect(target_exists?('pmtdirectory')).to eq true
+ end
+
+ it "copies exceptional files" do
+ expect(target_exists?('pmtdirectory/pmtimportantfile')).to eq true
+ end
+
+ it "ignores files in directories" do
+ expect(target_exists?('pmtdirectory/pmtartifact')).to eq false
+ end
+
+ it "ignores subdirectories" do
+ expect(target_exists?('pmtdirectory/sub')).to eq false
+ end
+
+ it "ignores files in subdirectories" do
+ expect(target_exists?('pmtdirectory/sub/artifact')).to eq false
+ end
+ end
+
+ context "with no ignore files" do
+ before :each do
+ create_regular_files
+ create_ignored_files
+
+ build
+ end
+
+ it_behaves_like "regular files are present"
+ it_behaves_like "default artifacts are removed in module dir but not in subdirs"
+ it_behaves_like "pmtignored files are present"
+ it_behaves_like "gitignored files are present"
+ end
+
+ context "with .gitignore file" do
+ before :each do
+ create_regular_files
+ create_ignored_files
+ create_gitignore_file
+
+ build
+ end
+
+ it_behaves_like "regular files are present"
+ it_behaves_like "default artifacts are removed in module dir but not in subdirs"
+ it_behaves_like "pmtignored files are present"
+ it_behaves_like "gitignored files are not present"
+ end
+
+ context "with .pmtignore file" do
+ before :each do
+ create_regular_files
+ create_ignored_files
+ create_pmtignore_file
+
+ build
+ end
+
+ it_behaves_like "regular files are present"
+ it_behaves_like "default artifacts are removed in module dir but not in subdirs"
+ it_behaves_like "gitignored files are present"
+ it_behaves_like "pmtignored files are not present"
+ end
+
+ context "with .pmtignore and .gitignore file" do
+ before :each do
+ create_regular_files
+ create_ignored_files
+ create_pmtignore_file
+ create_gitignore_file
+
+ build
+ end
+
+ it_behaves_like "regular files are present"
+ it_behaves_like "default artifacts are removed in module dir but not in subdirs"
+ it_behaves_like "gitignored files are present"
+ it_behaves_like "pmtignored files are not present"
+ end
+
+ context "with unignored symlinks", :if => Puppet.features.manages_symlinks? do
+ before :each do
+ create_regular_files
+ create_symlinks
+ create_ignored_files
+ end
+
+ it "give an error about symlinks" do
+ expect { builder.run }.to raise_error
+ end
+ end
+
+ context "with .gitignore file and ignored symlinks", :if => Puppet.features.manages_symlinks? do
+ before :each do
+ create_regular_files
+ create_symlinks
+ create_ignored_files
+ create_symlink_gitignore_file
+ end
+
+ it "does not give an error about symlinks" do
+ expect { build }.not_to raise_error
+ end
+ end
+ end
+
context 'with metadata.json' do
before :each do
File.open(File.join(path, 'metadata.json'), 'w') do |f|
@@ -28,16 +353,48 @@ describe Puppet::ModuleTool::Applications::Builder do
end
end
- it "packages the module in a tarball named after the module" do
- tarrer = mock('tarrer')
- Puppet::ModuleTool::Tar.expects(:instance).returns(tarrer)
- Dir.expects(:chdir).with(File.join(path, 'pkg')).yields
- tarrer.expects(:pack).with(release_name, tarball)
+ it_behaves_like "a packagable module"
- builder.run
+ it "does not package with a symlink", :if => Puppet.features.manages_symlinks? do
+ FileUtils.touch(File.join(path, 'tempfile'))
+ Puppet::FileSystem.symlink(File.join(path, 'tempfile'), File.join(path, 'tempfile2'))
+
+ expect {
+ builder.run
+ }.to raise_error Puppet::ModuleTool::Errors::ModuleToolError, /symlinks/i
+ end
+
+ it "does not package with a symlink in a subdir", :if => Puppet.features.manages_symlinks? do
+ FileUtils.mkdir(File.join(path, 'manifests'))
+ FileUtils.touch(File.join(path, 'manifests/tempfile.pp'))
+ Puppet::FileSystem.symlink(File.join(path, 'manifests/tempfile.pp'), File.join(path, 'manifests/tempfile2.pp'))
+
+ expect {
+ builder.run
+ }.to raise_error Puppet::ModuleTool::Errors::ModuleToolError, /symlinks/i
end
end
+ context 'with metadata.json containing checksums' do
+ before :each do
+ File.open(File.join(path, 'metadata.json'), 'w') do |f|
+ f.puts({
+ "name" => "#{module_name}",
+ "version" => "#{version}",
+ "source" => "http://github.com/testing/#{module_name}",
+ "author" => "testing",
+ "license" => "Apache License Version 2.0",
+ "summary" => "Puppet testing module",
+ "description" => "This module can be used for basic testing",
+ "project_page" => "http://github.com/testing/#{module_name}",
+ "checksums" => {"README.md" => "deadbeef"}
+ }.to_json)
+ end
+ end
+
+ it_behaves_like "a packagable module"
+ end
+
context 'with Modulefile' do
before :each do
File.open(File.join(path, 'Modulefile'), 'w') do |f|
@@ -54,13 +411,6 @@ MODULEFILE
end
end
- it "packages the module in a tarball named after the module" do
- tarrer = mock('tarrer')
- Puppet::ModuleTool::Tar.expects(:instance).returns(tarrer)
- Dir.expects(:chdir).with(File.join(path, 'pkg')).yields
- tarrer.expects(:pack).with(release_name, tarball)
-
- builder.run
- end
+ it_behaves_like "a packagable module"
end
end
diff --git a/spec/unit/module_tool/applications/uninstaller_spec.rb b/spec/unit/module_tool/applications/uninstaller_spec.rb
index 2a8562ab9..66e71b638 100644
--- a/spec/unit/module_tool/applications/uninstaller_spec.rb
+++ b/spec/unit/module_tool/applications/uninstaller_spec.rb
@@ -113,6 +113,28 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
end
end
+ context 'with --ignore-changes' do
+ def options
+ super.merge(:ignore_changes => true)
+ end
+
+ context 'with local changes' do
+ before do
+ mark_changed(File.join(primary_dir, 'stdlib'))
+ end
+
+ it 'overwrites the installed module with the greatest version matching that range' do
+ subject.should include :result => :success
+ end
+ end
+
+ context 'without local changes' do
+ it 'overwrites the installed module with the greatest version matching that range' do
+ subject.should include :result => :success
+ end
+ end
+ end
+
context "when using the --force flag" do
def options
diff --git a/spec/unit/module_tool/applications/unpacker_spec.rb b/spec/unit/module_tool/applications/unpacker_spec.rb
index 39b0c261f..81557df99 100644
--- a/spec/unit/module_tool/applications/unpacker_spec.rb
+++ b/spec/unit/module_tool/applications/unpacker_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
require 'json'
require 'puppet/module_tool/applications'
+require 'puppet/file_system'
require 'puppet_spec/modules'
describe Puppet::ModuleTool::Applications::Unpacker do
@@ -31,4 +32,43 @@ describe Puppet::ModuleTool::Applications::Unpacker do
Puppet::ModuleTool::Applications::Unpacker.run(filename, :target_dir => target)
File.should be_directory(File.join(target, 'mytarball'))
end
+
+ it "should warn about symlinks", :if => Puppet.features.manages_symlinks? do
+ untar = mock('Tar')
+ untar.expects(:unpack).with(filename, anything()) do |src, dest, _|
+ FileUtils.mkdir(File.join(dest, 'extractedmodule'))
+ File.open(File.join(dest, 'extractedmodule', 'metadata.json'), 'w+') do |file|
+ file.puts JSON.generate('name' => module_name, 'version' => '1.0.0')
+ end
+ FileUtils.touch(File.join(dest, 'extractedmodule/tempfile'))
+ Puppet::FileSystem.symlink(File.join(dest, 'extractedmodule/tempfile'), File.join(dest, 'extractedmodule/tempfile2'))
+ true
+ end
+
+ Puppet::ModuleTool::Tar.expects(:instance).returns(untar)
+ Puppet.expects(:warning).with(regexp_matches(/symlinks/i))
+
+ Puppet::ModuleTool::Applications::Unpacker.run(filename, :target_dir => target)
+ File.should be_directory(File.join(target, 'mytarball'))
+ end
+
+ it "should warn about symlinks in subdirectories", :if => Puppet.features.manages_symlinks? do
+ untar = mock('Tar')
+ untar.expects(:unpack).with(filename, anything()) do |src, dest, _|
+ FileUtils.mkdir(File.join(dest, 'extractedmodule'))
+ File.open(File.join(dest, 'extractedmodule', 'metadata.json'), 'w+') do |file|
+ file.puts JSON.generate('name' => module_name, 'version' => '1.0.0')
+ end
+ FileUtils.mkdir(File.join(dest, 'extractedmodule/manifests'))
+ FileUtils.touch(File.join(dest, 'extractedmodule/manifests/tempfile'))
+ Puppet::FileSystem.symlink(File.join(dest, 'extractedmodule/manifests/tempfile'), File.join(dest, 'extractedmodule/manifests/tempfile2'))
+ true
+ end
+
+ Puppet::ModuleTool::Tar.expects(:instance).returns(untar)
+ Puppet.expects(:warning).with(regexp_matches(/symlinks/i))
+
+ Puppet::ModuleTool::Applications::Unpacker.run(filename, :target_dir => target)
+ File.should be_directory(File.join(target, 'mytarball'))
+ end
end
diff --git a/spec/unit/module_tool/applications/upgrader_spec.rb b/spec/unit/module_tool/applications/upgrader_spec.rb
index 44627f94f..382e45a75 100644
--- a/spec/unit/module_tool/applications/upgrader_spec.rb
+++ b/spec/unit/module_tool/applications/upgrader_spec.rb
@@ -52,6 +52,16 @@ describe Puppet::ModuleTool::Applications::Upgrader do
end
context 'for an installed module' do
+ context 'with only one version' do
+ before { preinstall('puppetlabs-oneversion', '0.0.1') }
+ let(:module) { 'puppetlabs-oneversion' }
+
+ it 'declines to upgrade' do
+ subject.should include :result => :noop
+ subject[:error][:multiline].should =~ /already the latest version/
+ end
+ end
+
context 'without dependencies' do
before { preinstall('pmtacceptance-stdlib', '1.0.0') }
@@ -90,6 +100,7 @@ describe Puppet::ModuleTool::Applications::Upgrader do
context 'without options' do
it 'declines to upgrade' do
subject.should include :result => :noop
+ subject[:error][:multiline].should =~ /already the latest version/
end
end
@@ -165,6 +176,17 @@ describe Puppet::ModuleTool::Applications::Upgrader do
subject.should include :result => :failure
subject[:error].should include :oneline => "Could not upgrade '#{self.module}'; module has had changes made locally"
end
+
+ context 'with --ignore-changes' do
+ def options
+ super.merge(:ignore_changes => true)
+ end
+
+ it 'overwrites the installed module with the greatest version matching that range' do
+ subject.should include :result => :success
+ graph_should_include 'pmtacceptance-stdlib', v('1.0.0') => v('4.1.0')
+ end
+ end
end
context 'with dependencies' do
diff --git a/spec/unit/module_tool/installed_modules_spec.rb b/spec/unit/module_tool/installed_modules_spec.rb
new file mode 100644
index 000000000..b9492d986
--- /dev/null
+++ b/spec/unit/module_tool/installed_modules_spec.rb
@@ -0,0 +1,49 @@
+require 'spec_helper'
+require 'puppet/module_tool/installed_modules'
+require 'puppet_spec/modules'
+
+describe Puppet::ModuleTool::InstalledModules do
+ include PuppetSpec::Files
+
+ around do |example|
+ dir = tmpdir("deep_path")
+
+ FileUtils.mkdir_p(@modpath = File.join(dir, "modpath"))
+
+ @env = Puppet::Node::Environment.create(:env, [@modpath])
+ Puppet.override(:current_environment => @env) do
+ example.run
+ end
+ end
+
+ it 'works when given a semantic version' do
+ mod = PuppetSpec::Modules.create('goodsemver', @modpath, :metadata => {:version => '1.2.3'})
+ installed = described_class.new(@env)
+ expect(installed.modules["puppetlabs-#{mod.name}"].version).to eq(Semantic::Version.parse('1.2.3'))
+ end
+
+ it 'defaults when not given a semantic version' do
+ mod = PuppetSpec::Modules.create('badsemver', @modpath, :metadata => {:version => 'banana'})
+ Puppet.expects(:warning).with(regexp_matches(/Semantic Version/))
+ installed = described_class.new(@env)
+ expect(installed.modules["puppetlabs-#{mod.name}"].version).to eq(Semantic::Version.parse('0.0.0'))
+ end
+
+ it 'defaults when not given a full semantic version' do
+ mod = PuppetSpec::Modules.create('badsemver', @modpath, :metadata => {:version => '1.2'})
+ Puppet.expects(:warning).with(regexp_matches(/Semantic Version/))
+ installed = described_class.new(@env)
+ expect(installed.modules["puppetlabs-#{mod.name}"].version).to eq(Semantic::Version.parse('0.0.0'))
+ end
+
+ it 'still works if there is an invalid version in one of the modules' do
+ mod1 = PuppetSpec::Modules.create('badsemver', @modpath, :metadata => {:version => 'banana'})
+ mod2 = PuppetSpec::Modules.create('goodsemver', @modpath, :metadata => {:version => '1.2.3'})
+ mod3 = PuppetSpec::Modules.create('notquitesemver', @modpath, :metadata => {:version => '1.2'})
+ Puppet.expects(:warning).with(regexp_matches(/Semantic Version/)).twice
+ installed = described_class.new(@env)
+ expect(installed.modules["puppetlabs-#{mod1.name}"].version).to eq(Semantic::Version.parse('0.0.0'))
+ expect(installed.modules["puppetlabs-#{mod2.name}"].version).to eq(Semantic::Version.parse('1.2.3'))
+ expect(installed.modules["puppetlabs-#{mod3.name}"].version).to eq(Semantic::Version.parse('0.0.0'))
+ end
+end
diff --git a/spec/unit/module_tool/metadata_spec.rb b/spec/unit/module_tool/metadata_spec.rb
index 3b925c644..fce9c8f8d 100644
--- a/spec/unit/module_tool/metadata_spec.rb
+++ b/spec/unit/module_tool/metadata_spec.rb
@@ -5,6 +5,19 @@ describe Puppet::ModuleTool::Metadata do
let(:data) { {} }
let(:metadata) { Puppet::ModuleTool::Metadata.new }
+ describe 'property lookups' do
+ subject { metadata }
+
+ %w[ name version author summary license source project_page issues_url
+ dependencies dashed_name release_name description ].each do |prop|
+ describe "##{prop}" do
+ it "responds to the property" do
+ subject.send(prop)
+ end
+ end
+ end
+ end
+
describe "#update" do
subject { metadata.update(data) }
@@ -156,6 +169,61 @@ describe Puppet::ModuleTool::Metadata do
end
+ context "with a valid dependency" do
+ let(:data) { {'dependencies' => [{'name' => 'puppetlabs-goodmodule'}] }}
+
+ it "adds the dependency" do
+ subject.dependencies.size.should == 1
+ end
+ end
+
+ context "with a invalid dependency name" do
+ let(:data) { {'dependencies' => [{'name' => 'puppetlabsbadmodule'}] }}
+
+ it "raises an exception" do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+
+ context "with a valid dependency version range" do
+ let(:data) { {'dependencies' => [{'name' => 'puppetlabs-badmodule', 'version_requirement' => '>= 2.0.0'}] }}
+
+ it "adds the dependency" do
+ subject.dependencies.size.should == 1
+ end
+ end
+
+ context "with a invalid version range" do
+ let(:data) { {'dependencies' => [{'name' => 'puppetlabsbadmodule', 'version_requirement' => '>= banana'}] }}
+
+ it "raises an exception" do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+
+ context "with duplicate dependencies" do
+ let(:data) { {'dependencies' => [{'name' => 'puppetlabs-dupmodule', 'version_requirement' => '1.0.0'},
+ {'name' => 'puppetlabs-dupmodule', 'version_requirement' => '0.0.1'}] }
+ }
+
+ it "raises an exception" do
+ expect { subject }.to raise_error(ArgumentError)
+ end
+ end
+
+ context "adding a duplicate dependency" do
+ let(:data) { {'dependencies' => [{'name' => 'puppetlabs-origmodule', 'version_requirement' => '1.0.0'}] }}
+
+ it "with a different version raises an exception" do
+ metadata.add_dependency('puppetlabs-origmodule', '>= 0.0.1')
+ expect { subject }.to raise_error(ArgumentError)
+ end
+
+ it "with the same version does not add another dependency" do
+ metadata.add_dependency('puppetlabs-origmodule', '1.0.0')
+ subject.dependencies.size.should == 1
+ end
+ end
end
describe '#dashed_name' do
@@ -202,8 +270,8 @@ describe Puppet::ModuleTool::Metadata do
describe "#to_hash" do
subject { metadata.to_hash }
- its(:keys) do
- subject.sort.should == %w[ name version author summary license source issues_url project_page dependencies ].sort
+ it "contains the default set of keys" do
+ subject.keys.sort.should == %w[ name version author summary license source issues_url project_page dependencies ].sort
end
describe "['license']" do
@@ -213,8 +281,8 @@ describe Puppet::ModuleTool::Metadata do
end
describe "['dependencies']" do
- it "defaults to an empty Array" do
- subject['dependencies'].should == []
+ it "defaults to an empty set" do
+ subject['dependencies'].should == Set.new
end
end
diff --git a/spec/unit/module_tool/tar/mini_spec.rb b/spec/unit/module_tool/tar/mini_spec.rb
index ef030611b..179952741 100644
--- a/spec/unit/module_tool/tar/mini_spec.rb
+++ b/spec/unit/module_tool/tar/mini_spec.rb
@@ -54,6 +54,7 @@ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Pup
reader = mock('GzipReader')
Zlib::GzipReader.expects(:open).with(sourcefile).yields(reader)
- Archive::Tar::Minitar.expects(:unpack).with(reader, destdir).yields(type, name, nil)
+ minitar.expects(:find_valid_files).with(reader).returns([name])
+ Archive::Tar::Minitar.expects(:unpack).with(reader, destdir, [name]).yields(type, name, nil)
end
end