diff options
| author | Micah <micah@leap.se> | 2016-05-24 10:19:38 -0400 | 
|---|---|---|
| committer | Micah <micah@leap.se> | 2016-05-24 10:19:38 -0400 | 
| commit | 92a1ac5b29b497ee659c8097a5c0de94a481181c (patch) | |
| tree | e9c325ad24a732b6bdb13801ef2997f10f99e02e /spec/unit/puppet/provider/vcsrepo | |
Squashed 'puppet/modules/vcsrepo/' content from commit 4e23209
git-subtree-dir: puppet/modules/vcsrepo
git-subtree-split: 4e23209eaccf1ab504d35158f4141b3053327c2f
Diffstat (limited to 'spec/unit/puppet/provider/vcsrepo')
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/bzr_spec.rb | 109 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/cvs_spec.rb | 124 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/git_spec.rb | 401 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/hg_spec.rb | 138 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/p4_spec.rb | 82 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/svn_spec.rb | 160 | 
6 files changed, 1014 insertions, 0 deletions
| diff --git a/spec/unit/puppet/provider/vcsrepo/bzr_spec.rb b/spec/unit/puppet/provider/vcsrepo/bzr_spec.rb new file mode 100644 index 00000000..b5e2f731 --- /dev/null +++ b/spec/unit/puppet/provider/vcsrepo/bzr_spec.rb @@ -0,0 +1,109 @@ +require 'spec_helper' + +describe Puppet::Type.type(:vcsrepo).provider(:bzr_provider) do + +  let(:resource) { Puppet::Type.type(:vcsrepo).new({ +    :name     => 'test', +    :ensure   => :present, +    :provider => :bzr, +    :revision => '2634', +    :source   => 'lp:do', +    :path     => '/tmp/test', +  })} + +  let(:provider) { resource.provider } + +  before :each do +    Puppet::Util.stubs(:which).with('bzr').returns('/usr/bin/bzr') +  end + +  describe 'creating' do +    context 'with defaults' do +      it "should execute 'bzr clone -r' with the revision" do +        provider.expects(:bzr).with('branch', '-r', resource.value(:revision), resource.value(:source), resource.value(:path)) +        provider.create +      end +    end + +    context 'without revision' do +      it "should just execute 'bzr clone' without a revision" do +        resource.delete(:revision) +        provider.expects(:bzr).with('branch', resource.value(:source), resource.value(:path)) +        provider.create +      end +    end + +    context 'without source' do +      it "should execute 'bzr init'" do +        resource.delete(:source) +        provider.expects(:bzr).with('init', resource.value(:path)) +        provider.create +      end +    end +  end + +  describe 'destroying' do +    it "it should remove the directory" do +      provider.destroy +    end +  end + +  describe "checking existence" do +    it "should check for the directory" do +      File.expects(:directory?).with(File.join(resource.value(:path), '.bzr')).returns(true) +      provider.exists? +    end +  end + +  describe "checking the revision property" do +    before do +      expects_chdir +      provider.expects(:bzr).with('version-info').returns(File.read(fixtures('bzr_version_info.txt'))) +      @current_revid = 'menesis@pov.lt-20100309191856-4wmfqzc803fj300x' +    end + +    context "when given a non-revid as the resource revision" do +      context "when its revid is not different than the current revid" do +        it "should return the ref" do +          resource[:revision] = '2634' +          provider.expects(:bzr).with('revision-info', '2634').returns("2634 menesis@pov.lt-20100309191856-4wmfqzc803fj300x\n") +          expect(provider.revision).to eq(resource.value(:revision)) +        end +      end +      context "when its revid is different than the current revid" do +        it "should return the current revid" do +          resource[:revision] = '2636' +          provider.expects(:bzr).with('revision-info', resource.value(:revision)).returns("2635 foo\n") +          expect(provider.revision).to eq(@current_revid) +        end +      end +    end + +    context "when given a revid as the resource revision" do +      context "when it is the same as the current revid" do +        it "should return it" do +          resource[:revision] = 'menesis@pov.lt-20100309191856-4wmfqzc803fj300x' +          provider.expects(:bzr).with('revision-info', resource.value(:revision)).returns("1234 #{resource.value(:revision)}\n") +          expect(provider.revision).to eq(resource.value(:revision)) +        end +      end +      context "when it is not the same as the current revid" do +        it "should return the current revid" do +          resource[:revision] = 'menesis@pov.lt-20100309191856-4wmfqzc803fj300y' +          provider.expects(:bzr).with('revision-info', resource.value(:revision)).returns("2636 foo\n") +          expect(provider.revision).to eq(@current_revid) +        end +      end + +    end +  end + +  describe "setting the revision property" do +    it "should use 'bzr update -r' with the revision" do +      Dir.expects(:chdir).with('/tmp/test').at_least_once.yields +      provider.expects(:bzr).with('update', '-r', 'somerev') +      provider.revision = 'somerev' +    end +  end + +end diff --git a/spec/unit/puppet/provider/vcsrepo/cvs_spec.rb b/spec/unit/puppet/provider/vcsrepo/cvs_spec.rb new file mode 100644 index 00000000..2e18149a --- /dev/null +++ b/spec/unit/puppet/provider/vcsrepo/cvs_spec.rb @@ -0,0 +1,124 @@ +require 'spec_helper' + +describe Puppet::Type.type(:vcsrepo).provider(:cvs_provider) do + +  let(:resource) { Puppet::Type.type(:vcsrepo).new({ +    :name     => 'test', +    :ensure   => :present, +    :provider => :cvs, +    :revision => '2634', +    :source   => 'lp:do', +    :path     => '/tmp/test', +  })} + +  let(:provider) { resource.provider } + +  before :each do +    Puppet::Util.stubs(:which).with('cvs').returns('/usr/bin/cvs') +  end + +  describe 'creating' do +    context "with a source" do +      it "should execute 'cvs checkout'" do +        resource[:source] = ':ext:source@example.com:/foo/bar' +        resource[:revision] = 'an-unimportant-value' +        expects_chdir('/tmp') +        Puppet::Util::Execution.expects(:execute).with([:cvs, '-d', resource.value(:source), 'checkout', '-r', 'an-unimportant-value', '-d', 'test', 'bar'], :custom_environment => {}) +        provider.create +      end + +      it "should execute 'cvs checkout' as user 'muppet'" do +        resource[:source] = ':ext:source@example.com:/foo/bar' +        resource[:revision] = 'an-unimportant-value' +        resource[:user] = 'muppet' +        expects_chdir('/tmp') +        Puppet::Util::Execution.expects(:execute).with([:cvs, '-d', resource.value(:source), 'checkout', '-r', 'an-unimportant-value', '-d', 'test', 'bar'], :uid => 'muppet', :custom_environment => {}) +        provider.create +      end + +      it "should just execute 'cvs checkout' without a revision" do +        resource[:source] = ':ext:source@example.com:/foo/bar' +        resource.delete(:revision) +        Puppet::Util::Execution.expects(:execute).with([:cvs, '-d', resource.value(:source), 'checkout', '-d', File.basename(resource.value(:path)), File.basename(resource.value(:source))], :custom_environment => {}) +        provider.create +      end + +      context "with a compression" do +        it "should just execute 'cvs checkout' without a revision" do +          resource[:source] = ':ext:source@example.com:/foo/bar' +          resource[:compression] = '3' +          resource.delete(:revision) +          Puppet::Util::Execution.expects(:execute).with([:cvs, '-d', resource.value(:source), '-z', '3', 'checkout', '-d', File.basename(resource.value(:path)), File.basename(resource.value(:source))], :custom_environment => {}) +          provider.create +        end +      end +    end + +    context "when a source is not given" do +      it "should execute 'cvs init'" do +        resource.delete(:source) +        Puppet::Util::Execution.expects(:execute).with([:cvs, '-d', resource.value(:path), 'init'], :custom_environment => {}) +        provider.create +      end +    end +  end + +  describe 'destroying' do +    it "it should remove the directory" do +      provider.destroy +    end +  end + +  describe "checking existence" do +    it "should check for the CVS directory with source" do +      resource[:source] = ':ext:source@example.com:/foo/bar' +      File.expects(:directory?).with(File.join(resource.value(:path), 'CVS')) +      provider.exists? +    end + +    it "should check for the CVSROOT directory without source" do +      resource.delete(:source) +      File.expects(:directory?).with(File.join(resource.value(:path), 'CVSROOT')) +      provider.exists? +    end +  end + +  describe "checking the revision property" do +    before do +      @tag_file = File.join(resource.value(:path), 'CVS', 'Tag') +    end + +    context "when CVS/Tag exists" do +      before do +        @tag = 'TAG' +        File.expects(:exist?).with(@tag_file).returns(true) +      end +      it "should read CVS/Tag" do +        File.expects(:read).with(@tag_file).returns("T#{@tag}") +        expect(provider.revision).to eq(@tag) +      end +    end + +    context "when CVS/Tag does not exist" do +      before do +        File.expects(:exist?).with(@tag_file).returns(false) +      end +      it "assumes HEAD" do +        expect(provider.revision).to eq('HEAD') +      end +    end +  end + +  describe "when setting the revision property" do +    before do +      @tag = 'SOMETAG' +    end + +    it "should use 'cvs update -dr'" do +      expects_chdir +      Puppet::Util::Execution.expects(:execute).with([:cvs, 'update', '-dr', @tag, '.'], :custom_environment => {}) +      provider.revision = @tag +    end +  end + +end diff --git a/spec/unit/puppet/provider/vcsrepo/git_spec.rb b/spec/unit/puppet/provider/vcsrepo/git_spec.rb new file mode 100644 index 00000000..6a8f58f8 --- /dev/null +++ b/spec/unit/puppet/provider/vcsrepo/git_spec.rb @@ -0,0 +1,401 @@ +require 'spec_helper' + +describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do +  def branch_a_list(include_branch = nil?) +    <<branches +end +#{"*  master" unless  include_branch.nil?} +#{"*  " + include_branch unless !include_branch} +   remote/origin/master +   remote/origin/foo + +branches +  end +  let(:resource) { Puppet::Type.type(:vcsrepo).new({ +    :name     => 'test', +    :ensure   => :present, +    :provider => :git, +    :revision => '2634', +    :source   => 'git@repo', +    :path     => '/tmp/test', +    :force    => false +  })} + +  let(:provider) { resource.provider } + +  before :each do +    Puppet::Util.stubs(:which).with('git').returns('/usr/bin/git') +  end + +  context 'creating' do +    context "with a revision that is a remote branch" do +      it "should execute 'git clone' and 'git checkout -b'" do +        resource[:revision] = 'only/remote' +        Dir.expects(:chdir).with('/').at_least_once.yields +        Dir.expects(:chdir).with('/tmp/test').at_least_once.yields +        provider.expects(:git).with('clone', resource.value(:source), resource.value(:path)) +        provider.expects(:update_submodules) +        provider.expects(:update_remote_url).with("origin", resource.value(:source)).returns false +        provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision))) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.create +      end +    end + +    context "with a remote not named 'origin'" do +      it "should execute 'git clone --origin not_origin" do +        resource[:remote] = 'not_origin' +        Dir.expects(:chdir).with('/').at_least_once.yields +        Dir.expects(:chdir).with('/tmp/test').at_least_once.yields +        provider.expects(:git).with('clone', '--origin', 'not_origin', resource.value(:source), resource.value(:path)) +        provider.expects(:update_submodules) +        provider.expects(:update_remote_url).with("not_origin", resource.value(:source)).returns false +        provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision))) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.create +      end +    end + +    context "with shallow clone enable" do +      it "should execute 'git clone --depth 1'" do +        resource[:revision] = 'only/remote' +        resource[:depth] = 1 +        Dir.expects(:chdir).with('/').at_least_once.yields +        Dir.expects(:chdir).with('/tmp/test').at_least_once.yields +        provider.expects(:git).with('clone', '--depth', '1', '--branch', resource.value(:revision),resource.value(:source), resource.value(:path)) +        provider.expects(:update_submodules) +        provider.expects(:update_remote_url).with("origin", resource.value(:source)).returns false +        provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision))) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.create +      end +    end + +    context "with a revision that is not a remote branch" do +      it "should execute 'git clone' and 'git reset --hard'" do +        resource[:revision] = 'a-commit-or-tag' +        Dir.expects(:chdir).with('/').at_least_once.yields +        Dir.expects(:chdir).with('/tmp/test').at_least_once.yields +        provider.expects(:git).with('clone', resource.value(:source), resource.value(:path)) +        provider.expects(:update_submodules) +        provider.expects(:update_remote_url).with("origin", resource.value(:source)).returns false +        provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision))) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.create +      end + +      it "should execute 'git clone' and submodule commands" do +        resource.delete(:revision) +        provider.expects(:git).with('clone', resource.value(:source), resource.value(:path)) +        provider.expects(:update_submodules) +        provider.expects(:update_remotes) +        provider.create +      end +    end + +    context "with an ensure of bare" do +      context "with revision" do +        it "should raise an error" do +          resource[:ensure] = :bare +          expect { provider.create }.to raise_error Puppet::Error, /cannot set a revision.+bare/i +        end +      end +      context "without revision" do +        it "should just execute 'git clone --bare'" do +          resource[:ensure] = :bare +          resource.delete(:revision) +          provider.expects(:git).with('clone', '--bare', resource.value(:source), resource.value(:path)) +          provider.expects(:update_remotes) +          provider.create +        end +      end +    end + +    context "with an ensure of mirror" do +      context "with revision" do +        it "should raise an error" do +          resource[:ensure] = :mirror +          expect { provider.create }.to raise_error Puppet::Error, /cannot set a revision.+bare/i +        end +      end +      context "without revision" do +        it "should just execute 'git clone --mirror'" do +          resource[:ensure] = :mirror +          resource.delete(:revision) +          provider.expects(:git).with('clone', '--mirror', resource.value(:source), resource.value(:path)) +          provider.expects(:update_remotes) +          provider.create +        end +      end +    end + +    context "when a source is not given" do +      context "when the path does not exist" do +        it "should execute 'git init'" do +          resource[:ensure] = :present +          resource.delete(:source) +          expects_mkdir +          expects_chdir +          expects_directory?(false) + +          provider.expects(:bare_exists?).returns(false) +          provider.expects(:git).with('init') +          provider.create +        end +      end + +      context "when the path is a bare repository" do +        it "should convert it to a working copy" do +          resource[:ensure] = :present +          resource.delete(:source) +          provider.expects(:bare_exists?).returns(true) +          provider.expects(:convert_bare_to_working_copy) +          provider.create +        end +      end + +      context "when the path is not empty and not a repository" do +        it "should raise an exception" do +          provider.expects(:path_exists?).returns(true) +          provider.expects(:path_empty?).returns(false) +          expect { provider.create }.to raise_error(Puppet::Error) +        end +      end +    end + +    context "when the path does not exist" do +      it "should execute 'git init --bare'" do +        resource[:ensure] = :bare +        resource.delete(:source) +        resource.delete(:revision) +        expects_chdir +        expects_mkdir +        expects_directory?(false) +        provider.expects(:working_copy_exists?).returns(false) +        provider.expects(:git).with('init', '--bare') +        provider.create +      end + +      it "should raise an exeption" do +        resource[:ensure] = :mirror +        resource.delete(:source) +        resource.delete(:revision) + +        expect { provider.create }.to raise_error Puppet::Error, /cannot init repository with mirror.+try bare/i +      end +    end + +    context "when the path is a working copy repository" do +      it "should convert it to a bare repository" do +        resource[:ensure] = :bare +        resource.delete(:source) +        resource.delete(:revision) +        provider.expects(:working_copy_exists?).returns(true) +        provider.expects(:convert_working_copy_to_bare) +        provider.create +      end +      it "should clone overtop it using force" do +        resource[:force] = true +        Dir.expects(:chdir).with('/').at_least_once.yields +        Dir.expects(:chdir).with('/tmp/test').at_least_once.yields +        provider.expects(:path_exists?).returns(true) +        provider.expects(:path_empty?).returns(false) +        provider.destroy +        provider.expects(:git).with('clone',resource.value(:source), resource.value(:path)) +        provider.expects(:update_submodules) +        provider.expects(:update_remote_url).with("origin", resource.value(:source)).returns false +        provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision))) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.create +      end +    end + +    context "when the path is not empty and not a repository" do +      it "should raise an exception" do +        provider.expects(:path_exists?).returns(true) +        provider.expects(:path_empty?).returns(false) +        provider.expects(:working_copy_exists?).returns(false) +        expect { provider.create }.to raise_error(Puppet::Error) +      end +    end +  end + + +  context 'destroying' do +    it "it should remove the directory" do +      #expects_rm_rf +      provider.destroy +    end +  end + +  context "checking the revision property" do +    before do +      expects_chdir('/tmp/test') +      resource[:revision] = 'currentsha' +      resource[:source] = 'http://example.com' +      provider.stubs(:git).with('config', 'remote.origin.url').returns('') +      provider.stubs(:git).with('fetch', 'origin') # FIXME +      provider.stubs(:git).with('fetch', '--tags', 'origin') +      provider.stubs(:git).with('rev-parse', 'HEAD').returns('currentsha') +      provider.stubs(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision))) +      provider.stubs(:git).with('tag', '-l').returns("Hello") +    end + +    context "when its SHA is not different than the current SHA" do +      it "should return the ref" do +        provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha') +        provider.expects(:update_remotes) +        expect(provider.revision).to eq(resource.value(:revision)) +      end +    end + +    context "when its SHA is different than the current SHA" do +      it "should return the current SHA" do +        provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('othersha') +        provider.expects(:update_remotes) +        expect(provider.revision).to eq(resource.value(:revision)) +      end +    end + +    context "when its a ref to a remote head" do +      it "should return the revision" do +        provider.stubs(:git).with('branch', '-a').returns("  remotes/origin/#{resource.value(:revision)}") +        provider.expects(:git).with('rev-parse', "origin/#{resource.value(:revision)}").returns("newsha") +        provider.expects(:update_remotes) +        expect(provider.revision).to eq(resource.value(:revision)) +      end +    end + +    context "when its a ref to non existant remote head" do +      it "should fail" do +        provider.expects(:git).with('branch', '-a').returns(branch_a_list) +        provider.expects(:git).with('rev-parse', '--revs-only', resource.value(:revision)).returns('') +        provider.expects(:update_remotes) +        expect { provider.revision }.to raise_error(Puppet::Error, /not a local or remote ref$/) +      end +    end + +    context "when the source is modified" do +      it "should update the origin url" do +        resource[:source] = 'git://git@foo.com/bar.git' +        provider.expects(:git).with('config', '-l').returns("remote.origin.url=git://git@foo.com/foo.git\n") +        provider.expects(:git).with('remote', 'set-url', 'origin', 'git://git@foo.com/bar.git') +        provider.expects(:git).with('remote','update') +        provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha') +        expect(provider.revision).to eq(resource.value(:revision)) +      end +    end + +    context "when multiple sources are modified" do +      it "should update the urls" do +        resource[:source] = {"origin" => "git://git@foo.com/bar.git", "new_remote" => "git://git@foo.com/baz.git"} +        provider.expects(:git).at_least_once.with('config', '-l').returns("remote.origin.url=git://git@foo.com/bar.git\n", "remote.origin.url=git://git@foo.com/foo.git\n") +        provider.expects(:git).with('remote', 'set-url', 'origin', 'git://git@foo.com/bar.git') +        provider.expects(:git).with('remote', 'add', 'new_remote', 'git://git@foo.com/baz.git') +        provider.expects(:git).with('remote','update') +        provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha') +        expect(provider.revision).to eq(resource.value(:revision)) +      end +    end + +    context "when there's no source" do +      it 'should return the revision' do +        resource.delete(:source) +        provider.expects(:git).with('status') +        provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha') +        expect(provider.revision).to eq(resource.value(:revision)) +      end +    end +  end + +  context "setting the revision property" do +    before do +      expects_chdir +    end +    context "when it's an existing local branch" do +      it "should use 'git fetch' and 'git reset'" do +        resource[:revision] = 'feature/foo' +        provider.expects(:update_submodules) +        provider.expects(:git).with('branch', '-a').at_least_once.returns(branch_a_list(resource.value(:revision))) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.expects(:git).with('reset', '--hard',  "origin/#{resource.value(:revision)}") +        provider.revision = resource.value(:revision) +      end +    end +    context "when it's a remote branch" do +      it "should use 'git fetch' and 'git reset'" do +        resource[:revision] = 'only/remote' +        provider.expects(:update_submodules) +        provider.expects(:git).with('branch', '-a').at_least_once.returns(resource.value(:revision)) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.expects(:git).with('reset', '--hard',  "origin/#{resource.value(:revision)}") +        provider.revision = resource.value(:revision) +      end +    end +    context "when it's a commit or tag" do +      it "should use 'git fetch' and 'git reset'" do +        resource[:revision] = 'a-commit-or-tag' +        provider.expects(:git).with('branch', '-a').at_least_once.returns(fixture(:git_branch_a)) +        provider.expects(:git).with('checkout', '--force', resource.value(:revision)) +        provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a)) +        provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a)) +        provider.expects(:git).with('submodule', 'update', '--init', '--recursive') +        provider.revision = resource.value(:revision) +      end +    end +  end + +  context "updating references" do +    it "should use 'git fetch --tags'" do +      resource.delete(:source) +      expects_chdir +      provider.expects(:git).with('config', '-l').returns("remote.origin.url=git://git@foo.com/foo.git\n") +      provider.expects(:git).with('fetch', 'origin') +      provider.expects(:git).with('fetch', '--tags', 'origin') +      provider.update_references +    end +  end + +  describe 'latest?' do +    context 'when true' do +      it do +        provider.expects(:revision).returns('testrev') +        provider.expects(:latest_revision).returns('testrev') +        expect(provider.latest?).to be_truthy +      end +    end +    context 'when false' do +      it do +        provider.expects(:revision).returns('master') +        provider.expects(:latest_revision).returns('testrev') +        expect(provider.latest?).to be_falsey +      end +    end +  end + +  describe 'convert_working_copy_to_bare' do +    it do +      FileUtils.expects(:mv).returns(true) +      FileUtils.expects(:rm_rf).returns(true) +      FileUtils.expects(:mv).returns(true) + +      provider.instance_eval { convert_working_copy_to_bare } +    end +  end + +    describe 'convert_bare_to_working_copy' do +    it do +      FileUtils.expects(:mv).returns(true) +      FileUtils.expects(:mkdir).returns(true) +      FileUtils.expects(:mv).returns(true) +      provider.expects(:commits_in?).returns(true) +      # If you forget to stub these out you lose 3 hours of rspec work. +      provider.expects(:reset).with('HEAD').returns(true) +      provider.expects(:git_with_identity).returns(true) +      provider.expects(:update_owner_and_excludes).returns(true) + +      provider.instance_eval { convert_bare_to_working_copy } +    end +  end + +end diff --git a/spec/unit/puppet/provider/vcsrepo/hg_spec.rb b/spec/unit/puppet/provider/vcsrepo/hg_spec.rb new file mode 100644 index 00000000..65d820d9 --- /dev/null +++ b/spec/unit/puppet/provider/vcsrepo/hg_spec.rb @@ -0,0 +1,138 @@ +require 'spec_helper' + +describe Puppet::Type.type(:vcsrepo).provider(:hg) do + +  let(:resource) { Puppet::Type.type(:vcsrepo).new({ +    :name     => 'test', +    :ensure   => :present, +    :provider => :hg, +    :path     => '/tmp/vcsrepo', +  })} + +  let(:provider) { resource.provider } + +  before :each do +    Puppet::Util.stubs(:which).with('hg').returns('/usr/bin/hg') +  end + +  describe 'creating' do +    context 'with source and revision' do +      it "should execute 'hg clone -u' with the revision" do +        resource[:source] = 'something' +        resource[:revision] = '1' +        provider.expects(:hg).with('clone', '-u', +          resource.value(:revision), +          resource.value(:source), +          resource.value(:path)) +        provider.create +      end +    end + +    context 'without revision' do +      it "should just execute 'hg clone' without a revision" do +        resource[:source] = 'something' +        provider.expects(:hg).with('clone', resource.value(:source), resource.value(:path)) +        provider.create +      end +    end + +    context "when a source is not given" do +      it "should execute 'hg init'" do +        provider.expects(:hg).with('init', resource.value(:path)) +        provider.create +      end +    end + +    context "when basic auth is used" do +      it "should execute 'hg clone'" do +        resource[:source] = 'something' +        resource[:basic_auth_username] = 'user' +        resource[:basic_auth_password] = 'pass' +        provider.expects(:hg).with('clone', +          resource.value(:source), +          resource.value(:path), +            "--config","\"auth.x.prefix=" + resource.value(:source) + "\"", +            "--config","\"auth.x.username=" + resource.value(:basic_auth_username) + "\"", +            "--config","\"auth.x.password=" + resource.value(:basic_auth_password) + "\"", +            "--config","\"auth.x.schemes=http https" + "\"") +        provider.create +      end +    end +  end + +  describe 'destroying' do +    it "it should remove the directory" do +      expects_rm_rf +      provider.destroy +    end +  end + +  describe "checking existence" do +    it "should check for the directory" do +      expects_directory?(true, File.join(resource.value(:path), '.hg')) +      provider.exists? +    end +  end + +  describe "checking the revision property" do +    before do +      expects_chdir +    end + +    context "when given a non-SHA as the resource revision" do +      before do +        provider.expects(:hg).with('parents').returns(fixture(:hg_parents)) +        provider.expects(:hg).with('tags').returns(fixture(:hg_tags)) +      end + +      context "when its SHA is not different than the current SHA" do +        it "should return the ref" do +          resource[:revision] = '0.6' +          expect(provider.revision).to eq('0.6') +        end +      end + +      context "when its SHA is different than the current SHA" do +        it "should return the current SHA" do +          resource[:revision] = '0.5.3' +          expect(provider.revision).to eq('34e6012c783a') +        end +      end +    end +    context "when given a SHA as the resource revision" do +      before do +        provider.expects(:hg).with('parents').returns(fixture(:hg_parents)) +      end + +      context "when it is the same as the current SHA", :resource => {:revision => '34e6012c783a'} do +        it "should return it" do +          resource[:revision] = '34e6012c783a' +          provider.expects(:hg).with('tags').returns(fixture(:hg_tags)) +          expect(provider.revision).to eq(resource.value(:revision)) +        end +      end + +      context "when it is not the same as the current SHA", :resource => {:revision => 'not-the-same'} do +        it "should return the current SHA" do +          resource[:revision] = 'not-the-same' +          provider.expects(:hg).with('tags').returns(fixture(:hg_tags)) +          expect(provider.revision).to eq('34e6012c783a') +        end +      end +    end +  end + +  describe "setting the revision property" do +    before do +      @revision = '6aa99e9b3ab1' +    end +    it "should use 'hg update ---clean -r'" do +      expects_chdir +      provider.expects(:hg).with('pull') +      provider.expects(:hg).with('merge') +      provider.expects(:hg).with('update', '--clean', '-r', @revision) +      provider.revision = @revision +    end +  end + +end diff --git a/spec/unit/puppet/provider/vcsrepo/p4_spec.rb b/spec/unit/puppet/provider/vcsrepo/p4_spec.rb new file mode 100644 index 00000000..e331cae6 --- /dev/null +++ b/spec/unit/puppet/provider/vcsrepo/p4_spec.rb @@ -0,0 +1,82 @@ +require 'spec_helper' + +describe Puppet::Type.type(:vcsrepo).provider(:p4) do + +  let(:resource) { Puppet::Type.type(:vcsrepo).new({ +    :name     => 'test', +    :ensure   => :present, +    :provider => :p4, +    :path     => '/tmp/vcsrepo', +  })} + +  let(:provider) { resource.provider } + +  before :each do +    Puppet::Util.stubs(:which).with('p4').returns('/usr/local/bin/p4') +  end + +  spec = { +    :input => "Description: Generated by Puppet VCSrepo\nRoot: /tmp/vcsrepo\n\nView:\n", +    :marshal => false +  } + +  describe 'creating' do +    context 'with source and revision' do +      it "should execute 'p4 sync' with the revision" do +        resource[:source] = 'something' +        resource[:revision] = '1' +        ENV['P4CLIENT'] = 'client_ws1' + +        provider.expects(:p4).with(['client', '-o', 'client_ws1']).returns({}) +        provider.expects(:p4).with(['client', '-i'], spec) +        provider.expects(:p4).with(['sync', resource.value(:source) + "@" + resource.value(:revision)]) +        provider.create +      end +    end + +    context 'without revision' do +      it "should just execute 'p4 sync' without a revision" do +        resource[:source] = 'something' +        ENV['P4CLIENT'] = 'client_ws2' + +        provider.expects(:p4).with(['client', '-o', 'client_ws2']).returns({}) +        provider.expects(:p4).with(['client', '-i'], spec) +        provider.expects(:p4).with(['sync', resource.value(:source)]) +        provider.create +      end +    end + +    context "when a client and source are not given" do +      it "should execute 'p4 client'" do +        ENV['P4CLIENT'] = nil + +        path = resource.value(:path) +      host = Facter.value('hostname') +        default = "puppet-" + Digest::MD5.hexdigest(path + host) + +        provider.expects(:p4).with(['client', '-o', default]).returns({}) +        provider.expects(:p4).with(['client', '-i'], spec) +        provider.create +      end +    end +  end + +  describe 'destroying' do +    it "it should remove the directory" do +      ENV['P4CLIENT'] = 'test_client' + +      provider.expects(:p4).with(['client', '-d', '-f', 'test_client']) +      expects_rm_rf +      provider.destroy +    end +  end + +  describe "checking existence" do +    it "should check for the directory" do +      provider.expects(:p4).with(['info'], {:marshal => false}).returns({}) +      provider.expects(:p4).with(['where', resource.value(:path) + "..."], {:raise => false}).returns({}) +      provider.exists? +    end +  end + +end diff --git a/spec/unit/puppet/provider/vcsrepo/svn_spec.rb b/spec/unit/puppet/provider/vcsrepo/svn_spec.rb new file mode 100644 index 00000000..6a37c205 --- /dev/null +++ b/spec/unit/puppet/provider/vcsrepo/svn_spec.rb @@ -0,0 +1,160 @@ +require 'spec_helper' + +describe Puppet::Type.type(:vcsrepo).provider(:svn) do + +  let(:resource) { Puppet::Type.type(:vcsrepo).new({ +    :name     => 'test', +    :ensure   => :present, +    :provider => :svn, +    :path     => '/tmp/vcsrepo', +  })} + +  let(:provider) { resource.provider } + +  before :each do +    Puppet::Util.stubs(:which).with('git').returns('/usr/bin/git') +  end + +  describe 'creating' do +    context 'with source and revision' do +      it "should execute 'svn checkout' with a revision" do +        resource[:source] = 'exists' +        resource[:revision] = '1' +        provider.expects(:svn).with('--non-interactive', 'checkout', '-r', +          resource.value(:revision), +          resource.value(:source), +          resource.value(:path)) +        provider.create +      end +    end +    context 'with source' do +      it "should just execute 'svn checkout' without a revision" do +        resource[:source] = 'exists' +        provider.expects(:svn).with('--non-interactive', 'checkout', +          resource.value(:source), +          resource.value(:path)) +        provider.create +      end +    end + +    context 'with fstype' do +      it "should execute 'svnadmin create' with an '--fs-type' option" do +        resource[:fstype] = 'ext4' +        provider.expects(:svnadmin).with('create', '--fs-type', +                                          resource.value(:fstype), +                                          resource.value(:path)) +        provider.create +      end +    end +    context 'without fstype' do +      it "should execute 'svnadmin create' without an '--fs-type' option" do +        provider.expects(:svnadmin).with('create', resource.value(:path)) +        provider.create +      end +    end +     +    context "with depth" do +      it "should execute 'svn checkout' with a depth" do +        resource[:source] = 'exists' +        resource[:depth] = 'infinity' +        provider.expects(:svn).with('--non-interactive', 'checkout', '--depth', 'infinity', +          resource.value(:source), +          resource.value(:path)) +        provider.create +      end +    end +     +    context "with trust_server_cert" do +      it "should execute 'svn checkout' without a trust-server-cert" do +        resource[:source] = 'exists' +        resource[:trust_server_cert] = :false +        provider.expects(:svn).with('--non-interactive', 'checkout', +          resource.value(:source), +          resource.value(:path)) +        provider.create +      end +      it "should execute 'svn checkout' with a trust-server-cert" do +        resource[:source] = 'exists' +        resource[:trust_server_cert] = :true +        provider.expects(:svn).with('--non-interactive', '--trust-server-cert', 'checkout', +          resource.value(:source), +          resource.value(:path)) +        provider.create +      end +    end +  end + +  describe 'destroying' do +    it "it should remove the directory" do +      expects_rm_rf +      provider.destroy +    end +  end + +  describe "checking existence" do +    it "should check for the directory" do +      expects_directory?(true, resource.value(:path)) +      expects_directory?(true, File.join(resource.value(:path), '.svn')) +      provider.exists? +    end +  end + +  describe "checking the revision property" do +    before do +      provider.expects(:svn).with('--non-interactive', 'info').returns(fixture(:svn_info)) +    end +    it "should use 'svn info'" do +      expects_chdir +      expect(provider.revision).to eq('4') # From 'Revision', not 'Last Changed Rev' +    end +  end + +  describe "setting the revision property" do +    before do +      @revision = '30' +    end +    context 'with conflict' do +      it "should use 'svn update'" do +        resource[:conflict] = 'theirs-full' +        expects_chdir +        provider.expects(:svn).with('--non-interactive', 'update', +                                    '-r', @revision, +                                    '--accept', resource.value(:conflict)) +        provider.revision = @revision +      end +    end +    context 'without conflict' do +      it "should use 'svn update'" do +        expects_chdir +        provider.expects(:svn).with('--non-interactive', 'update', '-r', @revision) +        provider.revision = @revision +      end +    end +  end + +  describe "setting the revision property and repo source" do +    before do +      @revision = '30' +    end +    context 'with conflict' do +      it "should use 'svn switch'" do +        resource[:source] = 'an-unimportant-value' +        resource[:conflict] = 'theirs-full' +        expects_chdir +        provider.expects(:svn).with('--non-interactive', 'switch', +                                    '-r', @revision, 'an-unimportant-value', +                                    '--accept', resource.value(:conflict)) +        provider.revision = @revision +      end +    end +    context 'without conflict' do +      it "should use 'svn switch'" do +        resource[:source] = 'an-unimportant-value' +        expects_chdir +        provider.expects(:svn).with('--non-interactive', 'switch', '-r', @revision, 'an-unimportant-value') +        provider.revision = @revision +      end +    end +  end + +end | 
