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.
Files changed (249) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +2 -2
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/chef-solo +0 -2
  7. data/bin/shef +6 -5
  8. data/lib/chef.rb +2 -4
  9. data/spec/data/big_json.json +2 -1
  10. data/spec/data/big_json_plus_one.json +2 -1
  11. data/spec/data/cookbooks/chefignore +2 -0
  12. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  13. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  14. data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
  15. data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
  16. data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
  17. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  18. data/spec/data/nodes/default.rb +3 -3
  19. data/spec/data/nodes/test.example.com.rb +3 -3
  20. data/spec/data/nodes/test.rb +3 -3
  21. data/spec/data/partial_one.erb +1 -0
  22. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  23. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  24. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  25. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  26. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  27. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  28. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  29. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  30. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  31. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  32. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  33. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  34. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  35. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  36. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  37. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  38. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  39. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  40. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  41. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  42. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  43. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  44. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  45. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  46. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  47. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  48. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  49. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  50. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  51. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  52. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  53. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  54. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  55. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  56. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  57. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  58. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  59. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  60. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  61. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  62. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  63. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  64. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  65. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  66. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  67. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  68. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  69. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  70. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  71. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  72. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  73. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  74. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  75. data/spec/data/shef-config.rb +10 -0
  76. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  77. data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
  78. data/spec/functional/knife/exec_spec.rb +4 -6
  79. data/spec/functional/knife/smoke_test.rb +34 -0
  80. data/spec/functional/knife/ssh_spec.rb +64 -3
  81. data/spec/functional/resource/cookbook_file_spec.rb +33 -2
  82. data/spec/functional/resource/deploy_revision_spec.rb +515 -0
  83. data/spec/functional/resource/directory_spec.rb +4 -0
  84. data/spec/functional/resource/file_spec.rb +56 -22
  85. data/spec/functional/resource/link_spec.rb +12 -10
  86. data/spec/functional/resource/registry_spec.rb +572 -0
  87. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  88. data/spec/functional/resource/remote_file_spec.rb +28 -3
  89. data/spec/functional/resource/template_spec.rb +23 -2
  90. data/spec/functional/run_lock_spec.rb +238 -0
  91. data/spec/functional/shell_spec.rb +101 -0
  92. data/spec/functional/tiny_server_spec.rb +5 -4
  93. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  94. data/spec/functional/win32/security_spec.rb +37 -0
  95. data/spec/spec_helper.rb +15 -3
  96. data/spec/stress/win32/security_spec.rb +5 -5
  97. data/spec/support/chef_helpers.rb +14 -3
  98. data/spec/support/lib/chef/resource/cat.rb +3 -5
  99. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  100. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  101. data/spec/support/matchers/leak.rb +1 -1
  102. data/spec/support/platform_helpers.rb +18 -0
  103. data/spec/support/shared/functional/directory_resource.rb +85 -23
  104. data/spec/support/shared/functional/file_resource.rb +198 -53
  105. data/spec/support/shared/functional/securable_resource.rb +140 -105
  106. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  107. data/spec/support/shared/unit/file_system_support.rb +110 -0
  108. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  109. data/spec/tiny_server.rb +29 -10
  110. data/spec/unit/api_client/registration_spec.rb +172 -0
  111. data/spec/unit/api_client_spec.rb +156 -103
  112. data/spec/unit/application/apply.rb +84 -0
  113. data/spec/unit/application/knife_spec.rb +5 -0
  114. data/spec/unit/application_spec.rb +57 -2
  115. data/spec/unit/chef_fs/diff_spec.rb +329 -0
  116. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  117. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  118. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  119. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  120. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  121. data/spec/unit/client_spec.rb +188 -16
  122. data/spec/unit/config_spec.rb +54 -4
  123. data/spec/unit/cookbook/chefignore_spec.rb +2 -1
  124. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  125. data/spec/unit/cookbook_loader_spec.rb +153 -91
  126. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  127. data/spec/unit/cookbook_spec.rb +3 -20
  128. data/spec/unit/cookbook_version_spec.rb +23 -122
  129. data/spec/unit/digester_spec.rb +50 -0
  130. data/spec/unit/dsl/data_query_spec.rb +66 -0
  131. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  132. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  133. data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
  134. data/spec/unit/environment_spec.rb +0 -130
  135. data/spec/unit/exceptions_spec.rb +2 -3
  136. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
  137. data/spec/unit/json_compat_spec.rb +69 -0
  138. data/spec/unit/knife/bootstrap_spec.rb +81 -28
  139. data/spec/unit/knife/client_reregister_spec.rb +23 -22
  140. data/spec/unit/knife/configure_spec.rb +29 -26
  141. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  142. data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
  143. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  144. data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
  145. data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
  146. data/spec/unit/knife/core/ui_spec.rb +156 -7
  147. data/spec/unit/knife/data_bag_create_spec.rb +14 -0
  148. data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
  149. data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
  150. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  151. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  152. data/spec/unit/knife/knife_help.rb +7 -7
  153. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  154. data/spec/unit/knife/ssh_spec.rb +121 -15
  155. data/spec/unit/knife/status_spec.rb +2 -2
  156. data/spec/unit/knife/user_create_spec.rb +86 -0
  157. data/spec/unit/knife/user_delete_spec.rb +39 -0
  158. data/spec/unit/knife/user_edit_spec.rb +42 -0
  159. data/spec/unit/knife/user_list_spec.rb +32 -0
  160. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  161. data/spec/unit/knife/user_show_spec.rb +41 -0
  162. data/spec/unit/knife_spec.rb +53 -0
  163. data/spec/unit/lwrp_spec.rb +59 -17
  164. data/spec/unit/mixin/checksum_spec.rb +2 -2
  165. data/spec/unit/mixin/deep_merge_spec.rb +56 -491
  166. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  167. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  168. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  169. data/spec/unit/mixin/securable_spec.rb +5 -3
  170. data/spec/unit/mixin/template_spec.rb +119 -0
  171. data/spec/unit/node/attribute_spec.rb +272 -137
  172. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  173. data/spec/unit/node_spec.rb +411 -339
  174. data/spec/unit/platform_spec.rb +8 -8
  175. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  176. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  177. data/spec/unit/provider/deploy/revision_spec.rb +2 -8
  178. data/spec/unit/provider/deploy_spec.rb +6 -40
  179. data/spec/unit/provider/directory_spec.rb +103 -68
  180. data/spec/unit/provider/erl_call_spec.rb +0 -2
  181. data/spec/unit/provider/file_spec.rb +69 -59
  182. data/spec/unit/provider/git_spec.rb +0 -10
  183. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  184. data/spec/unit/provider/group/usermod_spec.rb +2 -2
  185. data/spec/unit/provider/http_request_spec.rb +28 -69
  186. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  187. data/spec/unit/provider/link_spec.rb +1 -1
  188. data/spec/unit/provider/ohai_spec.rb +4 -4
  189. data/spec/unit/provider/package/apt_spec.rb +0 -1
  190. data/spec/unit/provider/package/ips_spec.rb +0 -1
  191. data/spec/unit/provider/package/rubygems_spec.rb +0 -18
  192. data/spec/unit/provider/package/yum_spec.rb +79 -15
  193. data/spec/unit/provider/package_spec.rb +7 -5
  194. data/spec/unit/provider/registry_key_spec.rb +269 -0
  195. data/spec/unit/provider/remote_directory_spec.rb +24 -7
  196. data/spec/unit/provider/remote_file_spec.rb +36 -0
  197. data/spec/unit/provider/route_spec.rb +3 -6
  198. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  199. data/spec/unit/provider/service/arch_service_spec.rb +4 -4
  200. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  201. data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
  202. data/spec/unit/provider/service/init_service_spec.rb +26 -3
  203. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  204. data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
  205. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  206. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  207. data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
  208. data/spec/unit/provider/service_spec.rb +2 -2
  209. data/spec/unit/provider/subversion_spec.rb +1 -1
  210. data/spec/unit/provider/template_spec.rb +35 -11
  211. data/spec/unit/provider/user/dscl_spec.rb +57 -31
  212. data/spec/unit/provider/user_spec.rb +7 -16
  213. data/spec/unit/provider_spec.rb +4 -3
  214. data/spec/unit/recipe_spec.rb +10 -8
  215. data/spec/unit/registry_helper_spec.rb +376 -0
  216. data/spec/unit/resource/log_spec.rb +9 -0
  217. data/spec/unit/resource/registry_key_spec.rb +171 -0
  218. data/spec/unit/resource/remote_file_spec.rb +21 -23
  219. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  220. data/spec/unit/resource/service_spec.rb +11 -0
  221. data/spec/unit/resource_spec.rb +27 -4
  222. data/spec/unit/rest/auth_credentials_spec.rb +2 -14
  223. data/spec/unit/rest_spec.rb +122 -187
  224. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  225. data/spec/unit/run_context_spec.rb +18 -4
  226. data/spec/unit/run_list_spec.rb +0 -209
  227. data/spec/unit/run_lock_spec.rb +37 -0
  228. data/spec/unit/runner_spec.rb +101 -2
  229. data/spec/unit/scan_access_control_spec.rb +4 -4
  230. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  231. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  232. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
  233. data/spec/unit/shell_out_spec.rb +18 -0
  234. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  235. data/spec/unit/user_spec.rb +255 -0
  236. metadata +162 -157
  237. data/README.rdoc +0 -177
  238. data/spec/unit/certificate_spec.rb +0 -76
  239. data/spec/unit/checksum_cache_spec.rb +0 -209
  240. data/spec/unit/checksum_spec.rb +0 -94
  241. data/spec/unit/couchdb_spec.rb +0 -274
  242. data/spec/unit/index_queue_spec.rb +0 -391
  243. data/spec/unit/json_compat_spect.rb +0 -53
  244. data/spec/unit/mixin/language_spec.rb +0 -305
  245. data/spec/unit/openid_registration_spec.rb +0 -153
  246. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  247. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  248. data/spec/unit/solr_query_spec.rb +0 -203
  249. 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