rspec-puppet-womble 0.1.6.womble1 → 0.1.6.womble2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|