rspec-puppet 2.6.4 → 2.6.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1b4f7cd327bd2ebc223082a8f2ec4fa260a33099
4
- data.tar.gz: 5f863681cfce560d3c821d097aa9b659b1911ff2
3
+ metadata.gz: 306b3d94980e5582b3fdd226c2616bb15a23984d
4
+ data.tar.gz: 689b36fdc52d0e49b1eb1a587e8682949839bbd4
5
5
  SHA512:
6
- metadata.gz: d8ac24b9e683cb744bbe2102bf05c13c439594b4923b3aea580837b96795ee99973342ffab028e2feaaa9a0da1ccca6152ecbbc25c866f06d227c44b72e7840e
7
- data.tar.gz: 933f349b6375c4e158afa6f87069c37b764989b315dbf0801c3f3e3b45a9519d441ae17ce6de30299500356730a36f15d19fe3e52dc60c3c38e92cf681d1aa84
6
+ metadata.gz: 65e3a47f0994979385b56d9739feed2644fea3eea0f86568bd37fd243ce5f00f210b1d3d05c78703823396b00d881d1a0fd54de72ea180bd69a591e0d6deb62a
7
+ data.tar.gz: acc9a1cb17456547bbe4f26965856af3d76d0a8ca33be63988ada284fd08592be597a54aa667a08d5b85bb33727c4454aacd752537796971a6f1496021a2fb4d
data/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
  All notable changes to this project will be documented in this file. This
3
3
  project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## [2.6.5]
6
+
7
+ ### Changed
8
+
9
+ * `derive_node_facts_from_nodename` setting added to disable the overriding of
10
+ `fqdn`, `hostname`, and `domain` facts with values derived from the node
11
+ name specified with `let(:node)`.
12
+
13
+ ### Fixed
14
+
15
+ * The `trusted_facts` hash now accepts symbol keys, matching the behaviour of
16
+ the `facts` hash.
17
+ * The modifications made to Puppet internals are now contained to rspec-puppet
18
+ examples, preventing them from bleeding out into other examples in the same
19
+ RSpec process (like Ruby unit tests).
20
+ * rspec-puppet no longer attempts to configure settings for Puppet 3.x
21
+ releases that they do not support.
22
+
5
23
  ## [2.6.4]
6
24
 
7
25
  ### Fixed
data/README.md CHANGED
@@ -99,7 +99,7 @@ A hash of default trusted facts that should be used for all the tests
99
99
  #### trusted\_node\_data
100
100
  Type | Default | Puppet Version(s)
101
101
  ------- | ------- | -----------------
102
- Boolean | `false` | 3.x, 4.x, 5.x
102
+ Boolean | `false` | >=3.4, 4.x, 5.x
103
103
 
104
104
  Configures rspec-puppet to use the `$trusted` hash when compiling the
105
105
  catalogues.
@@ -143,14 +143,14 @@ The search path for environment directories.
143
143
  #### parser
144
144
  Type | Default | Puppet Version(s)
145
145
  ------ | ----------- | -----------------
146
- String | `"current"` | 3.x
146
+ String | `"current"` | >= 3.2
147
147
 
148
148
  This switches between the 3.x (`current`) and 4.x (`future`) parsers.
149
149
 
150
150
  #### ordering
151
151
  Type | Default | Puppet Version(s)
152
152
  ------ | -------------- | -----------------
153
- String | `"title-hash"` | 3.x, 4.x, 5.x
153
+ String | `"title-hash"` | >= 3.3, 4.x, 5.x
154
154
 
155
155
  How unrelated resources should be ordered when applying a catalogue.
156
156
  * `manifest` - Use the order in which the resources are declared in the
@@ -162,7 +162,7 @@ How unrelated resources should be ordered when applying a catalogue.
162
162
  #### strict\_variables
163
163
  Type | Default | Puppet Version(s)
164
164
  ------- | ------- | -----------------
165
- Boolean | `false` | 3.x, 4.x, 5.x
165
+ Boolean | `false` | >= 3.5, 4.x, 5.x
166
166
 
167
167
  Makes Puppet raise an error when it tries to reference a variable that hasn't
168
168
  been defined (not including variables that have been explicitly set to
@@ -171,7 +171,7 @@ been defined (not including variables that have been explicitly set to
171
171
  #### stringify\_facts
172
172
  Type | Default | Puppet Version(s)
173
173
  ------- | ------- | -----------------
174
- Boolean | `true` | 3.x, 4.x, 5.x
174
+ Boolean | `true` | >= 3.3, 4.x, 5.x
175
175
 
176
176
  Makes rspec-puppet coerce all the fact values into strings (matching the
177
177
  behaviour of older versions of Puppet).
@@ -194,6 +194,19 @@ Boolean | `true` | 2.x, 3.x, 4.x, 5.x
194
194
  Configures rspec-puppet to automatically create a link from the root of your
195
195
  module to `spec/fixtures/<module name>` at the beginning of the test run.
196
196
 
197
+ #### derive\_node\_facts\_from\_nodename
198
+ Type | Default | Puppet Version(s)
199
+ ------- | ------- | -----------------
200
+ Boolean | `true` | 2.x, 3.x, 4.x, 5.x
201
+
202
+ If `true`, rspec-puppet will override the `fdqn`, `hostname`, and `domain`
203
+ facts with values that it derives from the node name (specified with
204
+ `let(:node)`.
205
+
206
+ In some circumstances (e.g. where your nodename/certname is not the same as
207
+ your FQDN), this behaviour is undesirable and can be disabled by changing this
208
+ setting to `false`.
209
+
197
210
  ## Naming conventions
198
211
 
199
212
  For clarity and consistency, I recommend that you use the following directory
@@ -539,7 +552,7 @@ We can write the following testcase (in `spec/defines/sysctl_spec.rb`)
539
552
  ```ruby
540
553
  describe 'sysctl' do
541
554
  let(:title) { 'baz' }
542
- let(:params) { { :value => 'foo' } }
555
+ let(:params) { { 'value' => 'foo' } }
543
556
 
544
557
  it { is_expected.to contain_exec('sysctl/reload').with_command("/sbin/sysctl -p /etc/sysctl.conf") }
545
558
  end
@@ -557,21 +570,21 @@ Parameters of a defined type, class or application can be passed defining `:para
557
570
  and passing it a hash as seen below.
558
571
 
559
572
  ```ruby
560
- let(:params) { {:ensure => 'present', ...} }
573
+ let(:params) { {'ensure' => 'present', ...} }
561
574
  ```
562
575
 
563
576
  For passing Puppet's `undef` as a paremeter value, you can simply use `:undef` and it will
564
577
  be translated to `undef` when compiling. For example:
565
578
 
566
579
  ```ruby
567
- let(:params) { {:user => :undef, ...} }
580
+ let(:params) { {'user' => :undef, ...} }
568
581
  ```
569
582
 
570
583
  For references to nodes or resources as seen when using `require` or `before` properties,
571
584
  or an `application` resource you can pass the string as an argument to the `ref` helper:
572
585
 
573
586
  ```ruby
574
- let(:params) { :require => ref('Package', 'sudoku') }
587
+ let(:params) { 'require' => ref('Package', 'sudoku') }
575
588
  ```
576
589
 
577
590
  Which translates to:
@@ -583,7 +596,7 @@ mydefine { 'mytitle': require => Package['sudoku'] }
583
596
  Another example, for an application setup (when using `app_management`):
584
597
 
585
598
  ```ruby
586
- let(:params) { { :nodes => { ref('Node', 'dbnode') => ref('Myapp::Mycomponent', 'myapp') } } }
599
+ let(:params) { { 'nodes' => { ref('Node', 'dbnode') => ref('Myapp::Mycomponent', 'myapp') } } }
587
600
  ```
588
601
 
589
602
  Will translate to:
@@ -616,7 +629,7 @@ By default, the test environment contains no facts for your manifest to use.
616
629
  You can set them with a hash
617
630
 
618
631
  ```ruby
619
- let(:facts) { {:operatingsystem => 'Debian', :kernel => 'Linux', ...} }
632
+ let(:facts) { {'operatingsystem' => 'Debian', 'kernel' => 'Linux', ...} }
620
633
  ```
621
634
 
622
635
  Facts may be expressed as a value (shown in the previous example) or a structure. Fact keys
@@ -624,7 +637,7 @@ may be expressed as either symbols or strings. A key will be converted to a low
624
637
  string to align with the Facter standard
625
638
 
626
639
  ```ruby
627
- let(:facts) { {:os => { :family => 'RedHat', :release => { :major => '7', :minor => '1', :full => '7.1.1503' } } } }
640
+ let(:facts) { {'os' => { 'family' => 'RedHat', 'release' => { 'major' => '7', 'minor' => '1', 'full' => '7.1.1503' } } } }
628
641
  ```
629
642
 
630
643
  You can also create a set of default facts provided to all specs in your spec_helper:
@@ -632,7 +645,7 @@ You can also create a set of default facts provided to all specs in your spec_he
632
645
  ``` ruby
633
646
  RSpec.configure do |c|
634
647
  c.default_facts = {
635
- :operatingsystem => 'Ubuntu'
648
+ 'operatingsystem' => 'Ubuntu'
636
649
  }
637
650
  end
638
651
  ```
@@ -646,7 +659,7 @@ You can create top-scope variables much in the same way as an ENC.
646
659
 
647
660
 
648
661
  ```ruby
649
- let(:node_params) { { :hostgroup => 'webservers', :rack => 'KK04', :status => 'maintenance' } }
662
+ let(:node_params) { { 'hostgroup' => 'webservers', 'rack' => 'KK04', 'status' => 'maintenance' } }
650
663
  ```
651
664
 
652
665
  You can also create a set of default top-scope variables provided to all specs in your spec_helper:
@@ -654,9 +667,9 @@ You can also create a set of default top-scope variables provided to all specs i
654
667
  ``` ruby
655
668
  RSpec.configure do |c|
656
669
  c.default_node_params = {
657
- :owner => 'itprod',
658
- :site => 'ams4',
659
- :status => 'live'
670
+ 'owner' => 'itprod',
671
+ 'site' => 'ams4',
672
+ 'status' => 'live'
660
673
  }
661
674
  end
662
675
  ```
@@ -773,7 +786,7 @@ describe 'orch_app' do
773
786
  let(:title) { 'my_awesome_app' }
774
787
  let(:params) do
775
788
  {
776
- :nodes => {
789
+ 'nodes' => {
777
790
  ref('Node', node) => ref('Orch_app::Db', title),
778
791
  }
779
792
  }
@@ -965,7 +978,7 @@ user:
965
978
 
966
979
  ```ruby
967
980
  ntpserver = hiera.lookup('ntpserver', nil, nil)
968
- let(:params) { :ntpserver => ntpserver }
981
+ let(:params) { 'ntpserver' => ntpserver }
969
982
  ```
970
983
 
971
984
  ### Enabling hiera lookups
data/lib/rspec-puppet.rb CHANGED
@@ -8,6 +8,7 @@ require 'rspec-puppet/example'
8
8
  require 'rspec-puppet/setup'
9
9
  require 'rspec-puppet/coverage'
10
10
  require 'rspec-puppet/adapters'
11
+ require 'rspec-puppet/consts'
11
12
 
12
13
  begin
13
14
  require 'puppet/test/test_helper'
@@ -18,6 +19,12 @@ RSpec.configure do |c|
18
19
  c.add_setting :enable_pathname_stubbing, :default => false
19
20
  end
20
21
 
22
+ module RSpec::Puppet
23
+ def self.rspec_puppet_example?
24
+ RSpec::Puppet::EventListener.rspec_puppet_example?
25
+ end
26
+ end
27
+
21
28
  require 'rspec-puppet/monkey_patches'
22
29
 
23
30
  RSpec.configure do |c|
@@ -37,8 +44,10 @@ RSpec.configure do |c|
37
44
  c.add_setting :ordering, :default => 'title-hash'
38
45
  c.add_setting :stringify_facts, :default => true
39
46
  c.add_setting :strict_variables, :default => false
40
- c.add_setting :adapter
41
47
  c.add_setting :setup_fixtures, :default => true
48
+ c.add_setting :derive_node_facts_from_nodename, :default => true
49
+ c.add_setting :adapter
50
+ c.add_setting :platform, :default => Puppet::Util::Platform.actual_platform
42
51
 
43
52
  c.before(:all) do
44
53
  if RSpec.configuration.setup_fixtures?
@@ -85,7 +94,7 @@ RSpec.configure do |c|
85
94
  end
86
95
 
87
96
  c.before :each do
88
- if self.class.ancestors.include? RSpec::Puppet::Support
97
+ if RSpec::Puppet.rspec_puppet_example?
89
98
  @adapter = RSpec::Puppet::Adapters.get
90
99
  @adapter.setup_puppet(self)
91
100
  c.adapter = adapter
@@ -93,6 +102,13 @@ RSpec.configure do |c|
93
102
  end
94
103
 
95
104
  c.before :each do |example|
96
- stub_file_consts(example) if self.respond_to?(:stub_file_consts)
105
+ if RSpec::Puppet.rspec_puppet_example?
106
+ Puppet::Util::Platform.pretend_to_be RSpec.configuration.platform
107
+ stub_file_consts(example) if self.respond_to?(:stub_file_consts)
108
+ end
109
+ end
110
+
111
+ c.after(:each) do
112
+ RSpec::Puppet::Consts.restore_consts if RSpec::Puppet.rspec_puppet_example?
97
113
  end
98
114
  end
@@ -183,17 +183,45 @@ module RSpec::Puppet
183
183
  end
184
184
  end
185
185
 
186
- class Adapter3X < Base
186
+ class Adapter30 < Base
187
187
  def settings_map
188
188
  super.concat([
189
189
  [:manifestdir, :manifest_dir],
190
190
  [:manifest, :manifest],
191
191
  [:templatedir, :template_dir],
192
192
  [:hiera_config, :hiera_config],
193
+ ])
194
+ end
195
+ end
196
+
197
+ class Adapter32 < Adapter30
198
+ def settings_map
199
+ super.concat([
193
200
  [:parser, :parser],
194
- [:trusted_node_data, :trusted_node_data],
201
+ ])
202
+ end
203
+ end
204
+
205
+ class Adapter33 < Adapter32
206
+ def settings_map
207
+ super.concat([
195
208
  [:ordering, :ordering],
196
209
  [:stringify_facts, :stringify_facts],
210
+ ])
211
+ end
212
+ end
213
+
214
+ class Adapter34 < Adapter33
215
+ def settings_map
216
+ super.concat([
217
+ [:trusted_node_data, :trusted_node_data],
218
+ ])
219
+ end
220
+ end
221
+
222
+ class Adapter35 < Adapter34
223
+ def settings_map
224
+ super.concat([
197
225
  [:strict_variables, :strict_variables],
198
226
  ])
199
227
  end
@@ -212,7 +240,11 @@ module RSpec::Puppet
212
240
  def self.get
213
241
  [
214
242
  ['4.0', Adapter4X],
215
- ['3.0', Adapter3X],
243
+ ['3.5', Adapter35],
244
+ ['3.4', Adapter34],
245
+ ['3.3', Adapter33],
246
+ ['3.2', Adapter32],
247
+ ['3.0', Adapter30],
216
248
  ['2.7', Adapter27]
217
249
  ].each do |(version, klass)|
218
250
  if Puppet::Util::Package.versioncmp(Puppet.version, version) >= 0
@@ -0,0 +1,31 @@
1
+ module RSpec::Puppet::Consts
2
+ STUBBED_CONSTS = {
3
+ :posix => {
4
+ 'File::PATH_SEPARATOR' => ':',
5
+ 'File::ALT_SEPARATOR' => nil,
6
+ 'Pathname::SEPARATOR_PAT' => /#{Regexp.quote('/')}/,
7
+ },
8
+ :windows => {
9
+ 'File::PATH_SEPARATOR' => ';',
10
+ 'File::ALT_SEPARATOR' => "\\",
11
+ 'Pathname::SEPARATOR_PAT' => /[#{Regexp.quote("\\")}#{Regexp.quote('/')}]/,
12
+ }
13
+ }
14
+
15
+ def self.stub_consts_for(platform)
16
+ STUBBED_CONSTS[platform].each do |const_name, const_value|
17
+ stub_const_wrapper(const_name, const_value)
18
+ end
19
+ end
20
+
21
+ def self.stub_const_wrapper(const, value)
22
+ klass_name, const_name = const.split('::', 2)
23
+ klass = Object.const_get(klass_name)
24
+ klass.send(:remove_const, const_name) if klass.const_defined?(const_name)
25
+ klass.const_set(const_name, value)
26
+ end
27
+
28
+ def self.restore_consts
29
+ stub_consts_for(RSpec.configuration.platform)
30
+ end
31
+ end
@@ -1,5 +1,29 @@
1
1
  require 'pathname'
2
2
 
3
+ class RSpec::Puppet::EventListener
4
+ def self.example_started(example)
5
+ if rspec3?
6
+ @rspec_puppet_example = example.example.example_group.ancestors.include?(RSpec::Puppet::Support)
7
+ else
8
+ @rspec_puppet_example = example.example_group.ancestors.include?(RSpec::Puppet::Support)
9
+ end
10
+ end
11
+
12
+ def self.rspec_puppet_example?
13
+ @rspec_puppet_example || false
14
+ end
15
+
16
+ def self.rspec3?
17
+ if @rspec3.nil?
18
+ @rspec3 = defined?(RSpec::Core::Notifications)
19
+ end
20
+
21
+ @rspec3
22
+ end
23
+ end
24
+
25
+ RSpec.configuration.reporter.register_listener(RSpec::Puppet::EventListener, :example_started)
26
+
3
27
  module Puppet
4
28
  # Allow rspec-puppet to prevent Puppet::Type from automatically picking
5
29
  # a provider for a resource. We need to do this because in order to fully
@@ -11,32 +35,36 @@ module Puppet
11
35
  old_set_default = instance_method(:set_default)
12
36
 
13
37
  define_method(:set_default) do |attr|
14
- old_posix = nil
15
- old_microsoft_windows = nil
38
+ if RSpec::Puppet.rspec_puppet_example?
39
+ old_posix = nil
40
+ old_microsoft_windows = nil
41
+
42
+ if attr == :provider
43
+ old_posix = Puppet.features.posix?
44
+ old_microsoft_windows = Puppet.features.microsoft_windows?
45
+
46
+ if Puppet::Util::Platform.pretend_windows?
47
+ Puppet.features.add(:posix) { false }
48
+ Puppet.features.add(:microsoft_windows) { true }
49
+ else
50
+ Puppet.features.add(:posix) { true }
51
+ Puppet.features.add(:microsoft_windows) { false }
52
+ end
53
+ end
16
54
 
17
- if attr == :provider
18
- old_posix = Puppet.features.posix?
19
- old_microsoft_windows = Puppet.features.microsoft_windows?
55
+ retval = old_set_default.bind(self).call(attr)
20
56
 
21
- if Puppet::Util::Platform.pretend_windows?
22
- Puppet.features.add(:posix) { false }
23
- Puppet.features.add(:microsoft_windows) { true }
24
- else
25
- Puppet.features.add(:posix) { true }
26
- Puppet.features.add(:microsoft_windows) { false }
57
+ unless old_posix.nil?
58
+ Puppet.features.add(:posix) { old_posix }
59
+ end
60
+ unless old_microsoft_windows.nil?
61
+ Puppet.features.add(:microsoft_windows) { old_microsoft_windows }
27
62
  end
28
- end
29
-
30
- retval = old_set_default.bind(self).call(attr)
31
63
 
32
- unless old_posix.nil?
33
- Puppet.features.add(:posix) { old_posix }
34
- end
35
- unless old_microsoft_windows.nil?
36
- Puppet.features.add(:microsoft_windows) { old_microsoft_windows }
64
+ retval
65
+ else
66
+ old_set_default.bind(self).call(attr)
37
67
  end
38
-
39
- retval
40
68
  end
41
69
 
42
70
  def self.suppress_provider?
@@ -52,37 +80,47 @@ module Puppet
52
80
  end
53
81
  end
54
82
 
55
- # If Puppet::Node::Environment has a validate_dirs instance method (i.e.
56
- # Puppet < 3.x), wrap the method to check if rspec-puppet is pretending to be
57
- # running under windows. The original method uses Puppet::Util.absolute_path?
58
- # (which in turn calls Puppet::Util::Platform.windows?) to validate the path
59
- # to the manifests on disk during compilation, so we have to temporarily
60
- # disable the pretending when running it.
61
- class Node::Environment
62
- if instance_methods.include?("validate_dirs")
63
- old_validate_dirs = instance_method(:validate_dirs)
64
-
65
- define_method(:validate_dirs) do |dirs|
83
+ module Parser::Files
84
+ alias :old_find_manifests_in_modules :find_manifests_in_modules
85
+ module_function :old_find_manifests_in_modules
86
+
87
+ def find_manifests_in_modules(pattern, environment)
88
+ if RSpec::Puppet.rspec_puppet_example?
66
89
  pretending = Puppet::Util::Platform.pretend_platform
67
90
 
68
- if pretending
91
+ unless pretending.nil?
69
92
  Puppet::Util::Platform.pretend_to_be nil
93
+ RSpec::Puppet::Consts.stub_consts_for(RSpec.configuration.platform)
70
94
  end
71
95
 
72
- output = old_validate_dirs.bind(self).call(dirs)
96
+ environment.send(:value_cache).clear if environment.respond_to?(:value_cache, true)
97
+ output = old_find_manifests_in_modules(pattern, environment)
73
98
 
74
- Puppet::Util::Platform.pretend_to_be pretending
99
+ unless pretending.nil?
100
+ Puppet::Util::Platform.pretend_to_be pretending
101
+ RSpec::Puppet::Consts.stub_consts_for pretending
102
+ end
75
103
 
76
104
  output
105
+ else
106
+ old_find_manifests_in_modules(pattern, environment)
77
107
  end
78
108
  end
109
+ module_function :find_manifests_in_modules
79
110
  end
80
111
 
81
112
  module Util
82
113
  # Allow rspec-puppet to pretend to be different platforms.
83
114
  module Platform
115
+ alias :old_windows? :windows?
116
+ module_function :old_windows?
117
+
84
118
  def windows?
85
- pretend_platform.nil? ? (actual_platform == :windows) : pretend_windows?
119
+ if RSpec::Puppet.rspec_puppet_example?
120
+ pretend_platform.nil? ? (actual_platform == :windows) : pretend_windows?
121
+ else
122
+ old_windows?
123
+ end
86
124
  end
87
125
  module_function :windows?
88
126
 
@@ -112,16 +150,32 @@ module Puppet
112
150
  end
113
151
  end
114
152
 
115
- if defined?(Puppet::Confine)
153
+ begin
154
+ require 'puppet/confine/exists'
155
+
116
156
  class Confine::Exists < Puppet::Confine
117
- def pass?(value)
118
- true
157
+ old_pass = instance_method(:pass?)
158
+
159
+ define_method(:pass?) do |value|
160
+ if RSpec::Puppet.rspec_puppet_example?
161
+ true
162
+ else
163
+ old_pass.bind(self).call(value)
164
+ end
119
165
  end
120
166
  end
121
- else
167
+ rescue LoadError
168
+ require 'puppet/provider/confine/exists'
169
+
122
170
  class Provider::Confine::Exists < Puppet::Provider::Confine
123
- def pass?(value)
124
- true
171
+ old_pass = instance_method(:pass?)
172
+
173
+ define_method(:pass?) do |value|
174
+ if RSpec::Puppet.rspec_puppet_example?
175
+ true
176
+ else
177
+ old_pass.bind(self).call(value)
178
+ end
125
179
  end
126
180
  end
127
181
  end
@@ -141,12 +195,16 @@ class Pathname
141
195
  old_chop_basename = instance_method(:chop_basename)
142
196
 
143
197
  define_method(:chop_basename) do |path|
144
- if RSpec.configuration.enable_pathname_stubbing
145
- base = rspec_puppet_basename(path)
146
- if /\A#{SEPARATOR_PAT}?\z/o =~ base
147
- return nil
198
+ if RSpec::Puppet.rspec_puppet_example?
199
+ if RSpec.configuration.enable_pathname_stubbing
200
+ base = rspec_puppet_basename(path)
201
+ if /\A#{SEPARATOR_PAT}?\z/o =~ base
202
+ return nil
203
+ else
204
+ return path[0, path.rindex(base)], base
205
+ end
148
206
  else
149
- return path[0, path.rindex(base)], base
207
+ old_chop_basename.bind(self).call(path)
150
208
  end
151
209
  else
152
210
  old_chop_basename.bind(self).call(path)
@@ -157,12 +215,26 @@ end
157
215
 
158
216
  # Prevent the File type from munging paths (which uses File.expand_path to
159
217
  # normalise paths, which does very bad things to *nix paths on Windows.
160
- Puppet::Type.type(:file).paramclass(:path).munge { |value| value }
218
+ file_path_munge = Puppet::Type.type(:file).paramclass(:path).instance_method(:unsafe_munge)
219
+ Puppet::Type.type(:file).paramclass(:path).munge do |value|
220
+ if RSpec::Puppet.rspec_puppet_example?
221
+ value
222
+ else
223
+ file_path_munge.bind(self).call(value)
224
+ end
225
+ end
161
226
 
162
227
  # Prevent the Exec type from validating the user. This parameter isn't
163
228
  # supported under Windows at all and only under *nix when the current user is
164
229
  # root.
165
- Puppet::Type.type(:exec).paramclass(:user).validate { |value| true }
230
+ exec_user_validate = Puppet::Type.type(:exec).paramclass(:user).instance_method(:unsafe_validate)
231
+ Puppet::Type.type(:exec).paramclass(:user).validate do |value|
232
+ if RSpec::Puppet.rspec_puppet_example?
233
+ true
234
+ else
235
+ exec_user_validate.bind(self).call(value)
236
+ end
237
+ end
166
238
 
167
239
  # Prevent Puppet from requiring 'puppet/util/windows' if we're pretending to be
168
240
  # windows, otherwise it will require other libraries that probably won't be
@@ -170,7 +242,7 @@ Puppet::Type.type(:exec).paramclass(:user).validate { |value| true }
170
242
  module Kernel
171
243
  alias :old_require :require
172
244
  def require(path)
173
- return if path == 'puppet/util/windows' && Puppet::Util::Platform.pretend_windows?
245
+ return if path == 'puppet/util/windows' && RSpec::Puppet.rspec_puppet_example? && Puppet::Util::Platform.pretend_windows?
174
246
  old_require(path)
175
247
  end
176
248
  end
@@ -4,7 +4,6 @@ require 'rspec-puppet/raw_string'
4
4
 
5
5
  module RSpec::Puppet
6
6
  module Support
7
-
8
7
  @@cache = RSpec::Puppet::Cache.new
9
8
 
10
9
  def subject
@@ -55,25 +54,14 @@ module RSpec::Puppet
55
54
 
56
55
  munged_facts = facts_hash(nodename(type))
57
56
 
58
- if munged_facts['operatingsystem'] && munged_facts['operatingsystem'].to_s.downcase == 'windows'
59
- stub_const_wrapper('File::PATH_SEPARATOR', ';')
60
- stub_const_wrapper('File::ALT_SEPARATOR', "\\")
61
- stub_const_wrapper('Pathname::SEPARATOR_PAT', /[#{Regexp.quote(File::ALT_SEPARATOR)}#{Regexp.quote(File::SEPARATOR)}]/)
62
- else
63
- stub_const_wrapper('File::PATH_SEPARATOR', ':')
64
- stub_const_wrapper('File::ALT_SEPARATOR', nil)
65
- stub_const_wrapper('Pathname::SEPARATOR_PAT', /#{Regexp.quote(File::SEPARATOR)}/)
66
- end
67
- end
68
-
69
- def stub_const_wrapper(const, value)
70
- if defined?(RSpec::Core::MockingAdapters::RSpec) && RSpec.configuration.mock_framework == RSpec::Core::MockingAdapters::RSpec
71
- stub_const(const, value)
72
- else
73
- klass_name, const_name = const.split('::', 2)
74
- klass = Object.const_get(klass_name)
75
- klass.send(:remove_const, const_name) if klass.const_defined?(const_name)
76
- klass.const_set(const_name, value)
57
+ ['operatingsystem', 'osfamily'].each do |os_fact|
58
+ if munged_facts.key?(os_fact)
59
+ if munged_facts[os_fact].to_s.downcase == 'windows'
60
+ RSpec::Puppet::Consts.stub_consts_for(:windows)
61
+ else
62
+ RSpec::Puppet::Consts.stub_consts_for(:posix)
63
+ end
64
+ end
77
65
  end
78
66
  end
79
67
 
@@ -239,7 +227,7 @@ module RSpec::Puppet
239
227
 
240
228
  # Merge node facts again on top of `let(:facts)` facts, but only if
241
229
  # a node name is given with `let(:node)`
242
- if respond_to?(:node)
230
+ if respond_to?(:node) && RSpec.configuration.derive_node_facts_from_nodename
243
231
  result_facts.merge!(munge_facts(node_facts))
244
232
  (result_facts['networking'] ||= {}).merge!(networking_facts)
245
233
  end
@@ -269,10 +257,10 @@ module RSpec::Puppet
269
257
  extensions = {}
270
258
 
271
259
  if RSpec.configuration.default_trusted_facts.any?
272
- extensions.merge!(RSpec.configuration.default_trusted_facts)
260
+ extensions.merge!(munge_facts(RSpec.configuration.default_trusted_facts))
273
261
  end
274
262
 
275
- extensions.merge!(trusted_facts) if self.respond_to?(:trusted_facts)
263
+ extensions.merge!(munge_facts(trusted_facts)) if self.respond_to?(:trusted_facts)
276
264
  extensions
277
265
  end
278
266
 
@@ -367,16 +355,22 @@ module RSpec::Puppet
367
355
  end
368
356
 
369
357
  def stub_facts!(facts)
370
- if facts['operatingsystem'] && facts['operatingsystem'].to_s.downcase == 'windows'
371
- Puppet::Util::Platform.pretend_to_be :windows
372
- else
373
- Puppet::Util::Platform.pretend_to_be :posix
374
- end
375
358
  Puppet.settings[:autosign] = false
376
359
  facts.each { |k, v| Facter.add(k) { setcode { v } } }
377
360
  end
378
361
 
379
362
  def build_catalog(*args)
363
+ build_facts = args[1]
364
+ ['operatingsystem', 'osfamily'].each do |os_fact|
365
+ if build_facts.key?(os_fact)
366
+ if build_facts[os_fact].to_s.downcase == 'windows'
367
+ Puppet::Util::Platform.pretend_to_be :windows
368
+ else
369
+ Puppet::Util::Platform.pretend_to_be :posix
370
+ end
371
+ end
372
+ end
373
+
380
374
  @@cache.get(*args) do |*args|
381
375
  build_catalog_without_cache(*args)
382
376
  end
@@ -0,0 +1,144 @@
1
+ require 'rake'
2
+ require 'open3'
3
+ require 'json'
4
+ require 'parser/current'
5
+
6
+ task :release_test do
7
+ modules_to_test = [
8
+ 'puppetlabs/puppetlabs-apt',
9
+ 'puppetlabs/puppetlabs-tomcat',
10
+ 'puppetlabs/puppetlabs-apache',
11
+ 'puppetlabs/puppetlabs-mysql',
12
+ 'puppetlabs/puppetlabs-ntp',
13
+ 'puppetlabs/puppetlabs-acl',
14
+ 'puppetlabs/puppetlabs-chocolatey',
15
+ 'voxpupuli/puppet-archive',
16
+ 'voxpupuli/puppet-collectd',
17
+ 'garethr/garethr-docker',
18
+ 'sensu/sensu-puppet',
19
+ 'jenkinsci/puppet-jenkins',
20
+ ]
21
+
22
+ Bundler.with_clean_env do
23
+ FileUtils.mkdir_p('tmp')
24
+ Dir.chdir('tmp') do
25
+ modules_to_test.each do |module_name|
26
+ puts "Testing #{module_name}..."
27
+ module_dir = File.basename(module_name)
28
+
29
+ if File.directory?(module_dir)
30
+ Dir.chdir(module_dir) do
31
+ print ' Updating repository... '
32
+ _, status = Open3.capture2e('git', 'pull', '--rebase')
33
+ if status.success?
34
+ puts 'Done'
35
+ else
36
+ puts 'FAILED'
37
+ next
38
+ end
39
+ end
40
+ else
41
+ print ' Cloning repository... '
42
+ _, status = Open3.capture2e('git', 'clone', "https://github.com/#{module_name}")
43
+ if status.success?
44
+ puts 'Done'
45
+ else
46
+ puts 'FAILED'
47
+ next
48
+ end
49
+ end
50
+
51
+ Dir.chdir(module_dir) do
52
+ print ' Installing dependencies... '
53
+ bundle_install_output, status = Open3.capture2e('bundle', 'install', '--path', 'vendor/gems')
54
+ if status.success?
55
+ puts 'Done'
56
+ else
57
+ puts 'FAILED'
58
+ puts bundle_install_output
59
+ next
60
+ end
61
+
62
+ print ' Running baseline tests... '
63
+ baseline_output, _, status = Open3.capture3({'SPEC_OPTS' => '--format json'}, 'bundle', 'exec', 'rake', 'spec')
64
+ if status.success?
65
+ puts 'Done'
66
+ else
67
+ puts 'Done (tests failed)'
68
+ end
69
+
70
+ print ' Updating Gemfile to use rspec-puppet HEAD... '
71
+ buffer = Parser::Source::Buffer.new('Gemfile')
72
+ buffer.source = File.read('Gemfile')
73
+ parser = Parser::CurrentRuby.new
74
+ ast = parser.parse(buffer)
75
+
76
+ modified_gemfile = GemfileRewrite.new.rewrite(buffer, ast)
77
+
78
+ gem_root = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
79
+ if modified_gemfile == buffer.source
80
+ File.open('Gemfile', 'a') do |f|
81
+ f.puts "gem 'rspec-puppet', :path => '#{gem_root}'"
82
+ end
83
+ else
84
+ File.open('Gemfile', 'w') do |f|
85
+ f.puts modified_gemfile
86
+ end
87
+ end
88
+
89
+ puts 'Done'
90
+
91
+ print ' Installing dependencies... '
92
+ _, status = Open3.capture2e('bundle', 'install', '--path', 'vendor/gems')
93
+ if status.success?
94
+ puts 'Done'
95
+ else
96
+ puts "FAILED"
97
+ next
98
+ end
99
+
100
+ print ' Running tests against rspec-puppet HEAD... '
101
+ head_output, _, status = Open3.capture3({'SPEC_OPTS' => '--format json'}, 'bundle', 'exec', 'rake', 'spec')
102
+ if status.success?
103
+ puts 'Done'
104
+ else
105
+ puts 'Done (tests failed)'
106
+ end
107
+
108
+ print ' Restoring Gemfile... '
109
+ _, status = Open3.capture2e('git', 'checkout', '--', 'Gemfile')
110
+ if status.success?
111
+ puts 'Done'
112
+ else
113
+ puts 'FAILED'
114
+ end
115
+
116
+ json_regex = %r{\{(?:[^{}]|(?:\g<0>))*\}}x
117
+ baseline_results = JSON.parse(baseline_output.scan(json_regex).last)
118
+ head_results = JSON.parse(head_output.scan(json_regex).last)
119
+ if head_results['summary_line'] == baseline_results['summary_line']
120
+ puts " PASS: #{head_results['summary_line']}"
121
+ else
122
+ puts "!!FAILED: baseline:(#{baseline_results['summary_line']}) head:(#{head_results['summary_line']})"
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ class GemfileRewrite < Parser::Rewriter
131
+ def on_send(node)
132
+ _, method_name, *args = *node
133
+
134
+ if method_name == :gem
135
+ gem_name = args.first
136
+ if gem_name.type == :str && gem_name.children.first == 'rspec-puppet'
137
+ gem_root = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
138
+ replace(node.location.expression, "gem 'rspec-puppet', :path => '#{gem_root}'")
139
+ end
140
+ end
141
+
142
+ super
143
+ end
144
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.4
4
+ version: 2.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Sharpe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-08 00:00:00.000000000 Z
11
+ date: 2017-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -37,6 +37,7 @@ files:
37
37
  - lib/rspec-puppet.rb
38
38
  - lib/rspec-puppet/adapters.rb
39
39
  - lib/rspec-puppet/cache.rb
40
+ - lib/rspec-puppet/consts.rb
40
41
  - lib/rspec-puppet/coverage.rb
41
42
  - lib/rspec-puppet/errors.rb
42
43
  - lib/rspec-puppet/example.rb
@@ -64,6 +65,7 @@ files:
64
65
  - lib/rspec-puppet/setup.rb
65
66
  - lib/rspec-puppet/spec_helper.rb
66
67
  - lib/rspec-puppet/support.rb
68
+ - lib/rspec-puppet/tasks/release_test.rb
67
69
  homepage: https://github.com/rodjek/rspec-puppet/
68
70
  licenses:
69
71
  - MIT