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,454 +0,0 @@
1
- #
2
- # Author:: Seth Falcon (<seth@opscode.com>)
3
- # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
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
- require 'chef/solr_query/query_transform'
21
-
22
- describe "Chef::SolrQuery::QueryTransform" do
23
- before(:each) do
24
- @parser = Chef::SolrQuery::QueryTransform
25
- @parseError = Chef::Exceptions::QueryParseError
26
- end
27
-
28
- describe "single term queries" do
29
- basic_terms = %w(a ab 123 a1 2b foo_bar baz-baz)
30
- basic_terms << " leading"
31
- basic_terms << "trailing "
32
- basic_terms += %w(XAND ANDX XOR ORX XNOT NOTX)
33
- basic_terms.each do |term|
34
- expect = "T:#{term.strip}"
35
- it "'#{term}' => #{expect}" do
36
- @parser.parse(term).should == expect
37
- end
38
- end
39
- describe "invalid" do
40
- %w(AND OR NOT :).each do |t|
41
- it "'#{t}' => ParseError" do
42
- lambda { @parser.parse(t) }.should raise_error(@parseError)
43
- end
44
- end
45
- end
46
-
47
- describe "wildcards in terms" do
48
- it "allows * as a wildcard" do
49
- @parser.parse("foo*bar").should == "T:foo*bar"
50
- end
51
-
52
- it "allows a single ? as a wildcard" do
53
- @parser.parse("foo?bar").should == "T:foo?bar"
54
- end
55
-
56
- it "allows multiple ? as fixed length wildcards" do
57
- @parser.parse("foo???bar").should == "T:foo???bar"
58
- end
59
-
60
- it "allows a leading wildcard with *" do
61
- # NOTE: This is not valid lucene query syntax. However, our
62
- # index format and query transformation can allow it because
63
- # the transformed query ends up with the '*' not in leading
64
- # position. We decided that allowing it makes sense because
65
- # queries like ec2:* are useful and many users expect this
66
- # behavior to work.
67
- @parser.parse("*foobar").should == "T:*foobar"
68
- end
69
-
70
- it "does not allow a leading wildcard with ?" do
71
- lambda { @parser.parse("?foobar") }.should raise_error(@parseError)
72
- end
73
-
74
- it "does not allow a leading wildcard with ?" do
75
- lambda { @parser.parse("afield:?foobar") }.should raise_error(@parseError)
76
- end
77
-
78
- end
79
-
80
- describe "escaped special characters in terms" do
81
- special_chars = ["!", "(", ")", "{", "}", "[", "]", "^", "\"",
82
- "~", "*", "?", ":", "\\", "&", "|", "+", "-"]
83
- example_fmts = ['foo%sbar', '%sb', 'a%s']
84
- special_chars.each do |char|
85
- example_fmts.each do |fmt|
86
- input = fmt % ("\\" + char)
87
- expect = "T:#{input}"
88
- it "'#{input}' => #{expect}" do
89
- @parser.parse(input).should == expect
90
- end
91
- end
92
- end
93
- end
94
-
95
- describe "special characters in terms are not allowed" do
96
- # NOTE: '*' is not a valid start letter for a lucene search
97
- # term, however, we can support it because of our index
98
- # structure and query transformation. We decided to keep this
99
- # flexibility because queries like ec2:* are common and useful.
100
- prefix_ok = ["!", "+", "-", "*"]
101
- suffix_ok = ["*", "?", "~", "-"]
102
- # FIXME: ideally, '!' would not be allowed in the middle of a
103
- # term. Currently we parse foo!bar the same as foo !bar.
104
- # Also '+' might be nice to disallow
105
- embed_ok = ["*", "?", ":", "-", "!", "+"]
106
- special_chars = ["!", "(", ")", "{", "}", "[", "]", "^", "\"",
107
- "~", "*", "?", ":", "\\", "&", "|", "+", "-"]
108
- example_fmts = {
109
- :prefix => '%sb',
110
- :middle => 'foo%sbar',
111
- :suffix => 'a%s'
112
- }
113
- special_chars.each do |char|
114
- example_fmts.keys.each do |key|
115
- fmt = example_fmts[key]
116
- if key == :prefix && prefix_ok.include?(char)
117
- :pass
118
- elsif key == :middle && embed_ok.include?(char)
119
- :pass
120
- elsif key == :suffix && suffix_ok.include?(char)
121
- :pass
122
- else
123
- input = fmt % char
124
- it "disallows: '#{input}'" do
125
- lambda { @parser.parse(input) }.should raise_error(@parseError)
126
- end
127
- end
128
- end
129
- end
130
- end
131
-
132
- end
133
-
134
- describe "multiple terms" do
135
- it "should allow multiple terms" do
136
- @parser.parse("a b cdefg").should == "T:a T:b T:cdefg"
137
- end
138
- end
139
-
140
- describe "boolean queries" do
141
- describe "two term basic and/or" do
142
- binary_operators = [['AND', 'AND'], ['&&', 'AND'], ['OR', 'OR'], ['||', 'OR']]
143
- binary_operators.each do |op, op_name|
144
- expect = "(OP:#{op_name} T:t1 T:t2)"
145
- it "should parse 't1 #{op} t2' => #{expect}" do
146
- @parser.parse("t1 #{op} t2").should == expect
147
- end
148
- end
149
- end
150
-
151
- it "should allow a string of terms with ands and ors" do
152
- expect = "(OP:AND T:t1 (OP:OR T:t2 (OP:AND T:t3 T:t4)))"
153
- @parser.parse("t1 AND t2 OR t3 AND t4").should == expect
154
- end
155
- end
156
-
157
- describe "grouping with parens" do
158
- it "should create a single group for (aterm)" do
159
- @parser.parse("(aterm)").should == "(T:aterm)"
160
- end
161
-
162
- describe "and booleans" do
163
-
164
- %w(AND &&).each do |op|
165
- expect = "((OP:AND T:a T:b))"
166
- input = "(a #{op} b)"
167
- it "parses #{input} => #{expect}" do
168
- @parser.parse(input).should == expect
169
- end
170
- end
171
-
172
- %w(OR ||).each do |op|
173
- expect = "((OP:OR T:a T:b))"
174
- input = "(a #{op} b)"
175
- it "parses #{input} => #{expect}" do
176
- @parser.parse(input).should == expect
177
- end
178
- end
179
-
180
- it "should handle a LHS group" do
181
- expect = "(OP:OR ((OP:AND T:a T:b)) T:c)"
182
- @parser.parse("(a && b) OR c").should == expect
183
- @parser.parse("(a && b) || c").should == expect
184
- end
185
-
186
- it "should handle a RHS group" do
187
- expect = "(OP:OR T:c ((OP:AND T:a T:b)))"
188
- @parser.parse("c OR (a && b)").should == expect
189
- @parser.parse("c OR (a AND b)").should == expect
190
- end
191
-
192
- it "should handle both sides as groups" do
193
- expect = "(OP:OR ((OP:AND T:c T:d)) ((OP:AND T:a T:b)))"
194
- @parser.parse("(c AND d) OR (a && b)").should == expect
195
- end
196
- end
197
- end
198
-
199
- describe "NOT queries" do
200
- # input, output
201
- [
202
- ["a NOT b", "T:a (OP:NOT T:b)"],
203
- ["a ! b", "T:a (OP:NOT T:b)"],
204
- ["a !b", "T:a (OP:NOT T:b)"],
205
- ["a NOT (b || c)", "T:a (OP:NOT ((OP:OR T:b T:c)))"],
206
- ["a ! (b || c)", "T:a (OP:NOT ((OP:OR T:b T:c)))"],
207
- ["a !(b || c)", "T:a (OP:NOT ((OP:OR T:b T:c)))"]
208
- ].each do |input, expected|
209
- it "should parse '#{input}' => #{expected.inspect}" do
210
- @parser.parse(input).should == expected
211
- end
212
- end
213
-
214
- ["NOT", "a NOT", "(NOT)"].each do |d|
215
- it "should raise a ParseError on '#{d}'" do
216
- lambda { @parser.parse(d) }.should raise_error(@parseError)
217
- end
218
- end
219
- end
220
-
221
- describe 'required and prohibited prefixes (+/-)' do
222
- ["+", "-"].each do |kind|
223
- [
224
- ["#{kind}foo", "(OP:#{kind} T:foo)"],
225
- ["bar #{kind}foo", "T:bar (OP:#{kind} T:foo)"],
226
- ["(#{kind}oneA twoA) b", "((OP:#{kind} T:oneA) T:twoA) T:b"]
227
- ].each do |input, expect|
228
- it "should parse '#{input} => #{expect.inspect}" do
229
- @parser.parse(input).should == expect
230
- end
231
- end
232
- end
233
-
234
- # it 'ignores + embedded in a term' do
235
- # @parser.parse("one+two").should == "T:one+two"
236
- # end
237
-
238
- it 'ignores - embedded in a term' do
239
- @parser.parse("one-two").should == "T:one-two"
240
- end
241
-
242
- it "allows a trailing dash" do
243
- @parser.parse("one-").should == "T:one-"
244
- end
245
-
246
- end
247
-
248
- describe "phrases (strings)" do
249
- phrases = [['"single"', 'STR:"single"'],
250
- ['"two term"', 'STR:"two term"'],
251
- ['"has \"escaped\" quote\"s"', 'STR:"has \"escaped\" quote\"s"']
252
- ]
253
- phrases.each do |phrase, expect|
254
- it "'#{phrase}' => #{expect}" do
255
- @parser.parse(phrase).should == expect
256
- end
257
- end
258
-
259
- describe "invalid" do
260
- bad = ['""', '":not:a:term"', '"a :bad:']
261
- bad.each do |t|
262
- it "'#{t}' => ParseError" do
263
- lambda { @parser.parse(t) }.should raise_error(@parseError)
264
- end
265
- end
266
- end
267
-
268
- it "allows phrases to be required with '+'" do
269
- @parser.parse('+"a b c"').should == '(OP:+ STR:"a b c")'
270
- end
271
-
272
- it "allows phrases to be prohibited with '-'" do
273
- @parser.parse('-"a b c"').should == '(OP:- STR:"a b c")'
274
- end
275
-
276
- it "allows phrases to be excluded with NOT" do
277
- @parser.parse('a NOT "b c"').should == 'T:a (OP:NOT STR:"b c")'
278
- end
279
-
280
- end
281
-
282
- describe "fields" do
283
- it "parses a term annotated with a field" do
284
- @parser.parse("afield:aterm").should == "(F:afield T:aterm)"
285
- end
286
-
287
- it "allows underscore in a field name" do
288
- @parser.parse("a_field:aterm").should == "(F:a_field T:aterm)"
289
- end
290
-
291
- it "parses a group annotated with a field" do
292
- @parser.parse("afield:(a b c)").should == "(F:afield (T:a T:b T:c))"
293
- end
294
-
295
- it "parses a phrase annotated with a field" do
296
- @parser.parse('afield:"a b c"').should == '(F:afield STR:"a b c")'
297
- end
298
-
299
- it "allows @ in a term" do
300
- @parser.parse('afield:foo@acme.org').should == '(F:afield T:foo@acme.org)'
301
- end
302
-
303
- describe "and binary operators" do
304
- examples = [
305
- ['term1 AND afield:term2', "(OP:AND T:term1 (F:afield T:term2))"],
306
- ['afield:term1 AND term2', "(OP:AND (F:afield T:term1) T:term2)"],
307
- ['afield:term1 AND bfield:term2',
308
- "(OP:AND (F:afield T:term1) (F:bfield T:term2))"]]
309
- examples.each do |input, want|
310
- it "'#{input}' => '#{want}'" do
311
- @parser.parse(input).should == want
312
- end
313
- end
314
- end
315
-
316
- describe "and unary operators" do
317
- examples = [
318
- ['term1 AND NOT afield:term2',
319
- "(OP:AND T:term1 (OP:NOT (F:afield T:term2)))"],
320
- ['term1 AND ! afield:term2',
321
- "(OP:AND T:term1 (OP:NOT (F:afield T:term2)))"],
322
- ['term1 AND !afield:term2',
323
- "(OP:AND T:term1 (OP:NOT (F:afield T:term2)))"],
324
- ['term1 AND -afield:term2',
325
- "(OP:AND T:term1 (OP:- (F:afield T:term2)))"],
326
- ['-afield:[* TO *]',
327
- "(OP:- (FR:afield [*] [*]))"]
328
- ]
329
- examples.each do |input, want|
330
- it "#{input} => #{want}" do
331
- @parser.parse(input).should == want
332
- end
333
- end
334
- end
335
- end
336
-
337
- describe "range queries" do
338
- before(:each) do
339
- @kinds = {
340
- "inclusive" => {:left => "[", :right => "]"},
341
- "exclusive" => {:left => "{", :right => "}"}
342
- }
343
- end
344
-
345
- def make_expect(kind, field, s, e)
346
- expect_fmt = "(FR:%s %s%s%s %s%s%s)"
347
- left = @kinds[kind][:left]
348
- right = @kinds[kind][:right]
349
- expect_fmt % [field, left, s, right, left, e, right]
350
- end
351
-
352
- def make_query(kind, field, s, e)
353
- query_fmt = "%s:%s%s TO %s%s"
354
- left = @kinds[kind][:left]
355
- right = @kinds[kind][:right]
356
- query_fmt % [field, left, s, e, right]
357
- end
358
-
359
- ["inclusive", "exclusive"].each do |kind|
360
- tests = [["afield", "start", "end"],
361
- ["afield", "start", "*"],
362
- ["afield", "*", "end"],
363
- ["afield", "*", "*"]
364
- ]
365
- tests.each do |field, s, e|
366
- it "parses an #{kind} range query #{s} TO #{e}" do
367
- expect = make_expect(kind, field, s, e)
368
- query = make_query(kind, field, s, e)
369
- @parser.parse(query).should == expect
370
- end
371
- end
372
- end
373
-
374
- describe "and binary operators" do
375
- [["afield:[start TO end] AND term",
376
- "(OP:AND (FR:afield [start] [end]) T:term)"],
377
- ["term OR afield:[start TO end]",
378
- "(OP:OR T:term (FR:afield [start] [end]))"],
379
- ["f1:[s1 TO e1] OR f2:[s2 TO e2]",
380
- "(OP:OR (FR:f1 [s1] [e1]) (FR:f2 [s2] [e2]))"]
381
- ].each do |q, want|
382
- it "parses '#{q}'" do
383
- @parser.parse(q).should == want
384
- end
385
- end
386
- end
387
-
388
- describe "and unary operators" do
389
- [["t1 NOT afield:[start TO end]",
390
- "T:t1 (OP:NOT (FR:afield [start] [end]))"]
391
- ].each do |input, want|
392
- it "#{input} => #{want}" do
393
- @parser.parse(input).should == want
394
- end
395
- end
396
- end
397
- end
398
-
399
- describe "proximity query" do
400
- [
401
- ['"one two"~10', '(OP:~ STR:"one two" 10)'],
402
- ['word~', '(OP:~ T:word)'],
403
- ['word~0.5', '(OP:~ T:word 0.5)']
404
- ].each do |input, expect|
405
- it "'#{input}' => #{expect}" do
406
- @parser.parse(input).should == expect
407
- end
408
- end
409
- end
410
-
411
- describe "term boosting" do
412
- [
413
- ['"one two"^10', '(OP:^ STR:"one two" 10)'],
414
- ['word^0.5', '(OP:^ T:word 0.5)']
415
- ].each do |input, expect|
416
- it "'#{input}' => #{expect}" do
417
- @parser.parse(input).should == expect
418
- end
419
- end
420
-
421
- it "should fail to parse if no boosting argument is given" do
422
- lambda { @parser.parse("foo^")}.should raise_error(@parseError)
423
- end
424
- end
425
-
426
- describe "examples" do
427
- examples = [['tags:apples*.for.eating.com', "(F:tags T:apples*.for.eating.com)"],
428
- ['ohai_time:[1234.567 TO *]', "(FR:ohai_time [1234.567] [*])"],
429
- ['ohai_time:[* TO 1234.567]', "(FR:ohai_time [*] [1234.567])"],
430
- ['ohai_time:[* TO *]', "(FR:ohai_time [*] [*])"]]
431
- # ['aterm AND afield:aterm', "((OP:AND T:aterm ((F:afield T:aterm))))"],
432
- # ['role:prod AND aterm', "blah"],
433
- # ['role:prod AND xy:true', "blah"]]
434
- examples.each do |input, want|
435
- it "'#{input}' => '#{want}'" do
436
- @parser.parse(input).should == want
437
- end
438
- end
439
- end
440
-
441
- describe "transform queries for solr schema" do
442
- testcase_file = "#{CHEF_SPEC_DATA}/search_queries_to_transform.txt"
443
- lines = File.readlines(testcase_file).map { |line| line.strip }
444
- lines = lines.select { |line| !line.empty? }
445
- testcases = Hash[*(lines)]
446
- testcases.keys.sort.each do |input|
447
- expected = testcases[input]
448
- it "from> #{input}\n to> #{expected}\n" do
449
- @parser.transform(input).should == expected
450
- end
451
- end
452
- end
453
-
454
- end