microwave 1.0.4 → 11.400.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +2 -2
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/chef-solo +0 -2
- data/bin/shef +6 -5
- data/lib/chef.rb +2 -4
- data/spec/data/big_json.json +2 -1
- data/spec/data/big_json_plus_one.json +2 -1
- data/spec/data/cookbooks/chefignore +2 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
- data/spec/functional/knife/exec_spec.rb +4 -6
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +64 -3
- data/spec/functional/resource/cookbook_file_spec.rb +33 -2
- data/spec/functional/resource/deploy_revision_spec.rb +515 -0
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +12 -10
- data/spec/functional/resource/registry_spec.rb +572 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +28 -3
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +238 -0
- data/spec/functional/shell_spec.rb +101 -0
- data/spec/functional/tiny_server_spec.rb +5 -4
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- data/spec/spec_helper.rb +15 -3
- data/spec/stress/win32/security_spec.rb +5 -5
- data/spec/support/chef_helpers.rb +14 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/matchers/leak.rb +1 -1
- data/spec/support/platform_helpers.rb +18 -0
- data/spec/support/shared/functional/directory_resource.rb +85 -23
- data/spec/support/shared/functional/file_resource.rb +198 -53
- data/spec/support/shared/functional/securable_resource.rb +140 -105
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/tiny_server.rb +29 -10
- data/spec/unit/api_client/registration_spec.rb +172 -0
- data/spec/unit/api_client_spec.rb +156 -103
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +329 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +188 -16
- data/spec/unit/config_spec.rb +54 -4
- data/spec/unit/cookbook/chefignore_spec.rb +2 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
- data/spec/unit/json_compat_spec.rb +69 -0
- data/spec/unit/knife/bootstrap_spec.rb +81 -28
- data/spec/unit/knife/client_reregister_spec.rb +23 -22
- data/spec/unit/knife/configure_spec.rb +29 -26
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
- data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -7
- data/spec/unit/knife/data_bag_create_spec.rb +14 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +121 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -17
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +56 -491
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +272 -137
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +411 -339
- data/spec/unit/platform_spec.rb +8 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/deploy/revision_spec.rb +2 -8
- data/spec/unit/provider/deploy_spec.rb +6 -40
- data/spec/unit/provider/directory_spec.rb +103 -68
- data/spec/unit/provider/erl_call_spec.rb +0 -2
- data/spec/unit/provider/file_spec.rb +69 -59
- data/spec/unit/provider/git_spec.rb +0 -10
- data/spec/unit/provider/group/groupadd_spec.rb +1 -1
- data/spec/unit/provider/group/usermod_spec.rb +2 -2
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/link_spec.rb +1 -1
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/rubygems_spec.rb +0 -18
- data/spec/unit/provider/package/yum_spec.rb +79 -15
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +24 -7
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +3 -6
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +4 -4
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
- data/spec/unit/provider/service/init_service_spec.rb +26 -3
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
- data/spec/unit/provider/service_spec.rb +2 -2
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +57 -31
- data/spec/unit/provider/user_spec.rb +7 -16
- data/spec/unit/provider_spec.rb +4 -3
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- data/spec/unit/resource/log_spec.rb +9 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +27 -4
- data/spec/unit/rest/auth_credentials_spec.rb +2 -14
- data/spec/unit/rest_spec.rb +122 -187
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- metadata +162 -157
- data/README.rdoc +0 -177
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/json_compat_spect.rb +0 -53
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
@@ -1,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
|