chef-dk 0.4.0 → 0.5.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -3
  3. data/README.md +20 -15
  4. data/lib/chef-dk/cli.rb +18 -1
  5. data/lib/chef-dk/command/verify.rb +1 -1
  6. data/lib/chef-dk/policyfile/cookbook_location_specification.rb +5 -1
  7. data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +44 -0
  8. data/lib/chef-dk/policyfile/uploader.rb +58 -6
  9. data/lib/chef-dk/policyfile_lock.rb +42 -0
  10. data/lib/chef-dk/skeletons/code_generator/files/default/{repo/cookbooks → cookbook_readmes}/README-policy.md +0 -0
  11. data/lib/chef-dk/skeletons/code_generator/files/default/{repo/cookbooks → cookbook_readmes}/README.md +1 -1
  12. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
  13. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -0
  14. data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
  15. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +13 -18
  16. data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
  17. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +7 -3
  18. data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
  19. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +6 -13
  20. data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
  21. data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +5 -1
  22. data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +5 -1
  23. data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +5 -20
  24. data/lib/chef-dk/version.rb +1 -1
  25. data/lib/kitchen/provisioner/policyfile_zero.rb +21 -9
  26. data/spec/spec_helper.rb +8 -0
  27. data/spec/unit/cli_spec.rb +49 -3
  28. data/spec/unit/command/generator_commands/app_spec.rb +1 -1
  29. data/spec/unit/command/generator_commands/cookbook_spec.rb +1 -1
  30. data/spec/unit/command/generator_commands/repo_spec.rb +46 -50
  31. data/spec/unit/policyfile/uploader_spec.rb +225 -171
  32. data/spec/unit/policyfile_evaluation_spec.rb +16 -0
  33. data/spec/unit/policyfile_lock_build_spec.rb +156 -0
  34. metadata +18 -9
  35. data/lib/chef-dk/skeletons/code_generator/files/default/repo/Rakefile +0 -65
  36. data/lib/chef-dk/skeletons/code_generator/files/default/repo/certificates/README.md +0 -19
  37. data/lib/chef-dk/skeletons/code_generator/templates/default/repo/config/rake.rb.erb +0 -38
@@ -86,270 +86,324 @@ describe ChefDK::Policyfile::Uploader do
86
86
  expect(uploader.http_client).to eq(http_client)
87
87
  end
88
88
 
89
- describe "uploading documents in compat mode" do
89
+ describe "uploading policies and cookbooks" do
90
90
 
91
91
  let(:cookbook_locks) { {} }
92
92
  let(:cookbook_versions) { {} }
93
93
 
94
- let(:existing_cookbook_on_remote) do
95
- {"apt"=>
96
- {"url"=>"http://localhost:8889/cookbooks/apt",
97
- "versions"=>
98
- [{"url"=>
99
- "http://localhost:8889/cookbooks/apt/46097674477573307.43471642740453733.243606720748315",
100
- "version"=>"46097674477573307.43471642740453733.243606720748315"}]},
101
- "build-essential"=>
102
- {"url"=>"http://localhost:8889/cookbooks/build-essential",
103
- "versions"=>
104
- [{"url"=>
105
- "http://localhost:8889/cookbooks/build-essential/67369247788170534.26353953100055918.55660493423796",
106
- "version"=>"67369247788170534.26353953100055918.55660493423796"}]},
107
- "java"=>
108
- {"url"=>"http://localhost:8889/cookbooks/java",
109
- "versions"=>
110
- [{"url"=>
111
- "http://localhost:8889/cookbooks/java/5664982062912610.52588194571203830.6215746262253",
112
- "version"=>"5664982062912610.52588194571203830.6215746262253"}]},
113
- "jenkins"=>
114
- {"url"=>"http://localhost:8889/cookbooks/jenkins",
115
- "versions"=>
116
- [{"url"=>
117
- "http://localhost:8889/cookbooks/jenkins/69194928762630300.30177357398946006.269829039948647",
118
- "version"=>"69194928762630300.30177357398946006.269829039948647"}]}
119
- }
120
- end
121
-
122
94
  before do
123
95
  allow(policyfile_lock).to receive(:cookbook_locks).and_return(cookbook_locks)
124
96
  end
125
97
 
126
- def lock_double(name, dotted_decimal_id)
98
+ def lock_double(name, identifier, dotted_decimal_id)
127
99
  cache_path = "/home/user/cache_path/#{name}"
128
100
 
129
101
  lock = instance_double("ChefDK::Policyfile::CookbookLock",
130
102
  name: name,
131
103
  version: "1.0.0",
132
- identifier: "64b3e64306cff223206348e46af545b19032b170",
104
+ identifier: identifier,
133
105
  dotted_decimal_identifier: dotted_decimal_id,
134
106
  cookbook_path: cache_path)
135
107
 
136
108
  cookbook_version = instance_double("Chef::CookbookVersion",
137
109
  name: name,
110
+ identifier: lock.identifier,
138
111
  version: dotted_decimal_id)
139
112
 
113
+ allow(cookbook_version).to receive(:identifier=).with(lock.identifier)
114
+
140
115
  allow(ChefDK::Policyfile::ReadCookbookForCompatModeUpload).
141
116
  to receive(:load).
142
117
  with(name, dotted_decimal_id, cache_path).
143
118
  and_return(cookbook_version)
144
119
 
120
+ allow(ChefDK::Policyfile::CookbookLoaderWithChefignore).
121
+ to receive(:load).
122
+ with(name, cache_path).
123
+ and_return(cookbook_version)
124
+
145
125
  cookbook_versions[name] = cookbook_version
146
126
  cookbook_locks[name] = lock
147
127
 
148
128
  lock
149
129
  end
150
130
 
151
- context "when configured for policy document compat mode" do
131
+ shared_examples_for "uploading cookbooks" do
152
132
 
153
- let(:policyfiles_data_bag) { {"name" => "policyfiles" } }
133
+ describe "uploading cookbooks" do
154
134
 
155
- it "ensures a data bag named 'policyfiles' exists" do
156
- expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
157
- uploader.data_bag_create
158
- end
135
+ it "enumerates the cookbooks already on the server" do
136
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
137
+ expect(uploader.existing_cookbook_on_remote).to eq(existing_cookbook_on_remote)
138
+ end
159
139
 
160
- it "does not error when the 'policyfiles' data bag exists" do
161
- response = double("Net::HTTP response", code: "409")
162
- error = Net::HTTPServerException.new("conflict", response)
163
- expect(http_client).to receive(:post).with('data', {"name" => "policyfiles"}).and_raise(error)
164
- expect { uploader.data_bag_create }.to_not raise_error
165
- end
140
+ context "with an empty policyfile lock" do
166
141
 
167
- it "uploads the policyfile as a data bag item" do
168
- response = double("Net::HTTP response", code: "404")
169
- error = Net::HTTPServerException.new("Not Found", response)
170
- expect(http_client).to receive(:put).
171
- with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item).
172
- and_raise(error)
173
- expect(http_client).to receive(:post).
174
- with('data/policyfiles', policyfile_as_data_bag_item)
142
+ it "has an empty list of cookbooks for possible upload" do
143
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
175
144
 
176
- uploader.data_bag_item_create
177
- end
145
+ expect(uploader.cookbook_versions_for_policy).to eq([])
146
+ end
178
147
 
179
- it "replaces an existing policyfile on the server if it exists" do
180
- expect(http_client).to receive(:put).
181
- with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
182
- uploader.data_bag_item_create
183
- end
148
+ it "has an empty list of cookbooks that need to be uploaded" do
149
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
184
150
 
185
- it "creates the data bag and item to upload the policy" do
186
- expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
187
- expect(http_client).to receive(:put).
188
- with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
189
- uploader.upload_policy
190
- end
151
+ expect(uploader.cookbook_versions_to_upload).to eq([])
152
+ end
191
153
 
192
- end
154
+ end
193
155
 
194
- context "when configured for policy document native mode" do
156
+ context "with a set of cookbooks that don't exist on the server" do
195
157
 
196
- let(:policy_document_native_api) { true }
158
+ before do
159
+ lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
160
+ lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
161
+ end
197
162
 
198
- it "enables native document mode for policyfiles" do
199
- expect(uploader.using_policy_document_native_api?).to be(true)
200
- end
163
+ it "lists the cookbooks in the lock as possibly needing to be uploaded" do
164
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
201
165
 
202
- it "uploads the policyfile to the native API" do
203
- expect(http_client).to receive(:put).
204
- with('/policies/unit-test/example', policyfile_lock_data)
166
+ expected_versions_for_policy = cookbook_versions.keys.map do |cb_name|
167
+ cb = cookbook_versions[cb_name]
168
+ lock = cookbook_locks[cb_name]
169
+ ChefDK::Policyfile::Uploader::LockedCookbookForUpload.new(cb, lock)
170
+ end
205
171
 
206
- uploader.upload_policy
207
- end
172
+ expect(uploader.cookbook_versions_for_policy).to eq(expected_versions_for_policy)
173
+ end
208
174
 
209
- end
175
+ it "lists all cookbooks in the lock as needing to be uploaded" do
176
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
177
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
210
178
 
211
- it "enumerates the cookbooks already on the server" do
212
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
213
- expect(uploader.existing_cookbook_on_remote).to eq(existing_cookbook_on_remote)
214
- end
179
+ expect(uploader.cookbook_versions_to_upload).to eq(cookbook_versions.values)
180
+ end
215
181
 
216
- context "with an empty policyfile lock" do
182
+ it "uploads the cookbooks and then the policy" do
183
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
184
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
217
185
 
218
- it "has an empty list of cookbooks for possible upload" do
219
- expect(policyfile_lock).to receive(:validate_cookbooks!)
186
+ cookbook_uploader = instance_double("Chef::CookbookUploader")
187
+ expect(Chef::CookbookUploader).to receive(:new).
188
+ with(cookbook_versions.values, rest: http_client, policy_mode: policy_document_native_api).
189
+ and_return(cookbook_uploader)
190
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
220
191
 
221
- expect(uploader.cookbook_versions_for_policy).to eq([])
222
- end
192
+ expect_policyfile_upload
223
193
 
224
- it "has an empty list of cookbooks that need to be uploaded" do
225
- expect(policyfile_lock).to receive(:validate_cookbooks!)
194
+ uploader.upload
195
+ end
226
196
 
227
- expect(uploader.cookbook_versions_to_upload).to eq([])
228
- end
197
+ end
229
198
 
230
- end
199
+ context "with a set of cookbooks where some already exist on the server" do
231
200
 
232
- context "with a set of cookbooks that don't exist on the server" do
201
+ before do
202
+ # These are new:
203
+ lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
204
+ lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
233
205
 
234
- before do
235
- lock_double("my_apache2", "123.456.789")
236
- lock_double("my_jenkins", "321.654.987")
237
- end
206
+ # Have this one:
207
+ lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
208
+ end
238
209
 
239
- it "lists the cookbooks in the lock as possibly needing to be uploaded" do
240
- expect(policyfile_lock).to receive(:validate_cookbooks!)
210
+ let(:expected_cookbooks_for_upload) do
211
+ [
212
+ cookbook_versions["my_apache2"],
213
+ cookbook_versions["my_jenkins"]
214
+ ]
215
+ end
241
216
 
242
- expected_versions_for_policy = cookbook_versions.keys.map do |cb_name|
243
- cb = cookbook_versions[cb_name]
244
- lock = cookbook_locks[cb_name]
245
- ChefDK::Policyfile::Uploader::LockedCookbookForUpload.new(cb, lock)
246
- end
217
+ it "lists only cookbooks not on the server as needing to be uploaded" do
218
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
219
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
247
220
 
248
- expect(uploader.cookbook_versions_for_policy).to eq(expected_versions_for_policy)
249
- end
250
221
 
251
- it "lists all cookbooks in the lock as needing to be uploaded" do
252
- expect(policyfile_lock).to receive(:validate_cookbooks!)
253
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
222
+ expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
223
+ end
254
224
 
255
- expect(uploader.cookbook_versions_to_upload).to eq(cookbook_versions.values)
256
- end
225
+ it "uploads the cookbooks and then the policy" do
226
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
227
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
257
228
 
258
- it "uploads the cookbooks and then the policy" do
259
- expect(policyfile_lock).to receive(:validate_cookbooks!)
260
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
229
+ cookbook_uploader = instance_double("Chef::CookbookUploader")
230
+ expect(Chef::CookbookUploader).to receive(:new).
231
+ with(expected_cookbooks_for_upload, rest: http_client, policy_mode: policy_document_native_api).
232
+ and_return(cookbook_uploader)
233
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
261
234
 
262
- cookbook_uploader = instance_double("Chef::CookbookUploader")
263
- expect(Chef::CookbookUploader).to receive(:new).
264
- with(cookbook_versions.values, :rest => http_client).
265
- and_return(cookbook_uploader)
266
- expect(cookbook_uploader).to receive(:upload_cookbooks)
235
+ expect_policyfile_upload
267
236
 
268
- # behavior for these tested above
269
- expect(uploader).to receive(:data_bag_create)
270
- expect(uploader).to receive(:data_bag_item_create)
237
+ uploader.upload
238
+ end
271
239
 
272
- uploader.upload
273
- end
240
+ end
274
241
 
275
- end
242
+ context "with a set of cookbooks that all exist on the server" do
276
243
 
277
- context "with a set of cookbooks where some already exist on the server" do
244
+ before do
245
+ # Have this one:
246
+ lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
247
+ end
278
248
 
279
- before do
280
- # These are new:
281
- lock_double("my_apache2", "123.456.789")
282
- lock_double("my_jenkins", "321.654.987")
249
+ let(:expected_cookbooks_for_upload) do
250
+ []
251
+ end
283
252
 
284
- # Have this one:
285
- lock_double("build-essential", "67369247788170534.26353953100055918.55660493423796")
286
- end
253
+ it "lists no cookbooks as needing to be uploaded" do
254
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
255
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
287
256
 
288
- let(:expected_cookbooks_for_upload) do
289
- [
290
- cookbook_versions["my_apache2"],
291
- cookbook_versions["my_jenkins"]
292
- ]
293
- end
257
+ expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
258
+ end
259
+
260
+ it "skips cookbooks uploads, then uploads the policy" do
261
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
262
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
294
263
 
295
- it "lists only cookbooks not on the server as needing to be uploaded" do
296
- expect(policyfile_lock).to receive(:validate_cookbooks!)
297
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
264
+ expect(uploader.uploader).to_not receive(:upload_cookbooks)
298
265
 
266
+ expect_policyfile_upload
299
267
 
300
- expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
268
+ uploader.upload
269
+ end
270
+ end
301
271
  end
272
+ end # uploading cookbooks shared examples
273
+
274
+ context "when configured for policy document compat mode" do
302
275
 
303
- it "uploads the cookbooks and then the policy" do
304
- expect(policyfile_lock).to receive(:validate_cookbooks!)
305
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
276
+ let(:policyfiles_data_bag) { {"name" => "policyfiles" } }
306
277
 
307
- cookbook_uploader = instance_double("Chef::CookbookUploader")
308
- expect(Chef::CookbookUploader).to receive(:new).
309
- with(expected_cookbooks_for_upload, :rest => http_client).
310
- and_return(cookbook_uploader)
311
- expect(cookbook_uploader).to receive(:upload_cookbooks)
278
+ let(:list_cookbooks_url) { 'cookbooks?num_versions=all' }
279
+
280
+ let(:existing_cookbook_on_remote) do
281
+ {"apt"=>
282
+ {"url"=>"http://localhost:8889/cookbooks/apt",
283
+ "versions"=>
284
+ [{"url"=>
285
+ "http://localhost:8889/cookbooks/apt/46097674477573307.43471642740453733.243606720748315",
286
+ "version"=>"46097674477573307.43471642740453733.243606720748315"}]},
287
+ "build-essential"=>
288
+ {"url"=>"http://localhost:8889/cookbooks/build-essential",
289
+ "versions"=>
290
+ [{"url"=>
291
+ "http://localhost:8889/cookbooks/build-essential/67369247788170534.26353953100055918.55660493423796",
292
+ "version"=>"67369247788170534.26353953100055918.55660493423796"}]},
293
+ "java"=>
294
+ {"url"=>"http://localhost:8889/cookbooks/java",
295
+ "versions"=>
296
+ [{"url"=>
297
+ "http://localhost:8889/cookbooks/java/5664982062912610.52588194571203830.6215746262253",
298
+ "version"=>"5664982062912610.52588194571203830.6215746262253"}]},
299
+ "jenkins"=>
300
+ {"url"=>"http://localhost:8889/cookbooks/jenkins",
301
+ "versions"=>
302
+ [{"url"=>
303
+ "http://localhost:8889/cookbooks/jenkins/69194928762630300.30177357398946006.269829039948647",
304
+ "version"=>"69194928762630300.30177357398946006.269829039948647"}]}
305
+ }
306
+ end
312
307
 
313
- # behavior for these tested above
308
+ def expect_policyfile_upload
314
309
  expect(uploader).to receive(:data_bag_create)
315
310
  expect(uploader).to receive(:data_bag_item_create)
311
+ end
312
+
313
+ it "ensures a data bag named 'policyfiles' exists" do
314
+ expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
315
+ uploader.data_bag_create
316
+ end
316
317
 
317
- uploader.upload
318
+ it "does not error when the 'policyfiles' data bag exists" do
319
+ response = double("Net::HTTP response", code: "409")
320
+ error = Net::HTTPServerException.new("conflict", response)
321
+ expect(http_client).to receive(:post).with('data', {"name" => "policyfiles"}).and_raise(error)
322
+ expect { uploader.data_bag_create }.to_not raise_error
318
323
  end
319
324
 
320
- end
325
+ it "uploads the policyfile as a data bag item" do
326
+ response = double("Net::HTTP response", code: "404")
327
+ error = Net::HTTPServerException.new("Not Found", response)
328
+ expect(http_client).to receive(:put).
329
+ with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item).
330
+ and_raise(error)
331
+ expect(http_client).to receive(:post).
332
+ with('data/policyfiles', policyfile_as_data_bag_item)
321
333
 
322
- context "with a set of cookbooks that all exist on the server" do
334
+ uploader.data_bag_item_create
335
+ end
323
336
 
324
- before do
325
- # Have this one:
326
- lock_double("build-essential", "67369247788170534.26353953100055918.55660493423796")
337
+ it "replaces an existing policyfile on the server if it exists" do
338
+ expect(http_client).to receive(:put).
339
+ with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
340
+ uploader.data_bag_item_create
327
341
  end
328
342
 
329
- let(:expected_cookbooks_for_upload) do
330
- []
343
+ it "creates the data bag and item to upload the policy" do
344
+ expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
345
+ expect(http_client).to receive(:put).
346
+ with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
347
+ uploader.upload_policy
331
348
  end
332
349
 
333
- it "lists no cookbooks as needing to be uploaded" do
334
- expect(policyfile_lock).to receive(:validate_cookbooks!)
335
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
350
+ include_examples "uploading cookbooks"
336
351
 
337
- expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
338
- end
352
+ end
339
353
 
340
- it "skips cookbooks uploads, then uploads the policy" do
341
- expect(policyfile_lock).to receive(:validate_cookbooks!)
342
- expect(http_client).to receive(:get).with('cookbooks?num_versions=all').and_return(existing_cookbook_on_remote)
354
+ context "when configured for policy document native mode" do
343
355
 
344
- expect(uploader.uploader).to_not receive(:upload_cookbooks)
356
+ let(:policy_document_native_api) { true }
345
357
 
346
- # behavior for these tested above
347
- expect(uploader).to receive(:data_bag_create)
348
- expect(uploader).to receive(:data_bag_item_create)
358
+ let(:list_cookbooks_url) { 'cookbook_artifacts?num_versions=all' }
359
+
360
+ let(:existing_cookbook_on_remote) do
361
+ {"apt"=>
362
+ {"url"=>"http://localhost:8889/cookbook_artifacts/apt",
363
+ "versions"=>
364
+ [{"url"=>
365
+ "http://localhost:8889/cookbook_artifacts/apt/5f7045a8aeaf6ccda3b3594258df9ee982b3a023",
366
+ "identifier"=>"5f7045a8aeaf6ccda3b3594258df9ee982b3a023"}]},
367
+ "build-essential"=>
368
+ {"url"=>"http://localhost:8889/cookbook_artifacts/build-essential",
369
+ "versions"=>
370
+ [{"url"=>
371
+ "http://localhost:8889/cookbook_artifacts/build-essential/571d8ebd02b296fe90b2e4d68754af7e8e185f28",
372
+ "identifier"=>"571d8ebd02b296fe90b2e4d68754af7e8e185f28"}]},
373
+ "java"=>
374
+ {"url"=>"http://localhost:8889/cookbook_artifacts/java",
375
+ "versions"=>
376
+ [{"url"=>
377
+ "http://localhost:8889/cookbook_artifacts/java/9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358",
378
+ "identifier"=>"9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358"}]},
379
+ "jenkins"=>
380
+ {"url"=>"http://localhost:8889/cookbook_artifacts/jenkins",
381
+ "versions"=>
382
+ [{"url"=>
383
+ "http://localhost:8889/cookbook_artifacts/jenkins/0be380429add00d189b4431059ac967a60052323",
384
+ "identifier"=>"0be380429add00d189b4431059ac967a60052323"}]}
385
+ }
386
+ end
387
+ def expect_policyfile_upload
388
+ expect(http_client).to receive(:put).
389
+ with('/policy_groups/unit-test/policies/example', policyfile_lock_data)
390
+ end
391
+
392
+ it "enables native document mode for policyfiles" do
393
+ expect(uploader.using_policy_document_native_api?).to be(true)
394
+ end
395
+
396
+ it "uploads the policyfile to the native API" do
397
+ expect(http_client).to receive(:put).
398
+ with('/policy_groups/unit-test/policies/example', policyfile_lock_data)
349
399
 
350
- uploader.upload
400
+ uploader.upload_policy
351
401
  end
402
+
403
+ include_examples "uploading cookbooks"
404
+
352
405
  end
406
+
353
407
  end
354
408
 
355
409
  end