summaryrefslogtreecommitdiff
path: root/spec/unit/module_tool/applications
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/module_tool/applications')
-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
4 files changed, 448 insertions, 14 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