Merge pull request #31 from ghoneycutt/noticket/master/missing_trailing_comma
[puppet_vcsrepo.git] / spec / support / provider_example_group.rb
1 class ProviderExampleGroup < Spec::Example::ExampleGroup
2
3   # Allow access to the current resource
4   attr_reader :resource
5
6   # Build up the values for the resource in this scope
7   before :each do
8     resource_hash = example_group_hierarchy.inject({}) do |memo, klass|
9       memo.merge(klass.options[:resource] || {})
10     end
11     full_hash = resource_hash.merge(:provider => described_class.name)
12     @resource = described_class.resource_type.new(full_hash)
13   end
14
15   # Build the provider
16   subject { described_class.new(@resource) }
17
18   # Allow access to it via +provider+
19   alias :provider :subject
20
21   # Generate a context for a provider operating on a resource with:
22   #
23   # call-seq:
24   #
25   #   # A parameter/property set (when the value isn't important)
26   #   resource_with :source do
27   #     # ...
28   #   end
29   #
30   #   # A parameter/property set to a specific value
31   #   resource_with :source => 'a-specific-value' do
32   #     # ...
33   #   end
34   #
35   # Note: Choose one or the other (mixing will create two separate contexts)
36   #
37   def self.resource_with(*params, &block)
38     params_with_values = params.last.is_a?(Hash) ? params.pop : {}
39     build_value_context(params_with_values, &block)
40     build_existence_context(*params, &block)
41   end
42
43   def self.build_existence_context(*params, &block) #:nodoc:
44     unless params.empty?
45       text = params.join(', ')
46       placeholders = params.inject({}) { |memo, key| memo.merge(key => 'an-unimportant-value') }
47       context("and with a #{text}", {:resource => placeholders}, &block)
48     end
49   end
50
51   def self.build_value_context(params = {}, &block) #:nodoc:
52     unless params.empty?
53       text = params.map { |k, v| "#{k} => #{v.inspect}" }.join(' and with ')
54       context("and with #{text}", {:resource => params}, &block)
55     end
56   end
57
58
59   # Generate a context for a provider operating on a resource without
60   # a given parameter/property.
61   #
62   # call-seq:
63   #
64   #   resource_without :source do
65   #     # ...
66   #   end
67   #
68   def self.resource_without(field, &block)
69     context("and without a #{field}", &block)
70   end
71
72 end
73
74 Spec::Example::ExampleGroupFactory.register(:provider, ProviderExampleGroup)
75
76 # Outside wrapper to lookup a provider and start the spec using ProviderExampleGroup
77 def describe_provider(type_name, provider_name, options = {}, &block)
78   provider_class = Puppet::Type.type(type_name).provider(provider_name)
79   describe(provider_class, options.merge(:type => :provider), &block)
80 end