microwave 1.0.4 → 11.400.2

Sign up to get free protection for your applications and to get access to all the features.
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