Build ProviderExampleGroup for refactored provider tests

This commit is contained in:
Bruce Williams
2010-03-17 20:23:22 -07:00
parent 4b8e7074e6
commit 532cfbb181
8 changed files with 183 additions and 164 deletions

View File

@@ -37,7 +37,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
end end
def revision=(desired) def revision=(desired)
pull fetch
reset(desired) reset(desired)
end end
@@ -78,9 +78,9 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
git(*args) git(*args)
end end
def pull def fetch
at_path do at_path do
git('pull', 'origin') git('fetch', 'origin')
end end
end end

View File

@@ -7,17 +7,14 @@ require 'puppet'
gem 'rspec', '=1.2.9' gem 'rspec', '=1.2.9'
require 'spec/autorun' require 'spec/autorun'
module Helpers Dir[File.join(File.dirname(__FILE__), 'support', '*.rb')].each do |support_file|
require support_file
def fixture(name, ext = '.txt')
File.read(File.join(File.dirname(__FILE__), 'fixtures', name.to_s + ext))
end
end end
Spec::Runner.configure do |config| Spec::Runner.configure do |config|
config.mock_with :mocha config.mock_with :mocha
config.include(Helpers) config.include(FixtureHelpers)
config.include(VcsrepoHelpers)
end end
# We need this because the RAL uses 'should' as a method. This # We need this because the RAL uses 'should' as a method. This

View File

@@ -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

View File

@@ -0,0 +1,7 @@
module ProviderSubject
def provider
subject
end
end

View File

@@ -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

View File

@@ -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

View File

@@ -1,204 +1,169 @@
require 'pathname'; Pathname.new(__FILE__).realpath.ascend { |x| begin; require (x + 'spec_helper.rb'); break; rescue LoadError; end } 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 :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
describe provider_class do context 'when creating' do
context "when a source is given", :resource => {:source => 'git://example.com/repo.git'} do
before :each do context "when ensure => present", :resource => {:ensure => :present} do
@resource = stub("resource") context "when a revision is given", :resource => {:revision => 'abcdef'} do
@provider = provider_class.new(@resource) it "should execute 'git clone' and 'git reset --hard'" do
@path = '/tmp/vcsrepo' provider.expects('git').with('clone', resource.value(:source), resource.value(:path))
end expects_chdir
provider.expects('git').with('reset', '--hard', 'abcdef')
describe 'when creating' do provider.create
context "and when a source is given" do end
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 end
context "and when a revision is given" do
it "should execute 'git clone' and 'git reset'" do context "when a revision is not given" 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
end
context "and when a revision is not given" do
it "should just execute 'git clone'" do it "should just execute 'git clone'" do
@resource.expects(:value).with(:path).returns(@path).at_least_once provider.expects(:git).with('clone', 'git://example.com/repo.git', resource.value(:path))
@resource.expects(:value).with(:revision).returns(nil).at_least_once provider.create
@provider.expects(:git).with('clone', 'git://example.com/repo.git', @path) end
@provider.create
end
end end
end end
context "and when ensure = bare" do
before do context "when ensure => bare", :resource => {:ensure => :bare} do
@resource.expects(:value).with(:ensure).returns(:bare).at_least_once context "when a revision is given", :resource => {:revision => 'abcdef'} do
end
context "and when a revision is given" do
it "should just execute 'git clone --bare'" do it "should just execute 'git clone --bare'" do
@resource.expects(:value).with(:path).returns(@path).at_least_once subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path))
@resource.expects(:value).with(:revision).returns(nil).at_least_once subject.create
@provider.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', @path) end
@provider.create
end
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 it "should just execute 'git clone --bare'" do
@resource.expects(:value).with(:path).returns(@path).at_least_once subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path))
@resource.expects(:value).with(:revision).returns(nil).at_least_once subject.create
@provider.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', @path) end
@provider.create
end
end end
end end
end end
context "when a source is not given" do context "when a source is not given" do
before do context "when ensure => present", :resource => {:ensure => :present} 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 the path does not exist" do context "when the path does not exist" do
it "should execute 'git init'" do it "should execute 'git init'" do
Dir.expects(:mkdir).with(@path) expects_mkdir
Dir.expects(:chdir).with(@path).yields expects_chdir
@provider.expects(:bare_exists?).returns(false) provider.expects(:bare_exists?).returns(false)
File.expects(:directory?).with(@path).returns(false) File.expects(:directory?).with(resource.value(:path)).returns(false)
@provider.expects(:git).with('init') provider.expects(:git).with('init')
@provider.create provider.create
end end
end end
context "when the path is a bare repository" do context "when the path is a bare repository" do
it "should convert it to a working copy" do it "should convert it to a working copy" do
@provider.expects(:bare_exists?).returns(true) provider.expects(:bare_exists?).returns(true)
@provider.expects(:convert_bare_to_working_copy) provider.expects(:convert_bare_to_working_copy)
@provider.create provider.create
end end
end end
context "when the path is not a repository" do context "when the path is not a repository" do
it "should raise an exception" do it "should raise an exception" do
File.expects(:directory?).with(@path).returns(true) File.expects(:directory?).with(resource.value(:path)).returns(true)
@provider.expects(:bare_exists?).returns(false) provider.expects(:bare_exists?).returns(false)
proc { proc { provider.create }.should raise_error(Puppet::Error)
@provider.create
}.should raise_error(Puppet::Error)
end end
end 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 context "when the path does not exist" do
it "should execute 'git init --bare'" do it "should execute 'git init --bare'" do
Dir.expects(:chdir).with(@path).yields expects_chdir
File.expects(:directory?).with(@path).returns(false) expects_mkdir
FileUtils.expects(:mkdir).with(@path) File.expects(:directory?).with(resource.value(:path)).returns(false)
@provider.expects(:working_copy_exists?).returns(false) provider.expects(:working_copy_exists?).returns(false)
@provider.expects(:git).with('init', '--bare') provider.expects(:git).with('init', '--bare')
@provider.create provider.create
end end
end end
context "when the path is a working copy repository" do context "when the path is a working copy repository" do
it "should convert it to a bare repository" do it "should convert it to a bare repository" do
@provider.expects(:working_copy_exists?).returns(true) provider.expects(:working_copy_exists?).returns(true)
@provider.expects(:convert_working_copy_to_bare) provider.expects(:convert_working_copy_to_bare)
@provider.create provider.create
end end
end end
context "when the path is not a repository" do context "when the path is not a repository" do
it "should raise an exception" do it "should raise an exception" do
File.expects(:directory?).with(@path).returns(true) File.expects(:directory?).with(resource.value(:path)).returns(true)
@provider.expects(:working_copy_exists?).returns(false) provider.expects(:working_copy_exists?).returns(false)
proc { proc { provider.create }.should raise_error(Puppet::Error)
@provider.create
}.should raise_error(Puppet::Error)
end end
end end
end end
end end
end
context 'when destroying' do
describe 'when destroying' do it "it should remove the directory" do
it "it should remove the directory" do FileUtils.expects(:rm_rf).with(resource.value(:path))
@resource.expects(:value).with(:path).returns(@path).at_least_once provider.destroy
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
end end
end end
context "when given a SHA ref as the resource revision" do
context "when it is the same as the current SHA" do context "when checking the revision property" do
it "should return it" do context "when given a non-SHA ref as the resource revision", :resource => {:revision => 'a-tag'} do
@resource.expects(:value).with(:path).returns(@path).at_least_once context "when its SHA is not different than the current SHA" do
@provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') it "should return the ref" do
@resource.expects(:value).with(:revision).returns('currentsha').at_least_once expects_chdir
@provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha') provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
Dir.expects(:chdir).with(@path).twice.yields provider.expects(:git).with('rev-parse', 'a-tag').returns('currentsha')
@provider.revision.should == '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
end end
context "when it is not the same as the current SHA" do
it "should return the current SHA" do context "when given a SHA ref as the resource revision" do
@resource.expects(:value).with(:path).returns(@path).at_least_once context "when it is the same as the current SHA", :resource => {:revision => 'currentsha'} do
@provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') it "should return it" do
@resource.expects(:value).with(:revision).returns('othersha').at_least_once expects_chdir
@provider.expects(:git).with('rev-parse', 'othersha').returns('othersha') provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
Dir.expects(:chdir).with(@path).twice.yields provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha')
@provider.revision.should == '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
end end
end
context "when setting the revision property" do
describe "when setting the revision property" do it "should use 'git fetch' and 'git reset'" do
it "should use 'git fetch' and 'git reset'" do expects_chdir
@resource.expects(:value).with(:path).returns(@path).at_least_once provider.expects('git').with('fetch', 'origin')
@provider.expects('git').with('pull', 'origin') provider.expects('git').with('reset', '--hard', 'carcar')
Dir.expects(:chdir).with(@path).at_least_once.yields provider.revision = 'carcar'
@provider.expects('git').with('reset', '--hard', 'carcar') end
@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 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 end

View File

@@ -0,0 +1,4 @@
Resource Type Specs
===================
Define specs for your resource types in this directory.