spec/unit/policyfile/uploader_spec.rb in chef-dk-0.11.2 vs spec/unit/policyfile/uploader_spec.rb in chef-dk-0.12.0
- old
+ new
@@ -1,410 +1,410 @@
-#
-# Copyright:: Copyright (c) 2014 Chef Software Inc.
-# License:: Apache License, Version 2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-require 'spec_helper'
-require 'chef-dk/policyfile/uploader'
-
-# We load this here to ensure we get the "verifying doubles" behavior from
-# RSpec. It's not used by Policyfile::Uploader, but it's a collaborator.
-require 'chef-dk/authenticated_http'
-
-describe ChefDK::Policyfile::Uploader do
-
- let(:policyfile_lock_data) do
- {
- "name"=> "example",
- "run_list"=> [ "recipe[omnibus::default]" ],
- "cookbook_locks"=> {
- "omnibus"=> {
- "version"=> "2.2.0",
- "identifier"=> "64b3e64306cff223206348e46af545b19032b170",
- "dotted_decimal_identifier"=> "28345299219435506.9887234981653237.76628930769264",
- "cache_key"=> "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
- "origin"=> "git@github.com:opscode-cookbooks/omnibus.git",
- "source_options"=> {
- "git"=> "git@github.com:opscode-cookbooks/omnibus.git",
- "revision"=> "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
- "branch"=> "master"
- }
- }
- }
- }
- end
-
- let(:policyfile_lock) { instance_double("ChefDK::PolicyfileLock", name: "example",
- to_lock: policyfile_lock_data) }
-
- let(:policy_group) { "unit-test" }
-
- let(:http_client) { instance_double("ChefDK::AuthenticatedHTTP") }
-
- let(:policy_document_native_api) { false }
-
- let(:uploader) do
- described_class.new(policyfile_lock,
- policy_group,
- http_client: http_client,
- policy_document_native_api: policy_document_native_api)
- end
-
- let(:policyfile_as_data_bag_item) do
-
- policyfile_as_data_bag_item = {
- "id" => "example-unit-test",
- "name" => "data_bag_item_policyfiles_example-unit-test",
- "data_bag" => "policyfiles"
- }
- policyfile_as_data_bag_item["raw_data"] = policyfile_lock_data.dup
- policyfile_as_data_bag_item["raw_data"]["id"] = "example-unit-test"
- policyfile_as_data_bag_item["json_class"] = "Chef::DataBagItem"
- policyfile_as_data_bag_item
- end
-
- it "has a lockfile" do
- expect(uploader.policyfile_lock).to eq(policyfile_lock)
- end
-
- it "has a policy group" do
- expect(uploader.policy_group).to eq(policy_group)
- end
-
- it "has an HTTP client" do
- expect(uploader.http_client).to eq(http_client)
- end
-
- describe "uploading policies and cookbooks" do
-
- let(:cookbook_locks) { {} }
- let(:cookbook_versions) { {} }
-
- before do
- allow(policyfile_lock).to receive(:cookbook_locks).and_return(cookbook_locks)
- end
-
- def lock_double(name, identifier, dotted_decimal_id)
- cache_path = "/home/user/cache_path/#{name}"
-
- lock = instance_double("ChefDK::Policyfile::CookbookLock",
- name: name,
- version: "1.0.0",
- identifier: identifier,
- dotted_decimal_identifier: dotted_decimal_id,
- cookbook_path: cache_path)
-
- cookbook_version = instance_double("Chef::CookbookVersion",
- name: name,
- identifier: lock.identifier,
- version: dotted_decimal_id)
-
- allow(cookbook_version).to receive(:identifier=).with(lock.identifier)
-
- allow(ChefDK::Policyfile::ReadCookbookForCompatModeUpload).
- to receive(:load).
- with(name, dotted_decimal_id, cache_path).
- and_return(cookbook_version)
-
- allow(ChefDK::Policyfile::CookbookLoaderWithChefignore).
- to receive(:load).
- with(name, cache_path).
- and_return(cookbook_version)
-
- cookbook_versions[name] = cookbook_version
- cookbook_locks[name] = lock
-
- lock
- end
-
- shared_examples_for "uploading cookbooks" do
-
- describe "uploading cookbooks" do
-
- it "enumerates the cookbooks already on the server" do
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
- expect(uploader.existing_cookbook_on_remote).to eq(existing_cookbook_on_remote)
- end
-
- context "with an empty policyfile lock" do
-
- it "has an empty list of cookbooks for possible upload" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
-
- expect(uploader.cookbook_versions_for_policy).to eq([])
- end
-
- it "has an empty list of cookbooks that need to be uploaded" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
-
- expect(uploader.cookbook_versions_to_upload).to eq([])
- end
-
- end
-
- context "with a set of cookbooks that don't exist on the server" do
-
- before do
- lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
- lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
- end
-
- it "lists the cookbooks in the lock as possibly needing to be uploaded" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
-
- expected_versions_for_policy = cookbook_versions.keys.map do |cb_name|
- cb = cookbook_versions[cb_name]
- lock = cookbook_locks[cb_name]
- ChefDK::Policyfile::Uploader::LockedCookbookForUpload.new(cb, lock)
- end
-
- expect(uploader.cookbook_versions_for_policy).to eq(expected_versions_for_policy)
- end
-
- it "lists all cookbooks in the lock as needing to be uploaded" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
-
- expect(uploader.cookbook_versions_to_upload).to eq(cookbook_versions.values)
- end
-
- it "uploads the cookbooks and then the policy" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
-
- cookbook_uploader = instance_double("Chef::CookbookUploader")
- expect(Chef::CookbookUploader).to receive(:new).
- with(cookbook_versions.values, rest: http_client, policy_mode: policy_document_native_api).
- and_return(cookbook_uploader)
- expect(cookbook_uploader).to receive(:upload_cookbooks)
-
- expect_policyfile_upload
-
- uploader.upload
- end
-
- end
-
- context "with a set of cookbooks where some already exist on the server" do
-
- before do
- # These are new:
- lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
- lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
-
- # Have this one:
- lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
- end
-
- let(:expected_cookbooks_for_upload) do
- [
- cookbook_versions["my_apache2"],
- cookbook_versions["my_jenkins"]
- ]
- end
-
- it "lists only cookbooks not on the server as needing to be uploaded" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
-
-
- expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
- end
-
- it "uploads the cookbooks and then the policy" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
-
- cookbook_uploader = instance_double("Chef::CookbookUploader")
- expect(Chef::CookbookUploader).to receive(:new).
- with(expected_cookbooks_for_upload, rest: http_client, policy_mode: policy_document_native_api).
- and_return(cookbook_uploader)
- expect(cookbook_uploader).to receive(:upload_cookbooks)
-
- expect_policyfile_upload
-
- uploader.upload
- end
-
- end
-
- context "with a set of cookbooks that all exist on the server" do
-
- before do
- # Have this one:
- lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
- end
-
- let(:expected_cookbooks_for_upload) do
- []
- end
-
- it "lists no cookbooks as needing to be uploaded" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
-
- expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
- end
-
- it "skips cookbooks uploads, then uploads the policy" do
- expect(policyfile_lock).to receive(:validate_cookbooks!)
- expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
-
- expect(uploader.uploader).to_not receive(:upload_cookbooks)
-
- expect_policyfile_upload
-
- uploader.upload
- end
- end
- end
- end # uploading cookbooks shared examples
-
- context "when configured for policy document compat mode" do
-
- let(:policyfiles_data_bag) { {"name" => "policyfiles" } }
-
- let(:list_cookbooks_url) { 'cookbooks?num_versions=all' }
-
- let(:existing_cookbook_on_remote) do
- {"apt"=>
- {"url"=>"http://localhost:8889/cookbooks/apt",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbooks/apt/46097674477573307.43471642740453733.243606720748315",
- "version"=>"46097674477573307.43471642740453733.243606720748315"}]},
- "build-essential"=>
- {"url"=>"http://localhost:8889/cookbooks/build-essential",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbooks/build-essential/67369247788170534.26353953100055918.55660493423796",
- "version"=>"67369247788170534.26353953100055918.55660493423796"}]},
- "java"=>
- {"url"=>"http://localhost:8889/cookbooks/java",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbooks/java/5664982062912610.52588194571203830.6215746262253",
- "version"=>"5664982062912610.52588194571203830.6215746262253"}]},
- "jenkins"=>
- {"url"=>"http://localhost:8889/cookbooks/jenkins",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbooks/jenkins/69194928762630300.30177357398946006.269829039948647",
- "version"=>"69194928762630300.30177357398946006.269829039948647"}]}
- }
- end
-
- def expect_policyfile_upload
- expect(uploader).to receive(:data_bag_create)
- expect(uploader).to receive(:data_bag_item_create)
- end
-
- it "ensures a data bag named 'policyfiles' exists" do
- expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
- uploader.data_bag_create
- end
-
- it "does not error when the 'policyfiles' data bag exists" do
- response = double("Net::HTTP response", code: "409")
- error = Net::HTTPServerException.new("conflict", response)
- expect(http_client).to receive(:post).with('data', {"name" => "policyfiles"}).and_raise(error)
- expect { uploader.data_bag_create }.to_not raise_error
- end
-
- it "uploads the policyfile as a data bag item" do
- response = double("Net::HTTP response", code: "404")
- error = Net::HTTPServerException.new("Not Found", response)
- expect(http_client).to receive(:put).
- with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item).
- and_raise(error)
- expect(http_client).to receive(:post).
- with('data/policyfiles', policyfile_as_data_bag_item)
-
- uploader.data_bag_item_create
- end
-
- it "replaces an existing policyfile on the server if it exists" do
- expect(http_client).to receive(:put).
- with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
- uploader.data_bag_item_create
- end
-
- it "creates the data bag and item to upload the policy" do
- expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
- expect(http_client).to receive(:put).
- with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
- uploader.upload_policy
- end
-
- include_examples "uploading cookbooks"
-
- end
-
- context "when configured for policy document native mode" do
-
- let(:policy_document_native_api) { true }
-
- let(:list_cookbooks_url) { 'cookbook_artifacts?num_versions=all' }
-
- let(:existing_cookbook_on_remote) do
- {"apt"=>
- {"url"=>"http://localhost:8889/cookbook_artifacts/apt",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbook_artifacts/apt/5f7045a8aeaf6ccda3b3594258df9ee982b3a023",
- "identifier"=>"5f7045a8aeaf6ccda3b3594258df9ee982b3a023"}]},
- "build-essential"=>
- {"url"=>"http://localhost:8889/cookbook_artifacts/build-essential",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbook_artifacts/build-essential/571d8ebd02b296fe90b2e4d68754af7e8e185f28",
- "identifier"=>"571d8ebd02b296fe90b2e4d68754af7e8e185f28"}]},
- "java"=>
- {"url"=>"http://localhost:8889/cookbook_artifacts/java",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbook_artifacts/java/9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358",
- "identifier"=>"9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358"}]},
- "jenkins"=>
- {"url"=>"http://localhost:8889/cookbook_artifacts/jenkins",
- "versions"=>
- [{"url"=>
- "http://localhost:8889/cookbook_artifacts/jenkins/0be380429add00d189b4431059ac967a60052323",
- "identifier"=>"0be380429add00d189b4431059ac967a60052323"}]}
- }
- end
- def expect_policyfile_upload
- expect(http_client).to receive(:put).
- with('/policy_groups/unit-test/policies/example', policyfile_lock_data)
- end
-
- it "enables native document mode for policyfiles" do
- expect(uploader.using_policy_document_native_api?).to be(true)
- end
-
- it "uploads the policyfile to the native API" do
- expect(http_client).to receive(:put).
- with('/policy_groups/unit-test/policies/example', policyfile_lock_data)
-
- uploader.upload_policy
- end
-
- include_examples "uploading cookbooks"
-
- end
-
- end
-
-end
-
+#
+# Copyright:: Copyright (c) 2014 Chef Software Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'spec_helper'
+require 'chef-dk/policyfile/uploader'
+
+# We load this here to ensure we get the "verifying doubles" behavior from
+# RSpec. It's not used by Policyfile::Uploader, but it's a collaborator.
+require 'chef-dk/authenticated_http'
+
+describe ChefDK::Policyfile::Uploader do
+
+ let(:policyfile_lock_data) do
+ {
+ "name"=> "example",
+ "run_list"=> [ "recipe[omnibus::default]" ],
+ "cookbook_locks"=> {
+ "omnibus"=> {
+ "version"=> "2.2.0",
+ "identifier"=> "64b3e64306cff223206348e46af545b19032b170",
+ "dotted_decimal_identifier"=> "28345299219435506.9887234981653237.76628930769264",
+ "cache_key"=> "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
+ "origin"=> "git@github.com:opscode-cookbooks/omnibus.git",
+ "source_options"=> {
+ "git"=> "git@github.com:opscode-cookbooks/omnibus.git",
+ "revision"=> "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
+ "branch"=> "master"
+ }
+ }
+ }
+ }
+ end
+
+ let(:policyfile_lock) { instance_double("ChefDK::PolicyfileLock", name: "example",
+ to_lock: policyfile_lock_data) }
+
+ let(:policy_group) { "unit-test" }
+
+ let(:http_client) { instance_double("ChefDK::AuthenticatedHTTP") }
+
+ let(:policy_document_native_api) { false }
+
+ let(:uploader) do
+ described_class.new(policyfile_lock,
+ policy_group,
+ http_client: http_client,
+ policy_document_native_api: policy_document_native_api)
+ end
+
+ let(:policyfile_as_data_bag_item) do
+
+ policyfile_as_data_bag_item = {
+ "id" => "example-unit-test",
+ "name" => "data_bag_item_policyfiles_example-unit-test",
+ "data_bag" => "policyfiles"
+ }
+ policyfile_as_data_bag_item["raw_data"] = policyfile_lock_data.dup
+ policyfile_as_data_bag_item["raw_data"]["id"] = "example-unit-test"
+ policyfile_as_data_bag_item["json_class"] = "Chef::DataBagItem"
+ policyfile_as_data_bag_item
+ end
+
+ it "has a lockfile" do
+ expect(uploader.policyfile_lock).to eq(policyfile_lock)
+ end
+
+ it "has a policy group" do
+ expect(uploader.policy_group).to eq(policy_group)
+ end
+
+ it "has an HTTP client" do
+ expect(uploader.http_client).to eq(http_client)
+ end
+
+ describe "uploading policies and cookbooks" do
+
+ let(:cookbook_locks) { {} }
+ let(:cookbook_versions) { {} }
+
+ before do
+ allow(policyfile_lock).to receive(:cookbook_locks).and_return(cookbook_locks)
+ end
+
+ def lock_double(name, identifier, dotted_decimal_id)
+ cache_path = "/home/user/cache_path/#{name}"
+
+ lock = instance_double("ChefDK::Policyfile::CookbookLock",
+ name: name,
+ version: "1.0.0",
+ identifier: identifier,
+ dotted_decimal_identifier: dotted_decimal_id,
+ cookbook_path: cache_path)
+
+ cookbook_version = instance_double("Chef::CookbookVersion",
+ name: name,
+ identifier: lock.identifier,
+ version: dotted_decimal_id)
+
+ allow(cookbook_version).to receive(:identifier=).with(lock.identifier)
+
+ allow(ChefDK::Policyfile::ReadCookbookForCompatModeUpload).
+ to receive(:load).
+ with(name, dotted_decimal_id, cache_path).
+ and_return(cookbook_version)
+
+ allow(ChefDK::Policyfile::CookbookLoaderWithChefignore).
+ to receive(:load).
+ with(name, cache_path).
+ and_return(cookbook_version)
+
+ cookbook_versions[name] = cookbook_version
+ cookbook_locks[name] = lock
+
+ lock
+ end
+
+ shared_examples_for "uploading cookbooks" do
+
+ describe "uploading cookbooks" do
+
+ it "enumerates the cookbooks already on the server" do
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+ expect(uploader.existing_cookbook_on_remote).to eq(existing_cookbook_on_remote)
+ end
+
+ context "with an empty policyfile lock" do
+
+ it "has an empty list of cookbooks for possible upload" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+
+ expect(uploader.cookbook_versions_for_policy).to eq([])
+ end
+
+ it "has an empty list of cookbooks that need to be uploaded" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+
+ expect(uploader.cookbook_versions_to_upload).to eq([])
+ end
+
+ end
+
+ context "with a set of cookbooks that don't exist on the server" do
+
+ before do
+ lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
+ lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
+ end
+
+ it "lists the cookbooks in the lock as possibly needing to be uploaded" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+
+ expected_versions_for_policy = cookbook_versions.keys.map do |cb_name|
+ cb = cookbook_versions[cb_name]
+ lock = cookbook_locks[cb_name]
+ ChefDK::Policyfile::Uploader::LockedCookbookForUpload.new(cb, lock)
+ end
+
+ expect(uploader.cookbook_versions_for_policy).to eq(expected_versions_for_policy)
+ end
+
+ it "lists all cookbooks in the lock as needing to be uploaded" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+
+ expect(uploader.cookbook_versions_to_upload).to eq(cookbook_versions.values)
+ end
+
+ it "uploads the cookbooks and then the policy" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+
+ cookbook_uploader = instance_double("Chef::CookbookUploader")
+ expect(Chef::CookbookUploader).to receive(:new).
+ with(cookbook_versions.values, rest: http_client, policy_mode: policy_document_native_api).
+ and_return(cookbook_uploader)
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
+
+ expect_policyfile_upload
+
+ uploader.upload
+ end
+
+ end
+
+ context "with a set of cookbooks where some already exist on the server" do
+
+ before do
+ # These are new:
+ lock_double("my_apache2", "1111111111111111111111111111111111111111", "123.456.789")
+ lock_double("my_jenkins", "2222222222222222222222222222222222222222", "321.654.987")
+
+ # Have this one:
+ lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
+ end
+
+ let(:expected_cookbooks_for_upload) do
+ [
+ cookbook_versions["my_apache2"],
+ cookbook_versions["my_jenkins"]
+ ]
+ end
+
+ it "lists only cookbooks not on the server as needing to be uploaded" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+
+
+ expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
+ end
+
+ it "uploads the cookbooks and then the policy" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+
+ cookbook_uploader = instance_double("Chef::CookbookUploader")
+ expect(Chef::CookbookUploader).to receive(:new).
+ with(expected_cookbooks_for_upload, rest: http_client, policy_mode: policy_document_native_api).
+ and_return(cookbook_uploader)
+ expect(cookbook_uploader).to receive(:upload_cookbooks)
+
+ expect_policyfile_upload
+
+ uploader.upload
+ end
+
+ end
+
+ context "with a set of cookbooks that all exist on the server" do
+
+ before do
+ # Have this one:
+ lock_double("build-essential", "571d8ebd02b296fe90b2e4d68754af7e8e185f28", "67369247788170534.26353953100055918.55660493423796")
+ end
+
+ let(:expected_cookbooks_for_upload) do
+ []
+ end
+
+ it "lists no cookbooks as needing to be uploaded" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+
+ expect(uploader.cookbook_versions_to_upload).to eq(expected_cookbooks_for_upload)
+ end
+
+ it "skips cookbooks uploads, then uploads the policy" do
+ expect(policyfile_lock).to receive(:validate_cookbooks!)
+ expect(http_client).to receive(:get).with(list_cookbooks_url).and_return(existing_cookbook_on_remote)
+
+ expect(uploader.uploader).to_not receive(:upload_cookbooks)
+
+ expect_policyfile_upload
+
+ uploader.upload
+ end
+ end
+ end
+ end # uploading cookbooks shared examples
+
+ context "when configured for policy document compat mode" do
+
+ let(:policyfiles_data_bag) { {"name" => "policyfiles" } }
+
+ let(:list_cookbooks_url) { 'cookbooks?num_versions=all' }
+
+ let(:existing_cookbook_on_remote) do
+ {"apt"=>
+ {"url"=>"http://localhost:8889/cookbooks/apt",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbooks/apt/46097674477573307.43471642740453733.243606720748315",
+ "version"=>"46097674477573307.43471642740453733.243606720748315"}]},
+ "build-essential"=>
+ {"url"=>"http://localhost:8889/cookbooks/build-essential",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbooks/build-essential/67369247788170534.26353953100055918.55660493423796",
+ "version"=>"67369247788170534.26353953100055918.55660493423796"}]},
+ "java"=>
+ {"url"=>"http://localhost:8889/cookbooks/java",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbooks/java/5664982062912610.52588194571203830.6215746262253",
+ "version"=>"5664982062912610.52588194571203830.6215746262253"}]},
+ "jenkins"=>
+ {"url"=>"http://localhost:8889/cookbooks/jenkins",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbooks/jenkins/69194928762630300.30177357398946006.269829039948647",
+ "version"=>"69194928762630300.30177357398946006.269829039948647"}]}
+ }
+ end
+
+ def expect_policyfile_upload
+ expect(uploader).to receive(:data_bag_create)
+ expect(uploader).to receive(:data_bag_item_create)
+ end
+
+ it "ensures a data bag named 'policyfiles' exists" do
+ expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
+ uploader.data_bag_create
+ end
+
+ it "does not error when the 'policyfiles' data bag exists" do
+ response = double("Net::HTTP response", code: "409")
+ error = Net::HTTPServerException.new("conflict", response)
+ expect(http_client).to receive(:post).with('data', {"name" => "policyfiles"}).and_raise(error)
+ expect { uploader.data_bag_create }.to_not raise_error
+ end
+
+ it "uploads the policyfile as a data bag item" do
+ response = double("Net::HTTP response", code: "404")
+ error = Net::HTTPServerException.new("Not Found", response)
+ expect(http_client).to receive(:put).
+ with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item).
+ and_raise(error)
+ expect(http_client).to receive(:post).
+ with('data/policyfiles', policyfile_as_data_bag_item)
+
+ uploader.data_bag_item_create
+ end
+
+ it "replaces an existing policyfile on the server if it exists" do
+ expect(http_client).to receive(:put).
+ with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
+ uploader.data_bag_item_create
+ end
+
+ it "creates the data bag and item to upload the policy" do
+ expect(http_client).to receive(:post).with('data', policyfiles_data_bag)
+ expect(http_client).to receive(:put).
+ with('data/policyfiles/example-unit-test', policyfile_as_data_bag_item)
+ uploader.upload_policy
+ end
+
+ include_examples "uploading cookbooks"
+
+ end
+
+ context "when configured for policy document native mode" do
+
+ let(:policy_document_native_api) { true }
+
+ let(:list_cookbooks_url) { 'cookbook_artifacts?num_versions=all' }
+
+ let(:existing_cookbook_on_remote) do
+ {"apt"=>
+ {"url"=>"http://localhost:8889/cookbook_artifacts/apt",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbook_artifacts/apt/5f7045a8aeaf6ccda3b3594258df9ee982b3a023",
+ "identifier"=>"5f7045a8aeaf6ccda3b3594258df9ee982b3a023"}]},
+ "build-essential"=>
+ {"url"=>"http://localhost:8889/cookbook_artifacts/build-essential",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbook_artifacts/build-essential/571d8ebd02b296fe90b2e4d68754af7e8e185f28",
+ "identifier"=>"571d8ebd02b296fe90b2e4d68754af7e8e185f28"}]},
+ "java"=>
+ {"url"=>"http://localhost:8889/cookbook_artifacts/java",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbook_artifacts/java/9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358",
+ "identifier"=>"9178a38ad3e3baa55b49c1b8d9f4bf6a43dbc358"}]},
+ "jenkins"=>
+ {"url"=>"http://localhost:8889/cookbook_artifacts/jenkins",
+ "versions"=>
+ [{"url"=>
+ "http://localhost:8889/cookbook_artifacts/jenkins/0be380429add00d189b4431059ac967a60052323",
+ "identifier"=>"0be380429add00d189b4431059ac967a60052323"}]}
+ }
+ end
+ def expect_policyfile_upload
+ expect(http_client).to receive(:put).
+ with('/policy_groups/unit-test/policies/example', policyfile_lock_data)
+ end
+
+ it "enables native document mode for policyfiles" do
+ expect(uploader.using_policy_document_native_api?).to be(true)
+ end
+
+ it "uploads the policyfile to the native API" do
+ expect(http_client).to receive(:put).
+ with('/policy_groups/unit-test/policies/example', policyfile_lock_data)
+
+ uploader.upload_policy
+ end
+
+ include_examples "uploading cookbooks"
+
+ end
+
+ end
+
+end
+