diff options
| -rw-r--r-- | lib/puppet/provider/vcsrepo/git.rb | 6 | ||||
| -rw-r--r-- | spec/spec_helper.rb | 11 | ||||
| -rw-r--r-- | spec/support/fixture_helpers.rb | 7 | ||||
| -rw-r--r-- | spec/support/provider_subject.rb | 7 | ||||
| -rw-r--r-- | spec/support/resource_helpers.rb | 27 | ||||
| -rw-r--r-- | spec/support/vcsrepo_helpers.rb | 12 | ||||
| -rw-r--r-- | spec/unit/puppet/provider/vcsrepo/git_spec.rb | 273 | ||||
| -rw-r--r-- | spec/unit/puppet/type/README.markdown | 4 | 
8 files changed, 183 insertions, 164 deletions
diff --git a/lib/puppet/provider/vcsrepo/git.rb b/lib/puppet/provider/vcsrepo/git.rb index ba5065e..df85ff0 100644 --- a/lib/puppet/provider/vcsrepo/git.rb +++ b/lib/puppet/provider/vcsrepo/git.rb @@ -37,7 +37,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)    end    def revision=(desired) -    pull +    fetch      reset(desired)    end @@ -78,9 +78,9 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)      git(*args)    end -  def pull +  def fetch      at_path do -      git('pull', 'origin') +      git('fetch', 'origin')      end    end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1938658..40b79f1 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -7,17 +7,14 @@ require 'puppet'  gem 'rspec', '=1.2.9'  require 'spec/autorun' -module Helpers - -  def fixture(name, ext = '.txt') -    File.read(File.join(File.dirname(__FILE__), 'fixtures', name.to_s + ext)) -  end -   +Dir[File.join(File.dirname(__FILE__), 'support', '*.rb')].each do |support_file| +  require support_file  end  Spec::Runner.configure do |config|    config.mock_with :mocha -  config.include(Helpers) +  config.include(FixtureHelpers) +  config.include(VcsrepoHelpers)  end  # We need this because the RAL uses 'should' as a method.  This diff --git a/spec/support/fixture_helpers.rb b/spec/support/fixture_helpers.rb new file mode 100644 index 0000000..7b7b20a --- /dev/null +++ b/spec/support/fixture_helpers.rb @@ -0,0 +1,7 @@ +module FixtureHelpers + +  def fixture(name, ext = '.txt') +    File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', name.to_s + ext)) +  end +   +end diff --git a/spec/support/provider_subject.rb b/spec/support/provider_subject.rb new file mode 100644 index 0000000..de7ce7c --- /dev/null +++ b/spec/support/provider_subject.rb @@ -0,0 +1,7 @@ +module ProviderSubject + +  def provider +    subject +  end + +end diff --git a/spec/support/resource_helpers.rb b/spec/support/resource_helpers.rb new file mode 100644 index 0000000..8327ec0 --- /dev/null +++ b/spec/support/resource_helpers.rb @@ -0,0 +1,27 @@ +class ProviderExampleGroup < Spec::Example::ExampleGroup + +  attr_reader :resource +   +  before :each do +    resource_hash = example_group_hierarchy.inject({}) do |memo, klass| +      memo.merge(klass.options[:resource] || {}) +    end +    full_hash = resource_hash.merge(:provider => described_class.name) +    @resource = described_class.resource_type.new(full_hash) +  end +   +  subject { described_class.new(@resource) } +  alias :provider :subject + +  def _(name) +    resource.value(name) +  end + +end + +Spec::Example::ExampleGroupFactory.register(:provider, ProviderExampleGroup) + +def describe_provider(type_name, provider_name, options = {}, &block) +  provider_class = Puppet::Type.type(type_name).provider(provider_name) +  describe(provider_class, options.merge(:type => :provider), &block) +end diff --git a/spec/support/vcsrepo_helpers.rb b/spec/support/vcsrepo_helpers.rb new file mode 100644 index 0000000..e0b9beb --- /dev/null +++ b/spec/support/vcsrepo_helpers.rb @@ -0,0 +1,12 @@ +module VcsrepoHelpers + +  def expects_chdir +    Dir.expects(:chdir).with(resource.value(:path)).at_least_once.yields +  end +   +  def expects_mkdir +    Dir.expects(:mkdir).with(resource.value(:path)).at_least_once +  end + +   +end diff --git a/spec/unit/puppet/provider/vcsrepo/git_spec.rb b/spec/unit/puppet/provider/vcsrepo/git_spec.rb index 0e16e60..c18490f 100644 --- a/spec/unit/puppet/provider/vcsrepo/git_spec.rb +++ b/spec/unit/puppet/provider/vcsrepo/git_spec.rb @@ -1,204 +1,169 @@  require 'pathname'; Pathname.new(__FILE__).realpath.ascend { |x| begin; require (x + 'spec_helper.rb'); break; rescue LoadError; end } -provider_class = Puppet::Type.type(:vcsrepo).provider(:git) - -describe provider_class do - -  before :each do -    @resource = stub("resource") -    @provider = provider_class.new(@resource) -    @path = '/tmp/vcsrepo' -  end - -  describe 'when creating' do -    context "and when a source is given" do -      before do -        @resource.expects(:value).with(:source).returns('git://example.com/repo.git').at_least_once -      end -      context "and when ensure = present" do -        before do -          @resource.expects(:value).with(:ensure).returns(:present).at_least_once -        end -        context "and when a revision is given" do -          it "should execute 'git clone' and 'git reset'" do -            @resource.expects(:value).with(:path).returns(@path).at_least_once -            @provider.expects(:git).with('clone', 'git://example.com/repo.git', @path) -            @resource.expects(:value).with(:revision).returns('abcdef').at_least_once -            Dir.expects(:chdir).with(@path).yields -            @provider.expects('git').with('reset', '--hard', 'abcdef') -            @provider.create -          end         +describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do +   +  context 'when creating' do +    context "when a source is given", :resource => {:source => 'git://example.com/repo.git'} do +      context "when ensure => present", :resource => {:ensure => :present} do +        context "when a revision is given", :resource => {:revision => 'abcdef'} do +          it "should execute 'git clone' and 'git reset --hard'" do +            provider.expects('git').with('clone', resource.value(:source), resource.value(:path)) +            expects_chdir +            provider.expects('git').with('reset', '--hard', 'abcdef') +            provider.create +          end          end -        context "and when a revision is not given" do +         +        context "when a revision is not given" do            it "should just execute 'git clone'" do -            @resource.expects(:value).with(:path).returns(@path).at_least_once -            @resource.expects(:value).with(:revision).returns(nil).at_least_once -            @provider.expects(:git).with('clone', 'git://example.com/repo.git', @path) -            @provider.create -          end         +            provider.expects(:git).with('clone', 'git://example.com/repo.git', resource.value(:path)) +            provider.create +          end          end        end -      context "and when ensure = bare" do -        before do -          @resource.expects(:value).with(:ensure).returns(:bare).at_least_once -        end -        context "and when a revision is given" do +       +      context "when ensure => bare", :resource => {:ensure => :bare} do +        context "when a revision is given", :resource => {:revision => 'abcdef'} do            it "should just execute 'git clone --bare'" do -            @resource.expects(:value).with(:path).returns(@path).at_least_once -            @resource.expects(:value).with(:revision).returns(nil).at_least_once -            @provider.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', @path) -            @provider.create -          end         +            subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path)) +            subject.create +          end          end -        context "and when a revision is not given" do +         +        context "when a revision is not given" do            it "should just execute 'git clone --bare'" do -            @resource.expects(:value).with(:path).returns(@path).at_least_once -            @resource.expects(:value).with(:revision).returns(nil).at_least_once -            @provider.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', @path) -            @provider.create -          end         +            subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path)) +            subject.create +          end          end        end -      end +          context "when a source is not given" do -      before do -        @resource.expects(:value).with(:path).returns(@path).at_least_once -        @resource.expects(:value).with(:source).returns(nil) -      end -      context "when ensure = present" do -        before { @resource.expects(:value).with(:ensure).returns(:present).at_least_once } +      context "when ensure => present", :resource => {:ensure => :present} do          context "when the path does not exist" do            it "should execute 'git init'" do -            Dir.expects(:mkdir).with(@path) -            Dir.expects(:chdir).with(@path).yields -            @provider.expects(:bare_exists?).returns(false) -            File.expects(:directory?).with(@path).returns(false) -            @provider.expects(:git).with('init') -            @provider.create +            expects_mkdir +            expects_chdir +            provider.expects(:bare_exists?).returns(false) +            File.expects(:directory?).with(resource.value(:path)).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 -            @provider.expects(:bare_exists?).returns(true) -            @provider.expects(:convert_bare_to_working_copy) -            @provider.create +            provider.expects(:bare_exists?).returns(true) +            provider.expects(:convert_bare_to_working_copy) +            provider.create            end          end +                  context "when the path is not a repository" do            it "should raise an exception" do -            File.expects(:directory?).with(@path).returns(true) -            @provider.expects(:bare_exists?).returns(false) -            proc { -              @provider.create -            }.should raise_error(Puppet::Error) +            File.expects(:directory?).with(resource.value(:path)).returns(true) +            provider.expects(:bare_exists?).returns(false) +            proc { provider.create }.should raise_error(Puppet::Error)            end          end        end -      context "when ensure = bare" do -        before { @resource.expects(:value).with(:ensure).returns(:bare).at_least_once }  +       +      context "when ensure = bare", :resource => {:ensure => :bare} do          context "when the path does not exist" do            it "should execute 'git init --bare'" do -            Dir.expects(:chdir).with(@path).yields -            File.expects(:directory?).with(@path).returns(false) -            FileUtils.expects(:mkdir).with(@path) -            @provider.expects(:working_copy_exists?).returns(false) -            @provider.expects(:git).with('init', '--bare') -            @provider.create +            expects_chdir +            expects_mkdir +            File.expects(:directory?).with(resource.value(:path)).returns(false) +            provider.expects(:working_copy_exists?).returns(false) +            provider.expects(:git).with('init', '--bare') +            provider.create            end          end +                  context "when the path is a working copy repository" do            it "should convert it to a bare repository" do -            @provider.expects(:working_copy_exists?).returns(true) -            @provider.expects(:convert_working_copy_to_bare) -            @provider.create +            provider.expects(:working_copy_exists?).returns(true) +            provider.expects(:convert_working_copy_to_bare) +            provider.create            end          end +                  context "when the path is not a repository" do            it "should raise an exception" do -            File.expects(:directory?).with(@path).returns(true) -            @provider.expects(:working_copy_exists?).returns(false) -            proc { -              @provider.create -            }.should raise_error(Puppet::Error) +            File.expects(:directory?).with(resource.value(:path)).returns(true) +            provider.expects(:working_copy_exists?).returns(false) +            proc { provider.create }.should raise_error(Puppet::Error)            end          end        end      end -  end - -  describe 'when destroying' do -    it "it should remove the directory" do -      @resource.expects(:value).with(:path).returns(@path).at_least_once -      FileUtils.expects(:rm_rf).with(@path) -      @provider.destroy -    end -  end - -  describe "when checking the revision property" do -    context "when given a non-SHA ref as the resource revision" do -      context "when its SHA is not different than the curent SHA" do -        it "should return the ref" do -          @resource.expects(:value).with(:path).returns(@path).at_least_once -          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') -          @resource.expects(:value).with(:revision).returns('a-tag').at_least_once -          @provider.expects(:git).with('rev-parse', 'a-tag').returns('currentsha') -          Dir.expects(:chdir).with(@path).twice.yields -          @provider.revision.should == 'a-tag' -        end -      end -      context "when its SHA is different than the current SHA" do -        it "should return the current SHA" do -          @resource.expects(:value).with(:path).returns(@path).at_least_once -          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') -          @resource.expects(:value).with(:revision).returns('a-tag').at_least_once -          @provider.expects(:git).with('rev-parse', 'a-tag').returns('othersha') -          Dir.expects(:chdir).with(@path).twice.yields -          @provider.revision.should == 'currentsha' -        end           +     +    context 'when destroying' do +      it "it should remove the directory" do +        FileUtils.expects(:rm_rf).with(resource.value(:path)) +        provider.destroy        end      end -    context "when given a SHA ref as the resource revision" do -      context "when it is the same as the current SHA" do -        it "should return it" do -          @resource.expects(:value).with(:path).returns(@path).at_least_once -          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') -          @resource.expects(:value).with(:revision).returns('currentsha').at_least_once -          @provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha') -          Dir.expects(:chdir).with(@path).twice.yields -          @provider.revision.should == 'currentsha' +     +    context "when checking the revision property" do +      context "when given a non-SHA ref as the resource revision", :resource => {:revision => 'a-tag'} do +        context "when its SHA is not different than the current SHA" do +          it "should return the ref" do +            expects_chdir +            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') +            provider.expects(:git).with('rev-parse', 'a-tag').returns('currentsha') +            provider.revision.should == 'a-tag' +          end +        end +         +        context "when its SHA is different than the current SHA" do +          it "should return the current SHA" do +            expects_chdir +            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') +            provider.expects(:git).with('rev-parse', 'a-tag').returns('othersha') +            provider.revision.should == 'currentsha' +          end          end        end -      context "when it is not the same as the current SHA" do -        it "should return the current SHA" do -          @resource.expects(:value).with(:path).returns(@path).at_least_once -          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') -          @resource.expects(:value).with(:revision).returns('othersha').at_least_once -          @provider.expects(:git).with('rev-parse', 'othersha').returns('othersha') -          Dir.expects(:chdir).with(@path).twice.yields -          @provider.revision.should == 'currentsha' +       +      context "when given a SHA ref as the resource revision" do +        context "when it is the same as the current SHA", :resource => {:revision => 'currentsha'} do +          it "should return it" do +            expects_chdir +            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') +            provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha') +            provider.revision.should == 'currentsha' +          end +        end +         +        context "when it is not the same as the current SHA", :resource => {:revision => 'othersha'} do +          it "should return the current SHA" do +            expects_chdir +            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') +            provider.expects(:git).with('rev-parse', 'othersha').returns('othersha') +            provider.revision.should == 'currentsha' +          end          end        end      end -  end - -  describe "when setting the revision property" do -    it "should use 'git fetch' and 'git reset'" do -      @resource.expects(:value).with(:path).returns(@path).at_least_once -      @provider.expects('git').with('pull', 'origin') -      Dir.expects(:chdir).with(@path).at_least_once.yields -      @provider.expects('git').with('reset', '--hard', 'carcar') -      @provider.revision = 'carcar' +     +    context "when setting the revision property" do +      it "should use 'git fetch' and 'git reset'" do +        expects_chdir +        provider.expects('git').with('fetch', 'origin') +        provider.expects('git').with('reset', '--hard', 'carcar') +        provider.revision = 'carcar' +      end      end +     +    context "when updating references" do +      it "should use 'git fetch --tags'" do +        expects_chdir +        provider.expects('git').with('fetch', '--tags', 'origin') +        provider.update_references +      end +    end +        end - -  describe "when updating references" do -    it "should use 'git fetch --tags'" do -      @resource.expects(:value).with(:path).returns(@path).at_least_once -      @provider.expects('git').with('fetch', '--tags', 'origin') -      Dir.expects(:chdir).with(@path).at_least_once.yields -      @provider.update_references -    end     -  end -  end diff --git a/spec/unit/puppet/type/README.markdown b/spec/unit/puppet/type/README.markdown new file mode 100644 index 0000000..1ee19ac --- /dev/null +++ b/spec/unit/puppet/type/README.markdown @@ -0,0 +1,4 @@ +Resource Type Specs +=================== + +Define specs for your resource types in this directory.  | 
