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
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 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'" 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)
@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
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
end
context "and 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 end
end end
end end
end context "when ensure => bare", :resource => {:ensure => :bare} do
context "when a source is not given" do context "when a revision is given", :resource => {:revision => 'abcdef'} do
before 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(:source).returns(nil) subject.create
end
end
context "when a revision is not given" do
it "should just execute 'git clone --bare'" do
subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path))
subject.create
end
end
end end
context "when ensure = present" do end
before { @resource.expects(:value).with(:ensure).returns(:present).at_least_once }
context "when a source is not given" do
context "when ensure => present", :resource => {:ensure => :present} do
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
describe 'when destroying' do context 'when destroying' do
it "it should remove the directory" do it "it should remove the directory" do
@resource.expects(:value).with(:path).returns(@path).at_least_once FileUtils.expects(:rm_rf).with(resource.value(:path))
FileUtils.expects(:rm_rf).with(@path) provider.destroy
@provider.destroy end
end end
end
describe "when checking the revision property" do context "when checking the revision property" do
context "when given a non-SHA ref as the resource revision" 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 curent SHA" do context "when its SHA is not different than the current SHA" do
it "should return the ref" do it "should return the ref" do
@resource.expects(:value).with(:path).returns(@path).at_least_once expects_chdir
@provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') 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')
@provider.expects(:git).with('rev-parse', 'a-tag').returns('currentsha') provider.revision.should == 'a-tag'
Dir.expects(:chdir).with(@path).twice.yields end
@provider.revision.should == 'a-tag' 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 its SHA is different than 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('a-tag').at_least_once expects_chdir
@provider.expects(:git).with('rev-parse', 'a-tag').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
context "when given a SHA ref as the resource revision" do
context "when it is the same as the current SHA" do context "when setting the revision property" do
it "should return it" do it "should use 'git fetch' and 'git reset'" do
@resource.expects(:value).with(:path).returns(@path).at_least_once expects_chdir
@provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha') provider.expects('git').with('fetch', 'origin')
@resource.expects(:value).with(:revision).returns('currentsha').at_least_once provider.expects('git').with('reset', '--hard', 'carcar')
@provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha') provider.revision = 'carcar'
Dir.expects(:chdir).with(@path).twice.yields
@provider.revision.should == 'currentsha'
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'
end
end end
end end
end
describe "when setting the revision property" do context "when updating references" do
it "should use 'git fetch' and 'git reset'" do it "should use 'git fetch --tags'" do
@resource.expects(:value).with(:path).returns(@path).at_least_once expects_chdir
@provider.expects('git').with('pull', 'origin') provider.expects('git').with('fetch', '--tags', 'origin')
Dir.expects(:chdir).with(@path).at_least_once.yields provider.update_references
@provider.expects('git').with('reset', '--hard', 'carcar') end
@provider.revision = 'carcar'
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 end

View File

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