fizzgig 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,18 @@
1
+ # 0.4.0
2
+ * Changed configuration style:
3
+ * Removed RSpec.configure interface
4
+ * Added OO interface to Fizzgig to allow storing configuration in
5
+ the Fizzgig instance
6
+ * Removed RSpec matchers; you can use the matchers from rspec-puppet
7
+ instead:
8
+
9
+ ```ruby
10
+ require 'rspec-puppet/matchers'
11
+ RSpec.configure do |c|
12
+ c.include RSpec::Puppet::ManifestMatchers
13
+ end
14
+ ```
15
+
1
16
  # 0.3.0
2
17
 
3
18
  * Changed API for #instantiate to take ruby Hash of params rather
@@ -5,8 +5,12 @@ Fizzgig is a library to help write fast unit tests.
5
5
 
6
6
  [source,ruby]
7
7
  -------------------------------------------
8
+ require 'spec_helper'
9
+ require 'fizzgig'
10
+
8
11
  describe 'nginx::site' do
9
- subject { Fizzgig.instantiate %q[nginx::site{'www.foo.com':}] }
12
+ let(:fizzgig) { Fizzgig.new({modulepath:MODULEPATH,manifestdir:MANIFESTDIR}) }
13
+ subject { fizzgig.instantiate 'nginx::site','www.foo.com',{} }
10
14
  it { should contain_file('/etc/nginx/sites-available/www.foo.com').
11
15
  with_content(/server_name\s+www.foo.com;/) }
12
16
  it { should contain_file('/etc/nginx/sites-enabled/www.foo.com').
@@ -23,7 +27,7 @@ which will instantiate a defined type and include a class
23
27
  respectively:
24
28
 
25
29
  [source,ruby]
26
- catalog = Fizzgig.instantiate %q[ nginx::site {'foo.com': max_age => 300 } ]
30
+ catalog = Fizzgig.instantiate 'nginx::site', 'foo.com', { max_age => 300 }
27
31
 
28
32
  [source,ruby]
29
33
  catalog = Fizzgig.include 'nginx'
@@ -104,7 +108,7 @@ And I write this test:
104
108
 
105
109
  [source,ruby]
106
110
  -------------
107
- catalog Fizzgig.instantiate %q[ nginx::ssl_site{'foo': } ]
111
+ catalog Fizzgig.instantiate 'nginx::ssl_site','foo'
108
112
  catalog.should contain_nginx__site('foo') # ok, will pass
109
113
  catalog.should contain_file('/etc/nginx/sites-enabled/foo') # ERROR, will fail
110
114
  -------------
data/TODO.org CHANGED
@@ -74,6 +74,7 @@ That's not so cool :(
74
74
  See govuk_nodes_spec_optional for examples of this.
75
75
  the rspec-puppet equivalent is :type => :host
76
76
  ** DONE implement defined types from ruby hashes
77
+ ** DONE update README to reflect defined type API change
77
78
  ** TODO implementation-independent dependency assertions
78
79
  ** TODO Test standalone puppet modules
79
80
  ** TODO better test output for files with large content
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'fizzgig'
3
- s.version = '0.3.0'
3
+ s.version = '0.4.0'
4
4
  s.homepage = 'https://github.com/philandstuff/fizzgig'
5
5
  s.summary = 'Tools for writing fast unit tests for Puppet'
6
6
  s.description = 'Tools for writing fast unit tests for Puppet'
@@ -11,6 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.add_dependency 'puppet'
12
12
  s.add_dependency 'lspace'
13
13
  s.add_development_dependency 'rspec'
14
+ s.add_development_dependency 'rspec-puppet'
14
15
 
15
16
  s.authors = ['Philip Potter']
16
17
  s.email = 'philip.g.potter@gmail.com'
@@ -1,20 +1,11 @@
1
1
  require 'puppet'
2
- require 'fizzgig/matchers'
3
2
  require 'fizzgig/function_stubs'
4
3
  require 'lspace'
5
4
 
6
- class Puppet::Resource::TypeCollection
7
- alias_method :find_or_load_real, :find_or_load
8
- def find_or_laod(namespaces, name, type)
9
- $stderr.puts "Resourcing #{name} #{type} in #{namespaces}"
10
- find_or_load_real(namespaces,name,type)
11
- end
12
- end
13
-
14
- module Fizzgig
15
- def self.instantiate(type,title,params={},options = {})
5
+ class Fizzgig
6
+ def self.instantiate(type,title,params,options = {})
16
7
  LSpace.with(:function_stubs => options[:stubs]) do
17
- setup_puppet
8
+ setup_fizzgig({modulepath: options[:modulepath],manifestdir: options[:manifestdir]})
18
9
  compiler = make_compiler(options[:facts])
19
10
  scope = compiler.newscope(nil)
20
11
  scope.source = Puppet::Resource::Type.new(:node,'localhost')
@@ -35,7 +26,7 @@ module Fizzgig
35
26
 
36
27
  def self.include(klass,options = {})
37
28
  LSpace.with(:function_stubs => options[:stubs]) do
38
- setup_puppet
29
+ setup_fizzgig({modulepath: options[:modulepath],manifestdir: options[:manifestdir]})
39
30
  compiler = make_compiler(options[:facts])
40
31
  compile("include #{klass}",compiler)
41
32
  compiler.catalog
@@ -44,7 +35,7 @@ module Fizzgig
44
35
 
45
36
  def self.node(hostname,options = {})
46
37
  LSpace.with(:function_stubs => options[:stubs]) do
47
- setup_puppet
38
+ setup_fizzgig({modulepath: options[:modulepath],manifestdir: options[:manifestdir]})
48
39
  Puppet[:code] = '' # we want puppet to import the Puppet[:manifest] file
49
40
  compiler = make_compiler(options[:facts], hostname)
50
41
  compiler.send :evaluate_ast_node
@@ -80,21 +71,34 @@ module Fizzgig
80
71
  parser.parse(code)
81
72
  end
82
73
 
83
- def self.setup_puppet
74
+ def self.setup_fizzgig(settings={})
84
75
  Puppet[:code] = ' ' # hack to suppress puppet from looking at Puppet[:manifest]
85
- Puppet[:modulepath] = RSpec.configuration.modulepath
86
- Puppet[:manifestdir] = RSpec.configuration.manifestdir
76
+ Puppet[:modulepath] = settings[:modulepath] || '/etc/puppet/modules'
77
+ Puppet[:manifestdir] = settings[:manifestdir] || nil
87
78
  # stop template() fn from complaining about missing vardir config
88
79
  Puppet[:vardir] ||= ""
80
+ # FIXME: decide if these are needed
81
+ #c.add_setting :manifest, :default => nil
82
+ #c.add_setting :template_dir, :default => nil
83
+ #c.add_setting :config, :default => nil
89
84
  end
90
- end
91
85
 
92
- RSpec.configure do |c|
93
- c.add_setting :modulepath, :default => '/etc/puppet/modules'
94
- c.add_setting :manifestdir, :default => nil
86
+ # ===== OO interface ======
87
+ # basically a glorified curried function to store the configuration
88
+
89
+ def initialize(settings={})
90
+ @modulepath = settings[:modulepath]
91
+ @manifestdir = settings[:manifestdir]
92
+ end
93
+
94
+ def instantiate(type,title,params,options={})
95
+ Fizzgig.instantiate(type,title,params,options.merge({modulepath: @modulepath, manifestdir: @manifestdir}))
96
+ end
95
97
 
96
- # FIXME: decide if these are needed
97
- #c.add_setting :manifest, :default => nil
98
- #c.add_setting :template_dir, :default => nil
99
- #c.add_setting :config, :default => nil
98
+ def include(classname,options={})
99
+ Fizzgig.include(classname,options.merge({modulepath: @modulepath, manifestdir: @manifestdir}))
100
+ end
101
+ def node(hostname,options={})
102
+ Fizzgig.node(hostname,options.merge({modulepath: @modulepath, manifestdir: @manifestdir}))
103
+ end
100
104
  end
@@ -1,28 +1,29 @@
1
+ class Fizzgig
2
+ module FunctionStubs
3
+ def self.has_stub?(fname,args)
4
+ stubs = LSpace[:function_stubs] || {}
5
+ stubs.has_key?(fname.to_sym) &&
6
+ stubs[fname.to_sym].has_key?(args)
7
+ end
1
8
 
2
- module Fizzgig::FunctionStubs
3
- def self.has_stub?(fname,args)
4
- stubs = LSpace[:function_stubs] || {}
5
- stubs.has_key?(fname.to_sym) &&
6
- stubs[fname.to_sym].has_key?(args)
7
- end
8
-
9
- def self.get_stub(fname,args)
10
- LSpace[:function_stubs][fname.to_sym][args]
9
+ def self.get_stub(fname,args)
10
+ LSpace[:function_stubs][fname.to_sym][args]
11
+ end
11
12
  end
12
- end
13
13
 
14
- class Puppet::Parser::AST
15
- class Function < AST::Branch
16
- alias_method :orig_evaluate, :evaluate
14
+ class Puppet::Parser::AST
15
+ class Function < AST::Branch
16
+ alias_method :orig_evaluate, :evaluate
17
17
 
18
- def evaluate(scope)
19
- #FIXME: are there implications around potential
20
- #double-evaluation here?
21
- args = @arguments.safeevaluate(scope).map { |x| x == :undef ? '' : x }
22
- if Fizzgig::FunctionStubs.has_stub?(@name,args)
23
- Fizzgig::FunctionStubs.get_stub(@name,args)
24
- else
25
- orig_evaluate(scope)
18
+ def evaluate(scope)
19
+ #FIXME: are there implications around potential
20
+ #double-evaluation here?
21
+ args = @arguments.safeevaluate(scope).map { |x| x == :undef ? '' : x }
22
+ if Fizzgig::FunctionStubs.has_stub?(@name,args)
23
+ Fizzgig::FunctionStubs.get_stub(@name,args)
24
+ else
25
+ orig_evaluate(scope)
26
+ end
26
27
  end
27
28
  end
28
29
  end
@@ -2,7 +2,8 @@ require 'spec_helper'
2
2
  require 'fizzgig'
3
3
 
4
4
  describe 'nginx::site' do
5
- subject { Fizzgig.instantiate 'nginx::site','www.foo.com' }
5
+ let(:fizzgig) { Fizzgig.new({modulepath:MODULEPATH,manifestdir:MANIFESTDIR}) }
6
+ subject { fizzgig.instantiate 'nginx::site','www.foo.com',{} }
6
7
  it { should contain_file('/etc/nginx/sites-available/www.foo.com').
7
8
  with_content(/server_name\s+www.foo.com;/) }
8
9
  it { should contain_file('/etc/nginx/sites-enabled/www.foo.com').
@@ -2,8 +2,9 @@ require 'spec_helper'
2
2
  require 'fizzgig'
3
3
 
4
4
  describe Fizzgig do
5
+ let(:fizzgig) { Fizzgig.new({modulepath: MODULEPATH, manifestdir: MANIFESTDIR}) }
5
6
  describe '#include' do
6
- subject { Fizzgig.include(classname, :stubs => stubs, :facts => facts) }
7
+ subject { fizzgig.include(classname, :stubs => stubs, :facts => facts) }
7
8
  let(:stubs) { {} }
8
9
  let(:facts) { {} }
9
10
 
@@ -69,7 +70,7 @@ describe Fizzgig do
69
70
  end
70
71
 
71
72
  describe '#instantiate' do
72
- subject { Fizzgig.instantiate(type, title, params, :stubs => stubs, :facts => facts) }
73
+ subject { fizzgig.instantiate(type, title, params, :stubs => stubs, :facts => facts) }
73
74
  let(:stubs) { {} }
74
75
  let(:facts) { {} }
75
76
  let(:params) { {} }
@@ -119,7 +120,7 @@ describe Fizzgig do
119
120
  end
120
121
 
121
122
  describe '#node' do
122
- subject { Fizzgig.node(hostname, :facts => facts) }
123
+ subject { fizzgig.node(hostname, :facts => facts) }
123
124
  let(:facts) { {} }
124
125
  context 'simple node' do
125
126
  let(:hostname) {'foo.com'}
@@ -1,11 +1,11 @@
1
1
  require 'rspec/autorun'
2
2
  require 'fizzgig'
3
+ require 'rspec-puppet/matchers'
3
4
 
4
5
  HERE = File.expand_path(File.dirname(__FILE__))
6
+ MODULEPATH = "#{File.join(HERE, 'modules')}:#{File.join(HERE, 'extra_modules')}"
7
+ MANIFESTDIR = File.join(HERE,'manifests')
5
8
 
6
9
  RSpec.configure do |c|
7
- c.modulepath = "#{File.join(HERE, 'modules')}:#{File.join(HERE, 'extra_modules')}"
8
- c.manifestdir = File.join(HERE,'manifests')
9
-
10
- c.include Fizzgig::CatalogMatchers
10
+ c.include RSpec::Puppet::ManifestMatchers
11
11
  end
@@ -0,0 +1,19 @@
1
+ require 'minitest/autorun'
2
+ require 'fizzgig'
3
+
4
+ HERE = File.expand_path(File.dirname(__FILE__))
5
+
6
+ MODULEPATH = "#{File.join(HERE, '../spec/modules')}:#{File.join(HERE, '../spec/extra_modules')}"
7
+ MANIFESTDIR = File.join(HERE,'../spec/manifests')
8
+
9
+ class TestNginxSite < MiniTest::Unit::TestCase
10
+ def setup
11
+ @fizzgig = Fizzgig.new({modulepath: MODULEPATH, manifestdir: MANIFESTDIR})
12
+ @catalog = @fizzgig.instantiate 'nginx::site','www.foo.com',{}
13
+ end
14
+
15
+ def test_has_sites_available_file
16
+ assert @catalog.resource('file',
17
+ '/etc/nginx/sites-available/www.foo.com')
18
+ end
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fizzgig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-09 00:00:00.000000000 Z
12
+ date: 2013-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: puppet
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec-puppet
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  description: Tools for writing fast unit tests for Puppet
63
79
  email: philip.g.potter@gmail.com
64
80
  executables: []
@@ -74,7 +90,6 @@ files:
74
90
  - fizzgig.gemspec
75
91
  - lib/fizzgig.rb
76
92
  - lib/fizzgig/function_stubs.rb
77
- - lib/fizzgig/matchers.rb
78
93
  - spec/example_spec.rb
79
94
  - spec/extra_modules/webapp/manifests/init.pp
80
95
  - spec/fizzgig/function_stubs_spec.rb
@@ -92,6 +107,7 @@ files:
92
107
  - spec/modules/nginx/templates/vhost.erb
93
108
  - spec/modules/params_test/manifests/init.pp
94
109
  - spec/spec_helper.rb
110
+ - test/example_test.rb
95
111
  homepage: https://github.com/philandstuff/fizzgig
96
112
  licenses: []
97
113
  post_install_message:
@@ -134,3 +150,4 @@ test_files:
134
150
  - spec/modules/nginx/templates/vhost.erb
135
151
  - spec/modules/params_test/manifests/init.pp
136
152
  - spec/spec_helper.rb
153
+ - test/example_test.rb
@@ -1,81 +0,0 @@
1
- require 'rspec'
2
- module Fizzgig
3
- module CatalogMatchers
4
- extend RSpec::Matchers::DSL
5
-
6
- class CatalogMatcher
7
- # matcher :contain_file do |expected_title|
8
- def initialize(expected_type,expected_title)
9
- @expected_type = expected_type
10
- @expected_title = expected_title
11
- @referenced_type = referenced_type(expected_type)
12
- end
13
-
14
- def matches?(catalog)
15
- @catalog = catalog
16
- resource = catalog.resource(@referenced_type,@expected_title)
17
- if resource then
18
- (@expected_params || {}).all? do |name,expected_vals|
19
- expected_vals.all? do |expected_val|
20
- if expected_val.kind_of?(Regexp)
21
- resource[name] =~ expected_val
22
- else
23
- resource[name] == expected_val
24
- end
25
- end
26
- end
27
- else
28
- false
29
- end
30
- end
31
-
32
- def failure_message_for_should
33
- "expected #{actual_string} to contain #{expected_string}"
34
- end
35
-
36
- def failure_message_for_should_not
37
- "expected #{actual_string} not to contain #{expected_string}"
38
- end
39
-
40
- def method_missing(method, *args, &block)
41
- if method.to_s =~ /^with_/
42
- param = method.to_s.gsub(/^with_/,'')
43
- @expected_params ||= {}
44
- @expected_params[param] ||= []
45
- @expected_params[param] << args[0]
46
- self
47
- else
48
- super
49
- end
50
- end
51
-
52
- private
53
-
54
- def actual_string
55
- possible_resource = @catalog.resource(@referenced_type,@expected_title)
56
- possible_resource ? possible_resource.inspect : "the catalog"
57
- end
58
-
59
- def expected_string
60
- param_string = ""
61
- if @expected_params
62
- param_string = " with parameters #{@expected_params.inspect}"
63
- end
64
- "#{@referenced_type}[#{@expected_title}]#{param_string}"
65
- end
66
-
67
- def referenced_type(type)
68
- type.split('__').map { |r| r.capitalize }.join('::')
69
- end
70
- end
71
-
72
- def method_missing(method, *args, &block)
73
- if method.to_s =~ /^contain_/
74
- resource_type = method.to_s.gsub(/^contain_/,'')
75
- CatalogMatcher.new(resource_type,args[0])
76
- else
77
- super
78
- end
79
- end
80
- end
81
- end