Move support file
[puppet_vcsrepo.git] / spec / support / provider_example_group.rb
1 class ProviderExampleGroup < Spec::Example::ExampleGroup
2
3   attr_reader :resource
4   
5   before :each do
6     resource_hash = example_group_hierarchy.inject({}) do |memo, klass|
7       memo.merge(klass.options[:resource] || {})
8     end
9     full_hash = resource_hash.merge(:provider => described_class.name)
10     @resource = described_class.resource_type.new(full_hash)
11   end
12   
13   subject { described_class.new(@resource) }
14   alias :provider :subject
15
16   class << self
17
18     def field(field, &block)
19       ResourceField.new(self, field, &block)
20     end
21
22     # call-seq:
23     #
24     #   given(:ensure)
25     #   given(:ensure => :present)
26     def resource_with(*args, &block)
27       options = args.last.is_a?(Hash) ? args.pop : {}
28       if args.empty?
29         text = options.map { |k, v| "#{k} => #{v.inspect}" }.join(' and with ')
30         context("and with #{text}", {:resource => options}, &block)
31       else
32         text = args.join(', ')
33         placeholders = args.inject({}) { |memo, key| memo.merge(key => 'an-unimportant-value') }
34         context("and with a #{text}", {:resource => placeholders}, &block)
35       end
36     end
37
38     def resource_without(field, &block)
39       context("and without a #{field}", &block)
40     end
41       
42   end
43
44 end
45
46 Spec::Example::ExampleGroupFactory.register(:provider, ProviderExampleGroup)
47
48 def describe_provider(type_name, provider_name, options = {}, &block)
49   provider_class = Puppet::Type.type(type_name).provider(provider_name)
50   describe(provider_class, options.merge(:type => :provider), &block)
51 end