fizzgig 0.2.1 → 0.3.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,8 @@
1
+ # 0.3.0
2
+
3
+ * Changed API for #instantiate to take ruby Hash of params rather
4
+ than String containing puppet code
5
+
1
6
  # 0.2.1
2
7
 
3
8
  * Added support for evaluating nodes using Fizzgig.node(hostname)
data/TODO.org CHANGED
@@ -73,6 +73,7 @@ That's not so cool :(
73
73
  ** DONE nodes
74
74
  See govuk_nodes_spec_optional for examples of this.
75
75
  the rspec-puppet equivalent is :type => :host
76
+ ** DONE implement defined types from ruby hashes
76
77
  ** TODO implementation-independent dependency assertions
77
78
  ** TODO Test standalone puppet modules
78
79
  ** 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.2.1'
3
+ s.version = '0.3.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'
@@ -3,13 +3,32 @@ require 'fizzgig/matchers'
3
3
  require 'fizzgig/function_stubs'
4
4
  require 'lspace'
5
5
 
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
+
6
14
  module Fizzgig
7
- def self.instantiate(code,options = {})
15
+ def self.instantiate(type,title,params={},options = {})
8
16
  LSpace.with(:function_stubs => options[:stubs]) do
9
17
  setup_puppet
10
18
  compiler = make_compiler(options[:facts])
11
- resources = compile(code,compiler)
12
- resources[0].evaluate
19
+ scope = compiler.newscope(nil)
20
+ scope.source = Puppet::Resource::Type.new(:node,'localhost')
21
+ # we need to force loading the type; normally this would be
22
+ # handled by Puppet::Parser::AST::Resource calling
23
+ # scope.resolve_type_and_titles
24
+ scope.find_defined_resource_type(type)
25
+
26
+ resource = Puppet::Parser::Resource.new(
27
+ type,
28
+ title,
29
+ :scope => scope,
30
+ :parameters => munge_params(params))
31
+ resource.evaluate
13
32
  compiler.catalog
14
33
  end
15
34
  end
@@ -33,6 +52,10 @@ module Fizzgig
33
52
  end
34
53
  end
35
54
 
55
+ def self.munge_params(params)
56
+ params.collect {|k,v| Puppet::Parser::Resource::Param.new(:name => k, :value => v)}
57
+ end
58
+
36
59
  def self.make_compiler(facts,hostname='localhost')
37
60
  node = Puppet::Node.new(hostname)
38
61
  node.merge(facts) if facts
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'fizzgig'
3
3
 
4
4
  describe 'nginx::site' do
5
- subject { Fizzgig.instantiate %q[nginx::site{'www.foo.com':}] }
5
+ subject { Fizzgig.instantiate 'nginx::site','www.foo.com' }
6
6
  it { should contain_file('/etc/nginx/sites-available/www.foo.com').
7
7
  with_content(/server_name\s+www.foo.com;/) }
8
8
  it { should contain_file('/etc/nginx/sites-enabled/www.foo.com').
@@ -69,26 +69,30 @@ describe Fizzgig do
69
69
  end
70
70
 
71
71
  describe '#instantiate' do
72
- subject { Fizzgig.instantiate(code, :stubs => stubs, :facts => facts) }
72
+ subject { Fizzgig.instantiate(type, title, params, :stubs => stubs, :facts => facts) }
73
73
  let(:stubs) { {} }
74
74
  let(:facts) { {} }
75
+ let(:params) { {} }
75
76
 
76
77
  describe 'params' do
78
+ let(:type) {'params_test'}
79
+ let(:title) { 'foo' }
77
80
  context 'when specifying one parameter' do
78
- let(:code) { %q[params_test {'foo': param => 'bar'}] }
81
+ let(:params) { {:param => 'bar'} }
79
82
  it { should contain_file('foo-param').with_source('bar') }
80
83
  it { should contain_notify('foo-default').with_message('default_val') }
81
84
  end
82
85
  context 'when specifying both paramaters' do
83
- let(:code) { %q[params_test {'foo': param => 'bar', param_with_default => 'baz'}] }
86
+ let(:params) { {:param => 'bar', :param_with_default => 'baz'} }
84
87
  it { should contain_file('foo-param').with_source('bar') }
85
88
  it { should contain_notify('foo-default').with_message('baz') }
86
89
  end
87
90
  end
88
91
 
89
92
  describe 'nginx::simple_server' do
93
+ let(:type) {'nginx::simple_server'}
94
+ let(:title) {'foo'}
90
95
  context 'basic functionality' do
91
- let(:code) { %q[nginx::simple_server {'foo':}] }
92
96
  it { should contain_nginx__site('foo').
93
97
  with_content(/server_name foo;/)
94
98
  }
@@ -97,13 +101,14 @@ describe Fizzgig do
97
101
 
98
102
  context 'functions::define_test with function stubs' do
99
103
  let(:stubs) { {:extlookup => {['ssh-key-barry'] => 'the key of S'}} }
100
- let(:code) { %[functions::define_test{'foo': }] }
104
+ let(:type) {'functions::define_test'}
105
+ let(:title) {'foo'}
101
106
  it { should contain_ssh_authorized_key('barry').with_key('the key of S') }
102
107
  end
103
108
 
104
109
  describe 'facts::define_test' do
105
- let(:classname) {'facts::define_test'}
106
- let(:code) {%q[facts::define_test{'test':}]}
110
+ let(:type) {'facts::define_test'}
111
+ let(:title) {'test'}
107
112
  let(:facts) {
108
113
  { 'unqualified_fact' => 'no qualifications',
109
114
  'qualified_fact' => 'cse ungraded in metalwork'}
@@ -114,9 +119,20 @@ describe Fizzgig do
114
119
  end
115
120
 
116
121
  describe '#node' do
117
- subject { Fizzgig.node('foo.com') }
118
- it {
119
- # require 'pp'; pp subject
120
- should contain_nginx__site('foo.com') }
122
+ subject { Fizzgig.node(hostname, :facts => facts) }
123
+ let(:facts) { {} }
124
+ context 'simple node' do
125
+ let(:hostname) {'foo.com'}
126
+ it { should contain_nginx__site('foo.com') }
127
+ end
128
+ context 'default node' do
129
+ let(:hostname) {'foo.invalid'}
130
+ it { should contain_notify('oops, default') }
131
+ end
132
+ context 'node with facts specified' do
133
+ let(:hostname) {'fact.com'}
134
+ let(:facts) { { 'fact_site' => 'facts.org' } }
135
+ it { should contain_nginx__site('facts.org') }
136
+ end
121
137
  end
122
138
  end
@@ -1,6 +1,9 @@
1
1
  node 'foo.com' {
2
2
  nginx::site {'foo.com':}
3
3
  }
4
+ node 'fact.com' {
5
+ nginx::site {$::fact_site: }
6
+ }
4
7
  node 'default' {
5
8
  notify{'oops, default':}
6
9
  }
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.2.1
4
+ version: 0.3.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-03-28 00:00:00.000000000 Z
12
+ date: 2013-04-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: puppet