chef 13.1.31-universal-mingw32 → 13.2.20-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +68 -134
  3. data/Rakefile +1 -0
  4. data/VERSION +1 -1
  5. data/acceptance/.shared/kitchen_acceptance/.kitchen.ec2.yml +1 -0
  6. data/acceptance/top-cookbooks/.kitchen.docker.yml +4 -0
  7. data/lib/chef/application/client.rb +27 -18
  8. data/lib/chef/deprecated.rb +10 -0
  9. data/lib/chef/dsl/declare_resource.rb +9 -1
  10. data/lib/chef/knife.rb +5 -1
  11. data/lib/chef/knife/cookbook_test.rb +1 -1
  12. data/lib/chef/policy_builder/policyfile.rb +27 -1
  13. data/lib/chef/provider.rb +2 -2
  14. data/lib/chef/provider/group/aix.rb +1 -1
  15. data/lib/chef/provider/group/groupadd.rb +1 -1
  16. data/lib/chef/provider/package/chocolatey.rb +1 -1
  17. data/lib/chef/provider/user/pw.rb +1 -1
  18. data/lib/chef/provider/user/windows.rb +1 -1
  19. data/lib/chef/resource/breakpoint.rb +1 -1
  20. data/lib/chef/version.rb +3 -1
  21. data/lib/chef/version_string.rb +143 -0
  22. data/spec/functional/mixin/powershell_out_spec.rb +20 -4
  23. data/spec/functional/resource/group_spec.rb +19 -13
  24. data/spec/functional/resource/windows_task_spec.rb +2 -9
  25. data/spec/integration/knife/common_options_spec.rb +29 -11
  26. data/spec/integration/knife/cookbook_bulk_delete_spec.rb +2 -2
  27. data/spec/integration/knife/cookbook_show_spec.rb +2 -2
  28. data/spec/integration/knife/environment_compare_spec.rb +2 -2
  29. data/spec/integration/knife/environment_show_spec.rb +2 -2
  30. data/spec/integration/knife/role_show_spec.rb +2 -2
  31. data/spec/integration/recipes/accumulator_spec.rb +6 -6
  32. data/spec/integration/recipes/resource_action_spec.rb +18 -7
  33. data/spec/integration/recipes/resource_load_spec.rb +5 -21
  34. data/spec/spec_helper.rb +2 -0
  35. data/spec/support/platform_helpers.rb +5 -0
  36. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +1 -1
  37. data/spec/unit/application/client_spec.rb +2 -0
  38. data/spec/unit/knife_spec.rb +22 -0
  39. data/spec/unit/policy_builder/policyfile_spec.rb +50 -0
  40. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  41. data/spec/unit/provider/user/pw_spec.rb +1 -1
  42. data/spec/unit/version_string_spec.rb +79 -0
  43. data/tasks/dependencies.rb +1 -42
  44. metadata +6 -5
  45. data/tasks/bundle.rb +0 -73
@@ -22,6 +22,14 @@ describe "knife common options", :workstation do
22
22
  include IntegrationSupport
23
23
  include KnifeSupport
24
24
 
25
+ before do
26
+ # Allow this for testing the various port binding stuffs. Remove when
27
+ # we kill off --listen.
28
+ Chef::Config.treat_deprecation_warnings_as_errors(false)
29
+ end
30
+
31
+ let(:local_listen_warning) { /\Awarn:.*local.*listen.*$/i }
32
+
25
33
  when_the_repository "has a node" do
26
34
  before { file "nodes/x.json", {} }
27
35
 
@@ -30,15 +38,20 @@ describe "knife common options", :workstation do
30
38
  Chef::Config.chef_zero.enabled = true
31
39
  end
32
40
 
33
- it "knife raw /nodes/x should retrieve the node" do
41
+ it "knife raw /nodes/x should retrieve the node in socketless mode" do
42
+ Chef::Config.treat_deprecation_warnings_as_errors(true)
34
43
  knife("raw /nodes/x").should_succeed( /"name": "x"/ )
35
44
  end
36
45
 
46
+ it "knife raw /nodes/x should retrieve the node" do
47
+ knife("raw --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
48
+ end
49
+
37
50
  context "And chef_zero.port is 9999" do
38
51
  before(:each) { Chef::Config.chef_zero.port = 9999 }
39
52
 
40
53
  it "knife raw /nodes/x should retrieve the node" do
41
- knife("raw /nodes/x").should_succeed( /"name": "x"/ )
54
+ knife("raw --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
42
55
  expect(Chef::Config.chef_server_url).to eq("chefzero://localhost:9999")
43
56
  end
44
57
  end
@@ -48,7 +61,7 @@ describe "knife common options", :workstation do
48
61
  before(:each) { Chef::Config.chef_zero.host = "0.0.0.0" }
49
62
 
50
63
  it "knife raw /nodes/x should retrieve the role" do
51
- knife("raw /nodes/x").should_succeed( /"name": "x"/ )
64
+ knife("raw --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
52
65
  end
53
66
  end
54
67
 
@@ -86,21 +99,26 @@ EOM
86
99
  end
87
100
 
88
101
  it "knife raw /nodes/x should retrieve the node" do
89
- knife("raw /nodes/x").should_succeed( /"name": "x"/ )
102
+ knife("raw --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
90
103
  end
91
104
  end
92
105
  end
93
106
 
94
- it "knife raw -z /nodes/x retrieves the node" do
107
+ it "knife raw -z /nodes/x retrieves the node in socketless mode" do
108
+ Chef::Config.treat_deprecation_warnings_as_errors(true)
95
109
  knife("raw -z /nodes/x").should_succeed( /"name": "x"/ )
96
110
  end
97
111
 
112
+ it "knife raw -z /nodes/x retrieves the node" do
113
+ knife("raw -z --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
114
+ end
115
+
98
116
  it "knife raw --local-mode /nodes/x retrieves the node" do
99
- knife("raw --local-mode /nodes/x").should_succeed( /"name": "x"/ )
117
+ knife("raw --local-mode --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
100
118
  end
101
119
 
102
120
  it "knife raw -z --chef-zero-port=9999 /nodes/x retrieves the node" do
103
- knife("raw -z --chef-zero-port=9999 /nodes/x").should_succeed( /"name": "x"/ )
121
+ knife("raw -z --chef-zero-port=9999 --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
104
122
  expect(Chef::Config.chef_server_url).to eq("chefzero://localhost:9999")
105
123
  end
106
124
 
@@ -118,7 +136,7 @@ EOM
118
136
  end
119
137
 
120
138
  it "knife raw -z /nodes/x retrieves the node" do
121
- knife("raw -z /nodes/x").should_succeed( /"name": "x"/ )
139
+ knife("raw -z --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
122
140
  expect(URI(Chef::Config.chef_server_url).port).to be > 8889
123
141
  end
124
142
  end
@@ -137,18 +155,18 @@ EOM
137
155
  end
138
156
 
139
157
  it "knife raw -z --chef-zero-port=9999-20000 /nodes/x" do
140
- knife("raw -z --chef-zero-port=9999-20000 /nodes/x").should_succeed( /"name": "x"/ )
158
+ knife("raw -z --chef-zero-port=9999-20000 --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
141
159
  expect(URI(Chef::Config.chef_server_url).port).to be > 9999
142
160
  end
143
161
 
144
162
  it "knife raw -z --chef-zero-port=9999-9999,19423" do
145
- knife("raw -z --chef-zero-port=9999-9999,19423 /nodes/x").should_succeed( /"name": "x"/ )
163
+ knife("raw -z --chef-zero-port=9999-9999,19423 --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
146
164
  expect(URI(Chef::Config.chef_server_url).port).to be == 19423
147
165
  end
148
166
  end
149
167
 
150
168
  it "knife raw -z --chef-zero-port=9999 /nodes/x retrieves the node" do
151
- knife("raw -z --chef-zero-port=9999 /nodes/x").should_succeed( /"name": "x"/ )
169
+ knife("raw -z --chef-zero-port=9999 --listen /nodes/x").should_succeed( /"name": "x"/, stderr: local_listen_warning )
152
170
  expect(Chef::Config.chef_server_url).to eq("chefzero://localhost:9999")
153
171
  end
154
172
  end
@@ -34,7 +34,7 @@ describe "knife cookbook bulk delete", :workstation do
34
34
  cookbook "zfa", "0.6.5"
35
35
  end
36
36
 
37
- # rubocop:disable Style/TrailingWhitespace
37
+ # rubocop:disable Layout/TrailingWhitespace
38
38
  it "knife cookbook bulk delete deletes all matching cookbooks" do
39
39
  stdout = <<EOM
40
40
  All versions of the following cookbooks will be deleted:
@@ -58,7 +58,7 @@ fax 0.6.0
58
58
  zfa 0.6.5
59
59
  EOM
60
60
  end
61
- # rubocop:enable Style/TrailingWhitespace
61
+ # rubocop:enable Layout/TrailingWhitespace
62
62
 
63
63
  end
64
64
  end
@@ -34,7 +34,7 @@ describe "knife cookbook show", :workstation do
34
34
  knife("cookbook show x").should_succeed "x 1.0.0 0.6.5\n"
35
35
  end
36
36
 
37
- # rubocop:disable Style/TrailingWhitespace
37
+ # rubocop:disable Layout/TrailingWhitespace
38
38
  it "knife cookbook show x 1.0.0 shows the correct version" do
39
39
  knife("cookbook show x 1.0.0").should_succeed <<EOM
40
40
  cookbook_name: x
@@ -127,7 +127,7 @@ specificity: default
127
127
  url: http://127.0.0.1:8900/file_store/checksums/d41d8cd98f00b204e9800998ecf8427e
128
128
  EOM
129
129
  end
130
- # rubocop:enable Style/TrailingWhitespace
130
+ # rubocop:enable Layout/TrailingWhitespace
131
131
 
132
132
  it "knife cookbook show x 1.0.0 recipes default.rb shows the default recipe" do
133
133
  knife("cookbook show x 1.0.0 recipes default.rb").should_succeed "file 'n'\n"
@@ -42,7 +42,7 @@ describe "knife environment compare", :workstation do
42
42
  }
43
43
  end
44
44
 
45
- # rubocop:disable Style/TrailingWhitespace
45
+ # rubocop:disable Layout/TrailingWhitespace
46
46
  it "displays the cookbooks for a single environment" do
47
47
  knife("environment compare x").should_succeed <<EOM
48
48
  x
@@ -69,6 +69,6 @@ krad >= 1.0.0 >= 1.0.0
69
69
 
70
70
  EOM
71
71
  end
72
- # rubocop:enable Style/TrailingWhitespace
72
+ # rubocop:enable Layout/TrailingWhitespace
73
73
  end
74
74
  end
@@ -30,7 +30,7 @@ describe "knife environment show", :workstation do
30
30
  }
31
31
  end
32
32
 
33
- # rubocop:disable Style/TrailingWhitespace
33
+ # rubocop:disable Layout/TrailingWhitespace
34
34
  it "shows an environment" do
35
35
  knife("environment show b").should_succeed <<EOM
36
36
  chef_type: environment
@@ -45,7 +45,7 @@ name: b
45
45
  override_attributes:
46
46
  EOM
47
47
  end
48
- # rubocop:enable Style/TrailingWhitespace
48
+ # rubocop:enable Layout/TrailingWhitespace
49
49
 
50
50
  it "shows the requested attribute of an environment" do
51
51
  knife("environment show b -a default_attributes").should_succeed <<EOM
@@ -31,7 +31,7 @@ describe "knife role show", :workstation do
31
31
  role "cat", {}
32
32
  end
33
33
 
34
- # rubocop:disable Style/TrailingWhitespace
34
+ # rubocop:disable Layout/TrailingWhitespace
35
35
  it "shows a cookbook" do
36
36
  knife("role show cons").should_succeed <<EOM
37
37
  chef_type: role
@@ -44,7 +44,7 @@ override_attributes:
44
44
  run_list:
45
45
  EOM
46
46
  end
47
- # rubocop:enable Style/TrailingWhitespace
47
+ # rubocop:enable Layout/TrailingWhitespace
48
48
 
49
49
  end
50
50
  end
@@ -62,7 +62,7 @@ describe "Accumulators" do
62
62
  default_action :create
63
63
 
64
64
  action :create do
65
- email_alias address do
65
+ email_alias new_resource.address do
66
66
  recipients new_resource.recipients
67
67
  end
68
68
  end
@@ -78,7 +78,7 @@ describe "Accumulators" do
78
78
  default_action :create
79
79
 
80
80
  action :create do
81
- nested address do
81
+ nested new_resource.address do
82
82
  recipients new_resource.recipients
83
83
  end
84
84
  end
@@ -149,8 +149,8 @@ describe "Accumulators" do
149
149
  delayed_action :create
150
150
  end
151
151
  end
152
- r.variables[:aliases][address] ||= []
153
- r.variables[:aliases][address] += new_resource.recipients
152
+ r.variables[:aliases][new_resource.address] ||= []
153
+ r.variables[:aliases][new_resource.address] += new_resource.recipients
154
154
  end
155
155
  EOM
156
156
 
@@ -164,7 +164,7 @@ describe "Accumulators" do
164
164
  default_action :create
165
165
 
166
166
  action :create do
167
- email_alias address do
167
+ email_alias new_resource.address do
168
168
  recipients new_resource.recipients
169
169
  end
170
170
  end
@@ -180,7 +180,7 @@ describe "Accumulators" do
180
180
  default_action :create
181
181
 
182
182
  action :create do
183
- nested address do
183
+ nested new_resource.address do
184
184
  recipients new_resource.recipients
185
185
  end
186
186
  end
@@ -416,6 +416,7 @@ module ResourceActionSpec
416
416
  attr_reader :x_warning_line
417
417
 
418
418
  it "Using the enclosing resource to set x to x emits a warning that you're using the wrong x" do
419
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
419
420
  recipe = converge do
420
421
  resource_action_spec_also_with_x "hi" do
421
422
  x 1
@@ -423,34 +424,43 @@ module ResourceActionSpec
423
424
  end
424
425
  end
425
426
  warnings = recipe.logs.lines.select { |l| l =~ /warn/i }
426
- expect(warnings.size).to eq 1
427
+ expect(warnings.size).to eq 2
427
428
  expect(warnings[0]).to match(/property x is declared in both resource_action_spec_with_x\[hi\] and resource_action_spec_also_with_x\[hi\] action :set_x_to_x. Use new_resource.x instead. At #{__FILE__}:#{ResourceActionSpecAlsoWithX.x_warning_line}/)
428
429
  end
429
430
 
430
431
  it "Using the enclosing resource to set x to x outside the initializer emits no warning" do
431
- expect_recipe do
432
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
433
+ recipe = converge do
432
434
  resource_action_spec_also_with_x "hi" do
433
435
  x 1
434
436
  action :set_x_to_x_in_non_initializer
435
437
  end
436
- end.to emit_no_warnings_or_errors
438
+ end
439
+ warnings = recipe.logs.lines.select { |l| l =~ /warn/i }
440
+ expect(warnings.size).to eq 1 # the deprecation warning, not the property masking one
437
441
  end
438
442
 
439
443
  it "Using the enclosing resource to set x to 10 emits no warning" do
440
- expect_recipe do
444
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
445
+ recipe = converge do
441
446
  resource_action_spec_also_with_x "hi" do
442
447
  x 1
443
448
  action :set_x_to_10
444
449
  end
445
- end.to emit_no_warnings_or_errors
450
+ end
451
+ warnings = recipe.logs.lines.select { |l| l =~ /warn/i }
452
+ expect(warnings.size).to eq 1 # the deprecation warning, not the property masking one
446
453
  end
447
454
 
448
455
  it "Using the enclosing resource to set x to 10 emits no warning" do
449
- expect_recipe do
456
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
457
+ recipe = converge do
450
458
  r = resource_action_spec_also_with_x "hi"
451
459
  r.x 1
452
460
  r.action :set_x_to_10
453
- end.to emit_no_warnings_or_errors
461
+ end
462
+ warnings = recipe.logs.lines.select { |l| l =~ /warn/i }
463
+ expect(warnings.size).to eq 1 # the deprecation warning, not the property masking one
454
464
  end
455
465
  end
456
466
 
@@ -496,6 +506,7 @@ module ResourceActionSpec
496
506
  end
497
507
 
498
508
  it "Raises an error when attempting to use a template in the action" do
509
+ Chef::Config[:treat_deprecation_warnings_as_errors] = false
499
510
  expect_converge do
500
511
  has_property_named_template "hi"
501
512
  end.to raise_error(/Property `template` of `has_property_named_template\[hi\]` was incorrectly passed a block. Possible property-resource collision. To call a resource named `template` either rename the property or else use `declare_resource\(:template, ...\)`/)
@@ -32,7 +32,7 @@ describe "Resource.load_current_value" do
32
32
  @created
33
33
  end
34
34
  action :create do
35
- new_resource.class.created_x = x
35
+ new_resource.class.created_x = new_resource.x
36
36
  end
37
37
  end
38
38
  result.resource_name resource_name
@@ -45,10 +45,10 @@ describe "Resource.load_current_value" do
45
45
  context "with a resource with load_current_value" do
46
46
  before :each do
47
47
  resource_class.load_current_value do
48
- x "loaded #{Namer.incrementing_value} (#{self.class.properties.sort_by { |name, p| name }.
49
- select { |name, p| p.is_set?(self) }.
50
- map { |name, p| "#{name}=#{p.get(self)}" }.
51
- join(", ")})"
48
+ x "loaded #{Namer.incrementing_value} (#{self.class.properties.sort_by { |name, p| name }
49
+ .select { |name, p| p.is_set?(self) }
50
+ .map { |name, p| "#{name}=#{p.get(self)}" }
51
+ .join(", ")})"
52
52
  end
53
53
  end
54
54
 
@@ -119,22 +119,6 @@ describe "Resource.load_current_value" do
119
119
  end
120
120
  end
121
121
 
122
- context "and a resource with no values set" do
123
- let(:resource) do
124
- e = self
125
- r = nil
126
- converge do
127
- r = public_send(e.resource_name, "blah") do
128
- end
129
- end
130
- r
131
- end
132
-
133
- it "the provider accesses values from load_current_value" do
134
- expect(resource.class.created_x).to eq "loaded 1 (name=blah)"
135
- end
136
- end
137
-
138
122
  let (:subresource_name) do
139
123
  :"load_current_value_subresource_dsl#{Namer.current_index}"
140
124
  end
data/spec/spec_helper.rb CHANGED
@@ -149,6 +149,8 @@ RSpec.configure do |config|
149
149
  config.filter_run_excluding :windows64_only => true unless windows64?
150
150
  config.filter_run_excluding :windows32_only => true unless windows32?
151
151
  config.filter_run_excluding :windows_nano_only => true unless windows_nano_server?
152
+ config.filter_run_excluding :windows_gte_10 => true unless windows_gte_10?
153
+ config.filter_run_excluding :windows_lt_10 => true if windows_gte_10?
152
154
  config.filter_run_excluding :ruby64_only => true unless ruby_64bit?
153
155
  config.filter_run_excluding :ruby32_only => true unless ruby_32bit?
154
156
  config.filter_run_excluding :windows_powershell_dsc_only => true unless windows_powershell_dsc?
@@ -70,6 +70,11 @@ def windows_2012r2?
70
70
  (host_version && host_version.start_with?("6.3"))
71
71
  end
72
72
 
73
+ def windows_gte_10?
74
+ return false unless windows?
75
+ Gem::Requirement.new(">= 10").satisfied_by?(Gem::Version.new(host_version))
76
+ end
77
+
73
78
  def host_version
74
79
  @host_version ||= begin
75
80
  wmi = WmiLite::Wmi.new
@@ -85,7 +85,7 @@ shared_examples_for "a useradd-based user provider" do |supported_useradd_option
85
85
 
86
86
  it "should combine all the possible options" do
87
87
  combined_opts = []
88
- supported_useradd_options.sort { |a, b| a[0] <=> b[0] }.each do |attribute, option|
88
+ supported_useradd_options.sort_by { |a| a[0] }.each do |attribute, option|
89
89
  allow(@new_resource).to receive(attribute).and_return("hola")
90
90
  combined_opts << option << "hola"
91
91
  end
@@ -257,6 +257,7 @@ Enable chef-client interval runs by setting `:client_fork = true` in your config
257
257
  before do
258
258
  allow(@app).to receive(:interval_sleep).with(wait_secs).and_return true
259
259
  allow(@app).to receive(:interval_sleep).with(0).and_call_original
260
+ allow(@app).to receive(:time_to_sleep).and_return(1)
260
261
  end
261
262
 
262
263
  it "sleeps for the amount of time passed" do
@@ -519,6 +520,7 @@ describe Chef::Application::Client, "run_application", :unix_only do
519
520
  end
520
521
 
521
522
  it "shouldn't sleep when sent USR1" do
523
+ allow(@app).to receive(:interval_sleep).and_return true
522
524
  allow(@app).to receive(:interval_sleep).with(0).and_call_original
523
525
  pid = fork do
524
526
  @app.run_application
@@ -439,6 +439,28 @@ describe Chef::Knife do
439
439
  expect(stderr.string).to match(%r{Response: y u no administrator})
440
440
  end
441
441
 
442
+ context "when proxy servers are set" do
443
+ before do
444
+ ENV["http_proxy"] = "xyz"
445
+ end
446
+
447
+ after do
448
+ ENV.delete("http_proxy")
449
+ end
450
+
451
+ it "formats proxy errors nicely" do
452
+ response = Net::HTTPForbidden.new("1.1", "403", "Forbidden")
453
+ response.instance_variable_set(:@read, true)
454
+ allow(response).to receive(:body).and_return(Chef::JSONCompat.to_json(:error => "y u no administrator"))
455
+ allow(knife).to receive(:run).and_raise(Net::HTTPServerException.new("403 Forbidden", response))
456
+ allow(knife).to receive(:username).and_return("sadpanda")
457
+ knife.run_with_pretty_exceptions
458
+ expect(stderr.string).to match(%r{ERROR: You authenticated successfully to http.+ as sadpanda but you are not authorized for this action})
459
+ expect(stderr.string).to match(%r{ERROR: There are proxy servers configured, your Chef server may need to be added to NO_PROXY.})
460
+ expect(stderr.string).to match(%r{Response: y u no administrator})
461
+ end
462
+ end
463
+
442
464
  it "formats 400s nicely" do
443
465
  response = Net::HTTPBadRequest.new("1.1", "400", "Bad Request")
444
466
  response.instance_variable_set(:@read, true) # I hate you, net/http.
@@ -330,6 +330,56 @@ describe Chef::PolicyBuilder::Policyfile do
330
330
 
331
331
  end
332
332
 
333
+ describe "#build_node" do
334
+
335
+ let(:node) do
336
+ node = Chef::Node.new
337
+ node.name(node_name)
338
+ node
339
+ end
340
+
341
+ before do
342
+ allow(policy_builder).to receive(:node).and_return(node)
343
+ end
344
+
345
+ context "when the run is successful" do
346
+ let(:run_list) do
347
+ ["recipe[test::default]",
348
+ "recipe[test::other]"]
349
+ end
350
+
351
+ let(:version_hash) do
352
+ {
353
+ "version" => "0.1.0",
354
+ "identifier" => "012345678",
355
+ }
356
+ end
357
+
358
+ let(:run_list_for_data_collector) do
359
+ {
360
+ :id => "_policy_node",
361
+ :run_list => [
362
+ { :type => "recipe", :name => "test::default", :skipped => false, :version => nil },
363
+ { :type => "recipe", :name => "test::other", :skipped => false, :version => nil },
364
+ ],
365
+ }
366
+ end
367
+
368
+ before do
369
+ allow(policy_builder).to receive(:run_list)
370
+ .and_return(run_list)
371
+ allow(policy_builder).to receive(:cookbook_lock_for)
372
+ .and_return(version_hash)
373
+ end
374
+
375
+ it "sends the run_list_expanded event" do
376
+ policy_builder.build_node
377
+ expect(policy_builder.run_list_expansion_ish.to_hash)
378
+ .to eq(run_list_for_data_collector)
379
+ end
380
+ end
381
+ end
382
+
333
383
  describe "building the node object" do
334
384
 
335
385
  let(:extra_chef_config) { {} }