rspec-puppet-womble 0.1.6.womble1 → 0.1.6.womble2
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.
- data/Gemfile +8 -0
- data/LICENSE +20 -0
- data/README.md +357 -0
- data/Rakefile +7 -0
- data/lib/rspec-puppet.rb +47 -0
- data/lib/rspec-puppet/errors.rb +46 -0
- data/lib/rspec-puppet/example.rb +27 -0
- data/lib/rspec-puppet/example/class_example_group.rb +10 -0
- data/lib/rspec-puppet/example/define_example_group.rb +10 -0
- data/lib/rspec-puppet/example/function_example_group.rb +46 -0
- data/lib/rspec-puppet/example/host_example_group.rb +10 -0
- data/lib/rspec-puppet/matchers.rb +6 -0
- data/lib/rspec-puppet/matchers/compile.rb +133 -0
- data/lib/rspec-puppet/matchers/count_generic.rb +73 -0
- data/lib/rspec-puppet/matchers/create_generic.rb +156 -0
- data/lib/rspec-puppet/matchers/dynamic_matchers.rb +17 -0
- data/lib/rspec-puppet/matchers/include_class.rb +19 -0
- data/lib/rspec-puppet/matchers/parameter_matcher.rb +110 -0
- data/lib/rspec-puppet/matchers/run.rb +94 -0
- data/lib/rspec-puppet/setup.rb +167 -0
- data/lib/rspec-puppet/support.rb +165 -0
- data/rspec-puppet-womble.gemspec +18 -0
- data/spec/classes/array_spec.rb +74 -0
- data/spec/classes/boolean_regexp_spec.rb +13 -0
- data/spec/classes/boolean_spec.rb +11 -0
- data/spec/classes/cycle_bad_spec.rb +5 -0
- data/spec/classes/cycle_good_spec.rb +5 -0
- data/spec/classes/escape_spec.rb +7 -0
- data/spec/classes/hash_spec.rb +68 -0
- data/spec/classes/sysctl_common_spec.rb +83 -0
- data/spec/defines/escape_def_spec.rb +8 -0
- data/spec/defines/sysctl_before_spec.rb +25 -0
- data/spec/defines/sysctl_spec.rb +21 -0
- data/spec/fixtures/manifests/site.pp +26 -0
- data/spec/fixtures/modules/boolean/manifests/init.pp +12 -0
- data/spec/fixtures/modules/cycle/manifests/bad.pp +8 -0
- data/spec/fixtures/modules/cycle/manifests/good.pp +7 -0
- data/spec/fixtures/modules/cycle/manifests/init.pp +0 -0
- data/spec/fixtures/modules/escape/manifests/def.pp +6 -0
- data/spec/fixtures/modules/escape/manifests/init.pp +6 -0
- data/spec/fixtures/modules/structured_data/manifests/def.pp +5 -0
- data/spec/fixtures/modules/structured_data/manifests/init.pp +5 -0
- data/spec/fixtures/modules/sysctl/manifests/init.pp +39 -0
- data/spec/functions/split_spec.rb +30 -0
- data/spec/hosts/bad_dep_host_spec.rb +5 -0
- data/spec/hosts/foo_spec.rb +6 -0
- data/spec/hosts/good_dep_host_spec.rb +5 -0
- data/spec/hosts/testhost_spec.rb +5 -0
- data/spec/spec_helper.rb +6 -0
- metadata +50 -1
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'rspec-puppet-womble'
|
3
|
+
s.version = '0.1.6.womble2'
|
4
|
+
s.homepage = 'https://github.com/mpalmer/rspec-puppet'
|
5
|
+
s.summary = 'RSpec tests for your Puppet manifests (updated by womble)'
|
6
|
+
s.description = "RSpec tests for your Puppet manifests. This is a forked "+
|
7
|
+
"gem, containing features merged but not yet released in the gems provided "+
|
8
|
+
"by the primary author."
|
9
|
+
|
10
|
+
s.executables = ['rspec-puppet-init']
|
11
|
+
|
12
|
+
s.files = `git ls-files|grep -v "^\\."`.split("\n")
|
13
|
+
|
14
|
+
s.add_dependency 'rspec'
|
15
|
+
|
16
|
+
s.authors = ['Tim Sharpe']
|
17
|
+
s.email = 'tim@sharpe.id.au'
|
18
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'structured_data' do
|
4
|
+
describe "with a single level array of strings" do
|
5
|
+
let(:params) do
|
6
|
+
{'data' => ['foo', 'bar', 'baz', 'quux']}
|
7
|
+
end
|
8
|
+
|
9
|
+
it {
|
10
|
+
should contain_structured_data__def('thing').with(
|
11
|
+
{ 'data' => ['foo', 'bar', 'baz', 'quux'] }
|
12
|
+
)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "with integers as data values" do
|
17
|
+
let(:params) do
|
18
|
+
{ 'data' => ['first', 1, 'second', 2] }
|
19
|
+
end
|
20
|
+
|
21
|
+
it {
|
22
|
+
should contain_structured_data__def('thing').with(
|
23
|
+
{ 'data' => ['first', 1, 'second', 2] }
|
24
|
+
)
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'with nested arrays' do
|
29
|
+
let(:params) do
|
30
|
+
{ 'data' => [
|
31
|
+
'first',
|
32
|
+
'second',
|
33
|
+
['third', 'fourth'],
|
34
|
+
5,
|
35
|
+
6
|
36
|
+
]
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
# Puppet 2.6 will automatically flatten nested arrays. If we're going
|
41
|
+
# to be testing recursive data structures, we might as well ensure that
|
42
|
+
# we're still handling numeric values correctly.
|
43
|
+
describe 'on Puppet 2.6', :if => Puppet.version =~ /^2\.6/ do
|
44
|
+
it {
|
45
|
+
should contain_structured_data__def('thing').with(
|
46
|
+
{ 'data' => [
|
47
|
+
'first',
|
48
|
+
'second',
|
49
|
+
'third',
|
50
|
+
'fourth',
|
51
|
+
5,
|
52
|
+
6
|
53
|
+
]
|
54
|
+
}
|
55
|
+
)
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'on Puppet 2.7 and later', :unless => Puppet.version =~ /^2\.6/ do
|
60
|
+
it {
|
61
|
+
should contain_structured_data__def('thing').with(
|
62
|
+
{ 'data' => [
|
63
|
+
'first',
|
64
|
+
'second',
|
65
|
+
['third', 'fourth'],
|
66
|
+
5,
|
67
|
+
6
|
68
|
+
]
|
69
|
+
}
|
70
|
+
)
|
71
|
+
}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'boolean' do
|
4
|
+
let(:title) { 'bool.testing' }
|
5
|
+
let(:params) { { :bool => false } }
|
6
|
+
let(:message_re) { /bool is false/ }
|
7
|
+
|
8
|
+
it { should create_notify("bool testing").with_message(message_re) }
|
9
|
+
|
10
|
+
# `should_not with_messsage` == `should without_message`
|
11
|
+
it { should_not create_notify("bool testing").with_message(/true/) }
|
12
|
+
it { should create_notify("bool testing").without_message(/true/) }
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
if Puppet::PUPPETVERSION !~ /0\.2/
|
4
|
+
describe 'boolean' do
|
5
|
+
let(:title) { 'bool.testing' }
|
6
|
+
let(:params) { { :bool => false } }
|
7
|
+
|
8
|
+
it { should create_notify("bool testing")\
|
9
|
+
.with_message("This will print when \$bool is false.") }
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'structured_data' do
|
4
|
+
describe "with a single level hash of strings" do
|
5
|
+
let(:params) do
|
6
|
+
{'data' => {'foo' => 'bar', 'baz' => 'quux'}}
|
7
|
+
end
|
8
|
+
|
9
|
+
it {
|
10
|
+
should contain_structured_data__def('thing').with(
|
11
|
+
{'data' => {'foo' => 'bar', 'baz' => 'quux'}}
|
12
|
+
)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "with integers as keys" do
|
17
|
+
let(:params) do
|
18
|
+
{ 'data' => {1 => 'uno', 2 => 'dos'}}
|
19
|
+
end
|
20
|
+
|
21
|
+
it {
|
22
|
+
should contain_structured_data__def('thing').with(
|
23
|
+
{ 'data' => {1 => 'uno', 2 => 'dos'}}
|
24
|
+
)
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'with integers as values' do
|
29
|
+
let(:params) do
|
30
|
+
{ 'data' => {'first' => 1, 'second' => 2}}
|
31
|
+
end
|
32
|
+
|
33
|
+
it {
|
34
|
+
should contain_structured_data__def('thing').with(
|
35
|
+
{ 'data' => {'first' => 1, 'second' => 2}}
|
36
|
+
)
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'with nested hashes' do
|
41
|
+
let(:params) do
|
42
|
+
{ 'data' => {
|
43
|
+
'first' => 1,
|
44
|
+
'second' => 2,
|
45
|
+
'third' => {
|
46
|
+
'alpha' => 'a',
|
47
|
+
'beta' => 'b',
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
it {
|
54
|
+
should contain_structured_data__def('thing').with(
|
55
|
+
{ 'data' => {
|
56
|
+
'first' => 1,
|
57
|
+
'second' => 2,
|
58
|
+
'third' => {
|
59
|
+
'alpha' => 'a',
|
60
|
+
'beta' => 'b',
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
)
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'sysctl::common' do
|
4
|
+
it { should contain_exec('sysctl/reload') \
|
5
|
+
.with_command('/sbin/sysctl -p /etc/sysctl.conf').with_returns([0, 2]) }
|
6
|
+
it { should_not create_augeas('foo') }
|
7
|
+
describe 'when using with to specify a hash of parameters' do
|
8
|
+
it 'should fail if the parameter is not contained in the resource' do
|
9
|
+
expect do
|
10
|
+
subject.should contain_exec('sysctl/reload').with('foo' => 'bar')
|
11
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
12
|
+
end
|
13
|
+
it 'should pass if the parameters are contained in the resource' do
|
14
|
+
subject.should contain_exec('sysctl/reload').with(
|
15
|
+
'refreshonly' => 'true',
|
16
|
+
'returns' => [0, 2]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
describe 'when using without to specify parameter name(s)' do
|
21
|
+
it 'should pass if the parameter name is not contained in the resource' do
|
22
|
+
subject.should contain_exec('sysctl/reload').without('foo')
|
23
|
+
end
|
24
|
+
it 'should pass if the parameter names are not contained in the resource' do
|
25
|
+
subject.should contain_exec('sysctl/reload').without(['foo', 'bar'])
|
26
|
+
end
|
27
|
+
it 'should fail if any of the parameter names are contained in the resource' do
|
28
|
+
expect do
|
29
|
+
subject.should contain_exec('sysctl/reload').without(['foo', 'returns'])
|
30
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
describe 'when using without to specify parameter value(s)' do
|
34
|
+
it 'should pass if the parameter value is not contained in the resource' do
|
35
|
+
subject.should contain_exec('sysctl/reload').without_refreshonly('false')
|
36
|
+
end
|
37
|
+
it 'should fail if the parameter value is contained in the resource' do
|
38
|
+
expect do
|
39
|
+
subject.should contain_exec('sysctl/reload').without_refreshonly('true')
|
40
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'sysctl::common' do
|
46
|
+
let(:params) { { :test_param => "yes" } }
|
47
|
+
|
48
|
+
it { should create_class("sysctl::common")\
|
49
|
+
.with_test_param("yes") }
|
50
|
+
it { should have_class_count(1) }
|
51
|
+
it { should have_exec_resource_count(1) }
|
52
|
+
it { should have_resource_count(1) }
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'sysctl::common' do
|
56
|
+
it { should contain_exec('sysctl/reload').only_with(
|
57
|
+
:command => '/sbin/sysctl -p /etc/sysctl.conf',
|
58
|
+
:refreshonly => true,
|
59
|
+
:returns => [0, 2]
|
60
|
+
)}
|
61
|
+
it { should contain_exec('sysctl/reload') \
|
62
|
+
.only_with_command('/sbin/sysctl -p /etc/sysctl.conf') \
|
63
|
+
.only_with_refreshonly(true) \
|
64
|
+
.only_with_returns([0, 2])
|
65
|
+
}
|
66
|
+
it 'should fail if not enough parameters are contained in the resource' do
|
67
|
+
expect do
|
68
|
+
subject.should contain_exec('sysctl/reload').only_with(
|
69
|
+
:command => '/sbin/sysctl -p /etc/sysctl.conf',
|
70
|
+
:returns => [0, 2]
|
71
|
+
)
|
72
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
73
|
+
end
|
74
|
+
it 'should fail if different parameters are contained in the resource' do
|
75
|
+
expect do
|
76
|
+
subject.should contain_exec('sysctl/reload').only_with(
|
77
|
+
:command => '/sbin/sysctl -p /etc/sysctl.conf',
|
78
|
+
:refreshonly => true,
|
79
|
+
:creates => '/tmp/bla'
|
80
|
+
)
|
81
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'sysctl::before' do
|
4
|
+
let(:title) { 'sysctl::before' }
|
5
|
+
let(:params) { { :value => "title" } }
|
6
|
+
|
7
|
+
it "Should raise an error about needing the sysctl::common class" do
|
8
|
+
expect { should create_notify("message-title")\
|
9
|
+
.with_message("This should print if the class is here first.") }\
|
10
|
+
.to raise_error(Puppet::Error, /Could not find resource 'Class\[Sysctl::Common\]/)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'sysctl::before' do
|
15
|
+
let(:title) { 'test define' }
|
16
|
+
let(:pre_condition) {
|
17
|
+
[ '# we need sysctl common',
|
18
|
+
'class {"sysctl::common":}' ] }
|
19
|
+
let(:params) { { :value => "title" } }
|
20
|
+
|
21
|
+
it { should create_sysctl__before('test define').with_value("title") }
|
22
|
+
|
23
|
+
it { should include_class("sysctl::common") }
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
nodoublequotes = Proc.new do |x|
|
4
|
+
not x =~ /"/
|
5
|
+
end
|
6
|
+
|
7
|
+
describe 'sysctl' do
|
8
|
+
let(:title) { 'vm.swappiness' }
|
9
|
+
let(:params) { {:value => '60'} }
|
10
|
+
let(:pre_condition) { }
|
11
|
+
|
12
|
+
it { should include_class('sysctl::common') }
|
13
|
+
it { should create_augeas('sysctl/vm.swappiness') \
|
14
|
+
.with_context('/files/etc/sysctl.conf') \
|
15
|
+
.with_changes("set vm.swappiness '60'") \
|
16
|
+
.with_changes(nodoublequotes) \
|
17
|
+
.with_onlyif("match vm.swappiness[.='60'] size == 0") \
|
18
|
+
.with_notify('Exec[sysctl/reload]')\
|
19
|
+
.without_foo }
|
20
|
+
it { should have_sysctl_resource_count(1) }
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
node default {
|
2
|
+
notify { 'test': }
|
3
|
+
}
|
4
|
+
|
5
|
+
node /testhost/ {
|
6
|
+
include sysctl::common
|
7
|
+
}
|
8
|
+
|
9
|
+
node 'good_dep_host' {
|
10
|
+
file { 'tmpdir':
|
11
|
+
alias => '/tmp',
|
12
|
+
path => '/tmp',
|
13
|
+
}
|
14
|
+
file { '/tmp/deptest1':
|
15
|
+
require => File['tmpdir'],
|
16
|
+
}
|
17
|
+
file { '/tmp/deptest2':
|
18
|
+
require => File['/tmp'],
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
node 'bad_dep_host' {
|
23
|
+
file { '/tmp':
|
24
|
+
require => File['/'],
|
25
|
+
}
|
26
|
+
}
|
File without changes
|