microwave 1.0.4 → 11.400.2
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.
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +2 -2
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/chef-solo +0 -2
- data/bin/shef +6 -5
- data/lib/chef.rb +2 -4
- data/spec/data/big_json.json +2 -1
- data/spec/data/big_json_plus_one.json +2 -1
- data/spec/data/cookbooks/chefignore +2 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
- data/spec/functional/knife/exec_spec.rb +4 -6
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +64 -3
- data/spec/functional/resource/cookbook_file_spec.rb +33 -2
- data/spec/functional/resource/deploy_revision_spec.rb +515 -0
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +12 -10
- data/spec/functional/resource/registry_spec.rb +572 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +28 -3
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +238 -0
- data/spec/functional/shell_spec.rb +101 -0
- data/spec/functional/tiny_server_spec.rb +5 -4
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- data/spec/spec_helper.rb +15 -3
- data/spec/stress/win32/security_spec.rb +5 -5
- data/spec/support/chef_helpers.rb +14 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/matchers/leak.rb +1 -1
- data/spec/support/platform_helpers.rb +18 -0
- data/spec/support/shared/functional/directory_resource.rb +85 -23
- data/spec/support/shared/functional/file_resource.rb +198 -53
- data/spec/support/shared/functional/securable_resource.rb +140 -105
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/tiny_server.rb +29 -10
- data/spec/unit/api_client/registration_spec.rb +172 -0
- data/spec/unit/api_client_spec.rb +156 -103
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +329 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +188 -16
- data/spec/unit/config_spec.rb +54 -4
- data/spec/unit/cookbook/chefignore_spec.rb +2 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
- data/spec/unit/json_compat_spec.rb +69 -0
- data/spec/unit/knife/bootstrap_spec.rb +81 -28
- data/spec/unit/knife/client_reregister_spec.rb +23 -22
- data/spec/unit/knife/configure_spec.rb +29 -26
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
- data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -7
- data/spec/unit/knife/data_bag_create_spec.rb +14 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +121 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -17
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +56 -491
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +272 -137
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +411 -339
- data/spec/unit/platform_spec.rb +8 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/deploy/revision_spec.rb +2 -8
- data/spec/unit/provider/deploy_spec.rb +6 -40
- data/spec/unit/provider/directory_spec.rb +103 -68
- data/spec/unit/provider/erl_call_spec.rb +0 -2
- data/spec/unit/provider/file_spec.rb +69 -59
- data/spec/unit/provider/git_spec.rb +0 -10
- data/spec/unit/provider/group/groupadd_spec.rb +1 -1
- data/spec/unit/provider/group/usermod_spec.rb +2 -2
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/link_spec.rb +1 -1
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/rubygems_spec.rb +0 -18
- data/spec/unit/provider/package/yum_spec.rb +79 -15
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +24 -7
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +3 -6
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +4 -4
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
- data/spec/unit/provider/service/init_service_spec.rb +26 -3
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
- data/spec/unit/provider/service_spec.rb +2 -2
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +57 -31
- data/spec/unit/provider/user_spec.rb +7 -16
- data/spec/unit/provider_spec.rb +4 -3
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- data/spec/unit/resource/log_spec.rb +9 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +27 -4
- data/spec/unit/rest/auth_credentials_spec.rb +2 -14
- data/spec/unit/rest_spec.rb +122 -187
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- metadata +162 -157
- data/README.rdoc +0 -177
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/json_compat_spect.rb +0 -53
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
@@ -1,244 +0,0 @@
|
|
1
|
-
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
2
|
-
# Copyright:: Copyright (c) 2011 Opscode, inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require 'spec_helper'
|
19
|
-
|
20
|
-
require 'chef/solr_query'
|
21
|
-
require 'net/http'
|
22
|
-
|
23
|
-
describe Chef::SolrQuery::SolrHTTPRequest do
|
24
|
-
before do
|
25
|
-
Chef::Config[:solr_url] = "http://example.com:8983"
|
26
|
-
Chef::SolrQuery::SolrHTTPRequest.instance_variable_set(:@solr_url, nil)
|
27
|
-
Chef::SolrQuery::SolrHTTPRequest.instance_variable_set(:@url_prefix, nil)
|
28
|
-
|
29
|
-
@request = Chef::SolrQuery::SolrHTTPRequest.new(:GET, '/solr/select')
|
30
|
-
end
|
31
|
-
|
32
|
-
it "defaults to using the configured solr_url" do
|
33
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url.should == "http://example.com:8983"
|
34
|
-
end
|
35
|
-
|
36
|
-
it "supports solr_url with a path" do
|
37
|
-
Chef::Config[:solr_url] = "http://example.com:8983/test"
|
38
|
-
Chef::SolrQuery::SolrHTTPRequest.instance_variable_set(:@solr_url, nil)
|
39
|
-
|
40
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url.should == "http://example.com:8983/test"
|
41
|
-
end
|
42
|
-
|
43
|
-
it "updates the Solr URL as you like" do
|
44
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234"
|
45
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url.should == "http://chunkybacon.org:1234"
|
46
|
-
end
|
47
|
-
|
48
|
-
it "updates the URL prefix with a path" do
|
49
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234/something"
|
50
|
-
Chef::SolrQuery::SolrHTTPRequest.url_prefix.should == "/something"
|
51
|
-
end
|
52
|
-
|
53
|
-
it "removes extra / at the end of solr_url" do
|
54
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234/extra/"
|
55
|
-
Chef::SolrQuery::SolrHTTPRequest.url_prefix.should == "/extra"
|
56
|
-
end
|
57
|
-
|
58
|
-
it "creates a Net::HTTP client for the base Solr URL" do
|
59
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234"
|
60
|
-
http_client = Chef::SolrQuery::SolrHTTPRequest.http_client
|
61
|
-
http_client.address.should == "chunkybacon.org"
|
62
|
-
http_client.port.should == 1234
|
63
|
-
end
|
64
|
-
|
65
|
-
it "creates a Net::HTTP client for the base Solr URL ignoring the path" do
|
66
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234/test"
|
67
|
-
http_client = Chef::SolrQuery::SolrHTTPRequest.http_client
|
68
|
-
http_client.address.should == "chunkybacon.org"
|
69
|
-
http_client.port.should == 1234
|
70
|
-
end
|
71
|
-
|
72
|
-
it "defaults url_prefix to /solr if the configured solr_url has no path" do
|
73
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234"
|
74
|
-
Chef::SolrQuery::SolrHTTPRequest.url_prefix.should == "/solr"
|
75
|
-
end
|
76
|
-
|
77
|
-
it "defaults url_prefix to the path from the configured solr_url" do
|
78
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://chunkybacon.org:1234/test"
|
79
|
-
Chef::SolrQuery::SolrHTTPRequest.url_prefix.should == "/test"
|
80
|
-
end
|
81
|
-
|
82
|
-
describe "when configured with the Solr URL" do
|
83
|
-
before do
|
84
|
-
@http_response = mock(
|
85
|
-
"Net::HTTP::Response",
|
86
|
-
:kind_of? => Net::HTTPSuccess,
|
87
|
-
:body => "{ :some => :hash }"
|
88
|
-
)
|
89
|
-
@http_request = mock(
|
90
|
-
"Net::HTTP::Request",
|
91
|
-
:body= => true
|
92
|
-
)
|
93
|
-
@http = mock("Net::HTTP", :request => @http_response)
|
94
|
-
Chef::SolrQuery::SolrHTTPRequest.stub!(:http_client).and_return(@http)
|
95
|
-
end
|
96
|
-
|
97
|
-
describe "when executing a select query" do
|
98
|
-
before(:each) do
|
99
|
-
@http_response = mock(
|
100
|
-
"Net::HTTP::Response",
|
101
|
-
:kind_of? => Net::HTTPSuccess,
|
102
|
-
:body => '{"some": "hash" }'
|
103
|
-
)
|
104
|
-
@solr = Chef::SolrQuery.from_params(:type => 'node',
|
105
|
-
:q => "hostname:latte")
|
106
|
-
@params = @solr.to_hash
|
107
|
-
@http = mock("Net::HTTP", :request => @http_response)
|
108
|
-
Chef::SolrQuery::SolrHTTPRequest.stub!(:http_client).and_return(@http)
|
109
|
-
end
|
110
|
-
|
111
|
-
describe "when the HTTP call is successful" do
|
112
|
-
it "should call get to /solr/select with the escaped query" do
|
113
|
-
txfm_query = "q=content%3Ahostname__%3D__latte"
|
114
|
-
Net::HTTP::Get.should_receive(:new).with(%r(/solr/select?.+#{txfm_query}))
|
115
|
-
Chef::SolrQuery::SolrHTTPRequest.select(@params)
|
116
|
-
end
|
117
|
-
|
118
|
-
it "uses Solr's JSON response format" do
|
119
|
-
Net::HTTP::Get.should_receive(:new).with(%r(wt=json))
|
120
|
-
Chef::SolrQuery::SolrHTTPRequest.select(@params)
|
121
|
-
end
|
122
|
-
|
123
|
-
it "uses indent=off to get a compact response" do
|
124
|
-
Net::HTTP::Get.should_receive(:new).with(%r(indent=off))
|
125
|
-
Chef::SolrQuery::SolrHTTPRequest.select(@params)
|
126
|
-
end
|
127
|
-
|
128
|
-
it "uses the filter query to restrict the result set" do
|
129
|
-
filter_query =@solr.filter_query.gsub('+', '%2B').gsub(':', "%3A").gsub(' ', '+')
|
130
|
-
Net::HTTP::Get.should_receive(:new).with(/fq=#{Regexp.escape(filter_query)}/)
|
131
|
-
Chef::SolrQuery::SolrHTTPRequest.select(@params)
|
132
|
-
end
|
133
|
-
|
134
|
-
it "returns the evaluated response body" do
|
135
|
-
res = Chef::SolrQuery::SolrHTTPRequest.select(@params)
|
136
|
-
res.should == {"some" => "hash" }
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
describe "when updating" do
|
142
|
-
before do
|
143
|
-
Net::HTTP::Post.stub!(:new).and_return(@http_request)
|
144
|
-
end
|
145
|
-
|
146
|
-
it "should post to /solr/update" do
|
147
|
-
@doc = "<xml is the old tldr>"
|
148
|
-
Net::HTTP::Post.should_receive(:new).with("/solr/update", "Content-Type" => "text/xml").and_return(@http_request)
|
149
|
-
Chef::SolrQuery::SolrHTTPRequest.update(@doc)
|
150
|
-
end
|
151
|
-
|
152
|
-
it "should set the body of the request to the stringified doc" do
|
153
|
-
@http_request.should_receive(:body=).with("foo")
|
154
|
-
Chef::SolrQuery::SolrHTTPRequest.update(:foo)
|
155
|
-
end
|
156
|
-
|
157
|
-
it "should send the request to solr" do
|
158
|
-
@http.should_receive(:request).with(@http_request).and_return(@http_response)
|
159
|
-
Chef::SolrQuery::SolrHTTPRequest.update(:foo)
|
160
|
-
end
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
describe "when the HTTP call is unsuccessful" do
|
165
|
-
[Timeout::Error, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EINVAL].each do |exception|
|
166
|
-
it "should rescue, log an error message, and raise a SolrConnectionError encountering exception #{exception}" do
|
167
|
-
response = mock("Net:HTTPResponse test double", :code => 500, :message => "oops", :class => exception)
|
168
|
-
@http.should_receive(:request).with(instance_of(Net::HTTP::Get)).and_return(response)
|
169
|
-
response.should_receive(:error!).and_raise(exception)
|
170
|
-
Chef::Log.should_receive(:fatal).with("Search Query to Solr failed (#{exception} 500 oops)")
|
171
|
-
|
172
|
-
lambda {@request.run('Search Query to Solr')}.should raise_error(Chef::Exceptions::SolrConnectionError)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
it "should rescue, log an error message, and raise a SolrConnectionError when encountering exception NoMethodError and net/http closed? bug" do
|
177
|
-
@no_method_error = NoMethodError.new("undefined method 'closed\?' for nil:NilClass")
|
178
|
-
@http.should_receive(:request).with(instance_of(Net::HTTP::Get)).and_raise(@no_method_error)
|
179
|
-
Chef::Log.should_receive(:fatal).with("HTTP Request to Solr failed. Chef::Exceptions::SolrConnectionError exception: Errno::ECONNREFUSED (net/http undefined method closed?) attempting to contact http://example.com:8983")
|
180
|
-
lambda {
|
181
|
-
@request.run
|
182
|
-
}.should raise_error(Chef::Exceptions::SolrConnectionError)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
end
|
187
|
-
|
188
|
-
describe "when configured with the Solr URL with a path" do
|
189
|
-
before do
|
190
|
-
Chef::Config[:solr_url] = "http://example.com:8983/test"
|
191
|
-
Chef::SolrQuery::SolrHTTPRequest.instance_variable_set(:@solr_url, nil)
|
192
|
-
Chef::SolrQuery::SolrHTTPRequest.instance_variable_set(:@url_prefix, nil)
|
193
|
-
|
194
|
-
@request = Chef::SolrQuery::SolrHTTPRequest.new(:GET, '/solr/select')
|
195
|
-
|
196
|
-
@http_response = mock(
|
197
|
-
"Net::HTTP::Response",
|
198
|
-
:kind_of? => Net::HTTPSuccess,
|
199
|
-
:body => "{ :some => :hash }"
|
200
|
-
)
|
201
|
-
@http_request = mock(
|
202
|
-
"Net::HTTP::Request",
|
203
|
-
:body= => true
|
204
|
-
)
|
205
|
-
@http = mock("Net::HTTP", :request => @http_response)
|
206
|
-
Chef::SolrQuery::SolrHTTPRequest.stub!(:http_client).and_return(@http)
|
207
|
-
end
|
208
|
-
|
209
|
-
describe "when executing a select query" do
|
210
|
-
before(:each) do
|
211
|
-
@http_response = mock(
|
212
|
-
"Net::HTTP::Response",
|
213
|
-
:kind_of? => Net::HTTPSuccess,
|
214
|
-
:body => '{"some": "hash" }'
|
215
|
-
)
|
216
|
-
@solr = Chef::SolrQuery.from_params(:type => 'node',
|
217
|
-
:q => "hostname:latte")
|
218
|
-
@params = @solr.to_hash
|
219
|
-
@http = mock("Net::HTTP", :request => @http_response)
|
220
|
-
Chef::SolrQuery::SolrHTTPRequest.stub!(:http_client).and_return(@http)
|
221
|
-
end
|
222
|
-
|
223
|
-
describe "when the HTTP call is successful" do
|
224
|
-
it "should call get to /test/select with the escaped query" do
|
225
|
-
txfm_query = "q=content%3Ahostname__%3D__latte"
|
226
|
-
Net::HTTP::Get.should_receive(:new).with(%r(/test/select?.+#{txfm_query}))
|
227
|
-
Chef::SolrQuery::SolrHTTPRequest.select(@params)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
describe "when updating" do
|
233
|
-
before do
|
234
|
-
Net::HTTP::Post.stub!(:new).and_return(@http_request)
|
235
|
-
end
|
236
|
-
|
237
|
-
it "should post to /test/update" do
|
238
|
-
@doc = "<xml is the old tldr>"
|
239
|
-
Net::HTTP::Post.should_receive(:new).with("/test/update", "Content-Type" => "text/xml").and_return(@http_request)
|
240
|
-
Chef::SolrQuery::SolrHTTPRequest.update(@doc)
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
@@ -1,203 +0,0 @@
|
|
1
|
-
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
2
|
-
# Copyright:: Copyright (c) 2010, 2011 Opscode, inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require 'spec_helper'
|
19
|
-
|
20
|
-
require 'chef/solr_query'
|
21
|
-
require 'net/http'
|
22
|
-
|
23
|
-
#require 'rspec/mocks'
|
24
|
-
|
25
|
-
describe Chef::SolrQuery do
|
26
|
-
before do
|
27
|
-
Chef::SolrQuery::SolrHTTPRequest.solr_url = "http://example.com:8983"
|
28
|
-
|
29
|
-
@http_response = mock(
|
30
|
-
"Net::HTTP::Response",
|
31
|
-
:kind_of? => Net::HTTPSuccess,
|
32
|
-
:body => "{ :some => :hash }"
|
33
|
-
)
|
34
|
-
@http_request = mock(
|
35
|
-
"Net::HTTP::Request",
|
36
|
-
:body= => true
|
37
|
-
)
|
38
|
-
@http = mock("Net::HTTP", :request => @http_response)
|
39
|
-
Chef::SolrQuery::SolrHTTPRequest.stub!(:http_client).and_return(@http)
|
40
|
-
Net::HTTP::Post.stub!(:new).and_return(@http_request)
|
41
|
-
Net::HTTP::Get.stub!(:new).and_return(@http_request)
|
42
|
-
@doc = { "foo" => "bar" }
|
43
|
-
end
|
44
|
-
|
45
|
-
before(:each) do
|
46
|
-
@solr = Chef::SolrQuery.new
|
47
|
-
end
|
48
|
-
|
49
|
-
it "sets filter query params" do
|
50
|
-
@solr.filter_by(:database => 'chef')
|
51
|
-
@solr.filter_query.should == "+X_CHEF_database_CHEF_X:chef"
|
52
|
-
end
|
53
|
-
|
54
|
-
it "filters by type when querying for a builtin type" do
|
55
|
-
@solr.filter_by_type("node")
|
56
|
-
@solr.filter_query.should == "+X_CHEF_type_CHEF_X:node"
|
57
|
-
end
|
58
|
-
|
59
|
-
it "filters by type for data bag items" do
|
60
|
-
@solr.filter_by_type("users")
|
61
|
-
@solr.filter_query.split(" ").sort.should == ['+X_CHEF_type_CHEF_X:data_bag_item', '+data_bag:users']
|
62
|
-
end
|
63
|
-
|
64
|
-
it "stores the main query" do
|
65
|
-
@solr.query = "role:prod AND tags:chef-server"
|
66
|
-
@solr.query.should == "role:prod AND tags:chef-server"
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "when generating query params for select" do
|
70
|
-
before(:each) do
|
71
|
-
@solr = Chef::SolrQuery.from_params(:type => 'node', :q => "hostname:latte")
|
72
|
-
@params = @solr.to_hash
|
73
|
-
end
|
74
|
-
|
75
|
-
it "includes the query as q" do
|
76
|
-
@params[:q].should == "content:hostname__=__latte"
|
77
|
-
end
|
78
|
-
|
79
|
-
it "sets the response format to json" do
|
80
|
-
@params[:wt].should == "json"
|
81
|
-
end
|
82
|
-
|
83
|
-
it "uses indent=off to get a compact response" do
|
84
|
-
@params[:indent].should == "off"
|
85
|
-
end
|
86
|
-
|
87
|
-
it "includes the filter query to restrict the result set" do
|
88
|
-
@params[:fq].should == @solr.filter_query
|
89
|
-
end
|
90
|
-
|
91
|
-
it "defaults to returning 1000 rows" do
|
92
|
-
@params[:rows].should == 1000
|
93
|
-
end
|
94
|
-
|
95
|
-
it "returns the number of rows requested" do
|
96
|
-
@solr.params[:rows] = 500
|
97
|
-
@solr.to_hash[:rows].should == 500
|
98
|
-
end
|
99
|
-
|
100
|
-
it "offsets the row selection if requested" do
|
101
|
-
@solr.params[:start] = 500
|
102
|
-
@solr.to_hash[:start].should == 500
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
describe "when querying solr" do
|
108
|
-
before do
|
109
|
-
@couchdb = mock("CouchDB Test Double", :couchdb_database => "chunky_bacon")
|
110
|
-
@couchdb.stub!(:kind_of?).with(Chef::CouchDB).and_return(true) #ugh.
|
111
|
-
@solr = Chef::SolrQuery.from_params({:type => 'node', :q => "hostname:latte", :start => 10, :rows => 5}, @couchdb)
|
112
|
-
@docs = [1,2,3,4,5].map { |doc_id| {'X_CHEF_id_CHEF_X' => doc_id} }
|
113
|
-
@solr_response = {"response" => {"docs" => @docs, "start" => 10, "results" => 123}}
|
114
|
-
Chef::SolrQuery::SolrHTTPRequest.should_receive(:select).with(@solr.to_hash).and_return(@solr_response)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "it collects the document ids from the response" do
|
118
|
-
@solr.object_ids.should == [1,2,3,4,5]
|
119
|
-
end
|
120
|
-
|
121
|
-
it "does a bulk get of the objects from CouchDB" do
|
122
|
-
@couchdb.should_receive(:bulk_get).with([1,2,3,4,5]).and_return(%w{obj1 obj2 obj3 obj4 obj5})
|
123
|
-
@solr.objects.should == %w{obj1 obj2 obj3 obj4 obj5}
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
describe "when forcing a Solr commit" do
|
129
|
-
it "sends valid commit xml to solr" do
|
130
|
-
Chef::SolrQuery::SolrHTTPRequest.should_receive(:update).with("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<commit/>\n")
|
131
|
-
@solr.commit
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe "when deleting a database from Solr" do
|
136
|
-
it "sends a valid delete query to solr and forces a commit" do
|
137
|
-
Chef::SolrQuery::SolrHTTPRequest.should_receive(:update).with("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<delete><query>X_CHEF_database_CHEF_X:chef</query></delete>\n")
|
138
|
-
@solr.should_receive(:commit)
|
139
|
-
@solr.delete_database("chef")
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe "rebuilding the index" do
|
144
|
-
before do
|
145
|
-
Chef::Config[:couchdb_database] = "chunky_bacon"
|
146
|
-
end
|
147
|
-
|
148
|
-
it "deletes the index and commits" do
|
149
|
-
@solr.should_receive(:delete_database).with("chunky_bacon")
|
150
|
-
@solr.stub!(:reindex_all)
|
151
|
-
Chef::DataBag.stub!(:cdb_list).and_return([])
|
152
|
-
@solr.rebuild_index
|
153
|
-
end
|
154
|
-
|
155
|
-
it "reindexes Chef::ApiClient, Chef::Node, and Chef::Role objects, reporting the results as a hash" do
|
156
|
-
@solr.should_receive(:delete_database).with("chunky_bacon")
|
157
|
-
@solr.should_receive(:reindex_all).with(Chef::ApiClient).and_return(true)
|
158
|
-
@solr.should_receive(:reindex_all).with(Chef::Environment).and_return(true)
|
159
|
-
@solr.should_receive(:reindex_all).with(Chef::Node).and_return(true)
|
160
|
-
@solr.should_receive(:reindex_all).with(Chef::Role).and_return(true)
|
161
|
-
Chef::DataBag.stub!(:cdb_list).and_return([])
|
162
|
-
|
163
|
-
result = @solr.rebuild_index
|
164
|
-
result["Chef::ApiClient"].should == "success"
|
165
|
-
result["Chef::Node"].should == "success"
|
166
|
-
result["Chef::Role"].should == "success"
|
167
|
-
end
|
168
|
-
|
169
|
-
it "does not reindex Chef::OpenIDRegistration or Chef::WebUIUser objects" do
|
170
|
-
# hi there. the reason we're specifying this behavior is because these objects
|
171
|
-
# are not properly indexed in the first place and trying to reindex them
|
172
|
-
# tickles a bug in our CamelCase to snake_case code. See CHEF-1009.
|
173
|
-
@solr.should_receive(:delete_database).with("chunky_bacon")
|
174
|
-
@solr.stub!(:reindex_all).with(Chef::ApiClient)
|
175
|
-
@solr.stub!(:reindex_all).with(Chef::Node)
|
176
|
-
@solr.stub!(:reindex_all).with(Chef::Role)
|
177
|
-
@solr.should_not_receive(:reindex_all).with(Chef::OpenIDRegistration)
|
178
|
-
@solr.should_not_receive(:reindex_all).with(Chef::WebUIUser)
|
179
|
-
Chef::DataBag.stub!(:cdb_list).and_return([])
|
180
|
-
|
181
|
-
@solr.rebuild_index
|
182
|
-
end
|
183
|
-
|
184
|
-
it "reindexes databags" do
|
185
|
-
one_data_item = Chef::DataBagItem.new
|
186
|
-
one_data_item.raw_data = {"maybe"=>"snakes actually are evil", "id" => "just_sayin"}
|
187
|
-
two_data_item = Chef::DataBagItem.new
|
188
|
-
two_data_item.raw_data = {"tone_depth"=>"rumble_fish", "id" => "eff_yes"}
|
189
|
-
data_bag = Chef::DataBag.new
|
190
|
-
data_bag.stub!(:list).and_return([one_data_item, two_data_item])
|
191
|
-
|
192
|
-
@solr.should_receive(:delete_database).with("chunky_bacon")
|
193
|
-
@solr.stub!(:reindex_all)
|
194
|
-
Chef::DataBag.stub!(:cdb_list).and_return([data_bag])
|
195
|
-
|
196
|
-
data_bag.should_receive(:add_to_index)
|
197
|
-
one_data_item.should_receive(:add_to_index)
|
198
|
-
two_data_item.should_receive(:add_to_index)
|
199
|
-
|
200
|
-
@solr.rebuild_index["Chef::DataBag"].should == "success"
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
@@ -1,238 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Daniel DeLeo (<dan@kallistec.com>)
|
3
|
-
# Copyright:: Copyright (c) 2009 Daniel DeLeo
|
4
|
-
# License:: Apache License, Version 2.0
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
#
|
18
|
-
|
19
|
-
require 'spec_helper'
|
20
|
-
|
21
|
-
describe Chef::WebUIUser do
|
22
|
-
|
23
|
-
before do
|
24
|
-
@webui_user = Chef::WebUIUser.new
|
25
|
-
end
|
26
|
-
|
27
|
-
it "stores the admin status of the user" do
|
28
|
-
@webui_user.admin.should be_false
|
29
|
-
@webui_user.admin = true
|
30
|
-
@webui_user.admin.should be_true
|
31
|
-
@webui_user.should be_admin
|
32
|
-
end
|
33
|
-
|
34
|
-
it "stores the name with underscores subbed for dots" do
|
35
|
-
@webui_user.name.should be_nil
|
36
|
-
@webui_user.name = "foo.bar.baz"
|
37
|
-
@webui_user.name.should == "foo_bar_baz"
|
38
|
-
end
|
39
|
-
|
40
|
-
it "can be initialized with a hash to set instance variables" do
|
41
|
-
opt_hsh = {'name'=>'mud', 'salt'=>'just_a_lil', 'password'=>'beefded',
|
42
|
-
'openid'=>'notsomuch', '_rev'=>'0', '_id'=>'tehid'}
|
43
|
-
webui_user = Chef::WebUIUser.new(opt_hsh)
|
44
|
-
webui_user.name.should == 'mud'
|
45
|
-
webui_user.salt.should == 'just_a_lil'
|
46
|
-
webui_user.password.should == 'beefded'
|
47
|
-
webui_user.openid.should == 'notsomuch'
|
48
|
-
webui_user.couchdb_rev.should == '0'
|
49
|
-
webui_user.couchdb_id.should == 'tehid'
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "when setting or verifying a password" do
|
53
|
-
it "raises an error when the password doesn't match the confirmation password" do
|
54
|
-
lambda {@webui_user.set_password("nomnomnom", "yukyukyuk")}.should raise_error(ArgumentError, /do not match/)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "doesn't allow blank passwords" do
|
58
|
-
lambda {@webui_user.set_password("", "")}.should raise_error(ArgumentError, /cannot be blank/)
|
59
|
-
end
|
60
|
-
|
61
|
-
it "doesn't allow passwords less than 6 characters" do
|
62
|
-
lambda {@webui_user.set_password("2shrt", "2shrt")}.should raise_error(ArgumentError, /minimum of 6 characters/)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "generates a salt and hashes the password when the password is valid" do
|
66
|
-
@webui_user.set_password("valid_pw", "valid_pw")
|
67
|
-
@webui_user.salt.should_not be_nil
|
68
|
-
@webui_user.password.should match(/[0-9a-f]{32}/)
|
69
|
-
end
|
70
|
-
|
71
|
-
it "verifies a correct password" do
|
72
|
-
@webui_user.set_password("valid_pw", "valid_pw")
|
73
|
-
@webui_user.verify_password("valid_pw").should be_true
|
74
|
-
end
|
75
|
-
|
76
|
-
it "doesn't verify an incorrect password" do
|
77
|
-
@webui_user.set_password("valid_pw", "valid_pw")
|
78
|
-
@webui_user.verify_password("invalid_pw").should be_false
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
describe "when doing CRUD operations via API" do
|
83
|
-
before do
|
84
|
-
@webui_user.name = "test_user"
|
85
|
-
@rest = mock("Chef::REST")
|
86
|
-
Chef::REST.stub!(:new).and_return(@rest)
|
87
|
-
end
|
88
|
-
|
89
|
-
it "finds users by name via GET" do
|
90
|
-
@rest.should_receive(:get_rest).with("users/mud")
|
91
|
-
Chef::WebUIUser.load("mud")
|
92
|
-
end
|
93
|
-
|
94
|
-
it "finds all ids in the database via GET" do
|
95
|
-
@rest.should_receive(:get_rest).with("users")
|
96
|
-
Chef::WebUIUser.list
|
97
|
-
end
|
98
|
-
|
99
|
-
it "finds all documents in the database via GET" do
|
100
|
-
robots = Chef::WebUIUser.new("name"=>"we_robots")
|
101
|
-
happy = Chef::WebUIUser.new("name"=>"are_happy_robots")
|
102
|
-
query_results = [robots,happy]
|
103
|
-
query_obj = mock("Chef::Search::Query")
|
104
|
-
query_obj.should_receive(:search).with(:user).and_yield(query_results.first).and_yield(query_results.last)
|
105
|
-
Chef::Search::Query.stub!(:new).and_return(query_obj)
|
106
|
-
Chef::WebUIUser.list(true).should == {"we_robots" => robots, "are_happy_robots" => happy}
|
107
|
-
end
|
108
|
-
|
109
|
-
it "updates via PUT when saving" do
|
110
|
-
@rest.should_receive(:put_rest).with("users/test_user", @webui_user)
|
111
|
-
@webui_user.save
|
112
|
-
end
|
113
|
-
|
114
|
-
it "falls back to creating via POST if updating returns 404" do
|
115
|
-
response = mock("Net::HTTPResponse", :code => "404")
|
116
|
-
not_found = Net::HTTPServerException.new("404", response)
|
117
|
-
@rest.should_receive(:put_rest).with("users/test_user", @webui_user).and_raise(not_found)
|
118
|
-
@rest.should_receive(:post_rest).with("users", @webui_user)
|
119
|
-
@webui_user.save
|
120
|
-
end
|
121
|
-
|
122
|
-
it "creates via POST" do
|
123
|
-
@rest.should_receive(:post_rest).with("users", @webui_user)
|
124
|
-
@webui_user.create
|
125
|
-
end
|
126
|
-
|
127
|
-
it "deletes itself with DELETE" do
|
128
|
-
@rest.should_receive(:delete_rest).with("users/test_user")
|
129
|
-
@webui_user.destroy
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
describe "when doing CRUD operations to the DB" do
|
134
|
-
before do
|
135
|
-
@webui_user.name = "relaxed_test"
|
136
|
-
@couchdb = mock("Chef::Couchdb")
|
137
|
-
Chef::CouchDB.stub(:new).and_return(@couchdb)
|
138
|
-
@webui_user.instance_variable_set(:@couchdb, @couchdb)
|
139
|
-
end
|
140
|
-
|
141
|
-
it "finds users by name" do
|
142
|
-
@couchdb.should_receive(:load).with("webui_user", "test_user")
|
143
|
-
Chef::WebUIUser.cdb_load("test_user")
|
144
|
-
end
|
145
|
-
|
146
|
-
it "finds all ids in the database" do
|
147
|
-
couch_rows = {"one"=>"mos_def","two"=>"and","three"=>"talib_kweli"}.map do |key, val|
|
148
|
-
{"key" => key, "value" => val}
|
149
|
-
end
|
150
|
-
couch_return_val = {"rows" => couch_rows}
|
151
|
-
@couchdb.should_receive(:list).with("users", false).and_return(couch_return_val)
|
152
|
-
Chef::WebUIUser.cdb_list.sort.should == %w{one two three}.sort
|
153
|
-
end
|
154
|
-
|
155
|
-
it "finds all documents in the database" do
|
156
|
-
couch_rows = {"one"=>"mos_def","two"=>"and","three"=>"talib_kweli"}.map do |key, val|
|
157
|
-
{"key" => key, "value" => val}
|
158
|
-
end
|
159
|
-
couch_return_val = {"rows" => couch_rows}
|
160
|
-
@couchdb.should_receive(:list).with("users", true).and_return(couch_return_val)
|
161
|
-
Chef::WebUIUser.cdb_list(true).sort.should == %w{mos_def and talib_kweli}.sort
|
162
|
-
end
|
163
|
-
|
164
|
-
it "updates and saves documents" do
|
165
|
-
@couchdb.should_receive(:store).with("webui_user", "relaxed_test", @webui_user).and_return("rev"=>"run")
|
166
|
-
@webui_user.cdb_save
|
167
|
-
@webui_user.couchdb_rev.should == "run"
|
168
|
-
end
|
169
|
-
|
170
|
-
it "deletes itself" do
|
171
|
-
@webui_user = Chef::WebUIUser.new("_rev" => "run", "name" => "relaxed_test")
|
172
|
-
@couchdb.should_receive(:delete).with("webui_user", "relaxed_test", "run")
|
173
|
-
@webui_user.cdb_destroy
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
describe "when converting to/from JSON" do
|
178
|
-
before do
|
179
|
-
@webui_user.name = "test_user"
|
180
|
-
end
|
181
|
-
|
182
|
-
it "keeps type data so it can be deserialized" do
|
183
|
-
@webui_user.to_json.should match(Regexp.escape('"json_class":"Chef::WebUIUser"'))
|
184
|
-
end
|
185
|
-
|
186
|
-
it "includes the name, salt, password, openid and admin status" do
|
187
|
-
@webui_user = Chef::WebUIUser.new("name"=>"test_user","password"=>"pw","salt"=>"pirate","openid"=>"really?")
|
188
|
-
@webui_user.admin = true
|
189
|
-
json = @webui_user.to_json
|
190
|
-
|
191
|
-
json.should match(Regexp.escape('"name":"test_user"'))
|
192
|
-
json.should match(Regexp.escape('"password":"pw"'))
|
193
|
-
json.should match(Regexp.escape('"salt":"pirate"'))
|
194
|
-
json.should match(Regexp.escape('"openid":"really?"'))
|
195
|
-
json.should match(Regexp.escape('"admin":true'))
|
196
|
-
end
|
197
|
-
|
198
|
-
it "includes the couchdb _rev if available" do
|
199
|
-
@webui_user = Chef::WebUIUser.new("_rev"=>"RuN")
|
200
|
-
json = @webui_user.to_json
|
201
|
-
json.should match(Regexp.escape('"_rev":"RuN"'))
|
202
|
-
end
|
203
|
-
|
204
|
-
it "includes the couchdb _id if available" do
|
205
|
-
@webui_user = Chef::WebUIUser.new("_id"=>"ego")
|
206
|
-
json = @webui_user.to_json
|
207
|
-
json.should match(Regexp.escape('"_id":"ego"'))
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
describe "behaving like a couch-able (relaxed?) object (cf CHEF-864)" do
|
212
|
-
it "has an attr reader for couchdb_id" do
|
213
|
-
@webui_user.should_not respond_to(:couchdb_id=)
|
214
|
-
@webui_user.should respond_to(:couchdb_id)
|
215
|
-
@webui_user.instance_variable_set(:@couchdb_id, "a big long UUID")
|
216
|
-
@webui_user.couchdb_id.should == "a big long UUID"
|
217
|
-
end
|
218
|
-
|
219
|
-
it "sets its couchdb id when loading from the database" do
|
220
|
-
# reqs via REST eventually get to Chef::JSONCompat.from_json
|
221
|
-
webui_user = Chef::JSONCompat.from_json('{"salt":null,"name":"test_user","json_class":"Chef::WebUIUser","admin":false,"openid":null,"password":null,"chef_type":"webui_user","_id":"IdontNeedNoID"}')
|
222
|
-
webui_user.couchdb_id.should == "IdontNeedNoID"
|
223
|
-
end
|
224
|
-
|
225
|
-
it "has an attr reader for couchdb_rev" do
|
226
|
-
@webui_user.should_not respond_to(:couchdb_rev=)
|
227
|
-
@webui_user.should respond_to(:couchdb_rev)
|
228
|
-
@webui_user.instance_variable_set(:@couchdb_rev, "a couchdb version string")
|
229
|
-
@webui_user.couchdb_rev.should == "a couchdb version string"
|
230
|
-
end
|
231
|
-
|
232
|
-
it "sets the couchdb_rev when loading from the database" do
|
233
|
-
webui_user = Chef::JSONCompat.from_json('{"salt":null,"name":"test_user","json_class":"Chef::WebUIUser","admin":false,"openid":null,"password":null,"chef_type":"webui_user","_id":"IdontNeedNoID","_rev":"moto"}')
|
234
|
-
webui_user.couchdb_rev.should == "moto"
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
end
|