searchkick-sinneduy 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.travis.yml +28 -0
- data/CHANGELOG.md +272 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +1109 -0
- data/Rakefile +8 -0
- data/ci/before_install.sh +14 -0
- data/gemfiles/activerecord31.gemfile +7 -0
- data/gemfiles/activerecord32.gemfile +7 -0
- data/gemfiles/activerecord40.gemfile +8 -0
- data/gemfiles/activerecord41.gemfile +8 -0
- data/gemfiles/mongoid2.gemfile +7 -0
- data/gemfiles/mongoid3.gemfile +6 -0
- data/gemfiles/mongoid4.gemfile +7 -0
- data/gemfiles/nobrainer.gemfile +6 -0
- data/lib/searchkick.rb +72 -0
- data/lib/searchkick/index.rb +550 -0
- data/lib/searchkick/logging.rb +136 -0
- data/lib/searchkick/model.rb +102 -0
- data/lib/searchkick/query.rb +567 -0
- data/lib/searchkick/reindex_job.rb +28 -0
- data/lib/searchkick/reindex_v2_job.rb +24 -0
- data/lib/searchkick/results.rb +158 -0
- data/lib/searchkick/tasks.rb +35 -0
- data/lib/searchkick/version.rb +3 -0
- data/searchkick.gemspec +28 -0
- data/test/autocomplete_test.rb +67 -0
- data/test/boost_test.rb +126 -0
- data/test/facets_test.rb +91 -0
- data/test/highlight_test.rb +58 -0
- data/test/index_test.rb +119 -0
- data/test/inheritance_test.rb +80 -0
- data/test/match_test.rb +163 -0
- data/test/model_test.rb +38 -0
- data/test/query_test.rb +14 -0
- data/test/reindex_job_test.rb +33 -0
- data/test/reindex_v2_job_test.rb +34 -0
- data/test/routing_test.rb +14 -0
- data/test/should_index_test.rb +34 -0
- data/test/similar_test.rb +20 -0
- data/test/sql_test.rb +327 -0
- data/test/suggest_test.rb +82 -0
- data/test/synonyms_test.rb +50 -0
- data/test/test_helper.rb +276 -0
- metadata +194 -0
data/test/facets_test.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
require "active_support/core_ext"
|
3
|
+
|
4
|
+
class TestFacets < Minitest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
store [
|
9
|
+
{name: "Product Show", latitude: 37.7833, longitude: 12.4167, store_id: 1, in_stock: true, color: "blue", price: 21, created_at: 2.days.ago},
|
10
|
+
{name: "Product Hide", latitude: 29.4167, longitude: -98.5000, store_id: 2, in_stock: false, color: "green", price: 25, created_at: 2.days.from_now},
|
11
|
+
{name: "Product B", latitude: 43.9333, longitude: -122.4667, store_id: 2, in_stock: false, color: "red", price: 5},
|
12
|
+
{name: "Foo", latitude: 43.9333, longitude: 12.4667, store_id: 3, in_stock: false, color: "yellow", price: 15}
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_basic
|
17
|
+
assert_equal ({1 => 1, 2 => 2}), store_facet(facets: [:store_id])
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_where
|
21
|
+
assert_equal ({1 => 1}), store_facet(facets: {store_id: {where: {in_stock: true}}})
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_field
|
25
|
+
assert_equal ({1 => 1, 2 => 2}), store_facet(facets: {store_id: {}})
|
26
|
+
assert_equal ({1 => 1, 2 => 2}), store_facet(facets: {store_id: {field: "store_id"}})
|
27
|
+
assert_equal ({1 => 1, 2 => 2}), store_facet({facets: {store_id_new: {field: "store_id"}}}, "store_id_new")
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_limit
|
31
|
+
facet = Product.search("Product", facets: {store_id: {limit: 1}}).facets["store_id"]
|
32
|
+
assert_equal 1, facet["terms"].size
|
33
|
+
assert_equal 3, facet["total"]
|
34
|
+
assert_equal 1, facet["other"]
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_ranges
|
38
|
+
price_ranges = [{to: 10}, {from: 10, to: 20}, {from: 20}]
|
39
|
+
facet = Product.search("Product", facets: {price: {ranges: price_ranges}}).facets["price"]
|
40
|
+
|
41
|
+
assert_equal 3, facet["ranges"].size
|
42
|
+
assert_equal 10.0, facet["ranges"][0]["to"]
|
43
|
+
assert_equal 20.0, facet["ranges"][2]["from"]
|
44
|
+
assert_equal 1, facet["ranges"][0]["count"]
|
45
|
+
assert_equal 0, facet["ranges"][1]["count"]
|
46
|
+
assert_equal 2, facet["ranges"][2]["count"]
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_ranges_dates
|
50
|
+
ranges = [{to: 1.day.ago}, {from: 1.day.ago, to: 1.day.from_now}, {from: 1.day.from_now}]
|
51
|
+
facet = Product.search("Product", facets: {created_at: {ranges: ranges}}).facets["created_at"]
|
52
|
+
|
53
|
+
assert_equal 1, facet["ranges"][0]["count"]
|
54
|
+
assert_equal 1, facet["ranges"][1]["count"]
|
55
|
+
assert_equal 1, facet["ranges"][2]["count"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_where_no_smart_facets
|
59
|
+
assert_equal ({2 => 2}), store_facet(where: {color: "red"}, facets: {store_id: {where: {in_stock: false}}})
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_smart_facets
|
63
|
+
assert_equal ({1 => 1}), store_facet(where: {in_stock: true}, facets: [:store_id], smart_facets: true)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_smart_facets_where
|
67
|
+
assert_equal ({2 => 1}), store_facet(where: {color: "red"}, facets: {store_id: {where: {in_stock: false}}}, smart_facets: true)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_smart_facets_skip_facet
|
71
|
+
assert_equal ({1 => 1, 2 => 2}), store_facet(where: {store_id: 2}, facets: [:store_id], smart_facets: true)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_smart_facets_skip_facet_complex
|
75
|
+
assert_equal ({1 => 1, 2 => 1}), store_facet(where: {store_id: 2, price: {gt: 5}}, facets: [:store_id], smart_facets: true)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_stats_facets
|
79
|
+
options = {where: {store_id: 2}, facets: {store_id: {stats: true}}}
|
80
|
+
facets = Product.search("Product", options).facets["store_id"]["terms"]
|
81
|
+
expected_facets_keys = %w[term count total_count min max total mean]
|
82
|
+
assert_equal expected_facets_keys, facets.first.keys
|
83
|
+
end
|
84
|
+
|
85
|
+
protected
|
86
|
+
|
87
|
+
def store_facet(options, facet_key="store_id")
|
88
|
+
Hash[Product.search("Product", options).facets[facet_key]["terms"].map { |v| [v["term"], v["count"]] }]
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class TestHighlight < Minitest::Test
|
4
|
+
|
5
|
+
def test_basic
|
6
|
+
store_names ["Two Door Cinema Club"]
|
7
|
+
assert_equal "Two Door <em>Cinema</em> Club", Product.search("cinema", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_tag
|
11
|
+
store_names ["Two Door Cinema Club"]
|
12
|
+
assert_equal "Two Door <strong>Cinema</strong> Club", Product.search("cinema", fields: [:name], highlight: {tag: "<strong>"}).with_details.first[1][:highlight][:name]
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_multiple_fields
|
16
|
+
store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
|
17
|
+
highlight = Product.search("cinema", fields: [:name, :color], highlight: true).with_details.first[1][:highlight]
|
18
|
+
assert_equal "Two Door <em>Cinema</em> Club", highlight[:name]
|
19
|
+
assert_equal "<em>Cinema</em> Orange", highlight[:color]
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_fields
|
23
|
+
store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
|
24
|
+
highlight = Product.search("cinema", fields: [:name, :color], highlight: {fields: [:name]}).with_details.first[1][:highlight]
|
25
|
+
assert_equal "Two Door <em>Cinema</em> Club", highlight[:name]
|
26
|
+
assert_equal nil, highlight[:color]
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_field_options
|
30
|
+
store_names ["Two Door Cinema Club are a Northern Irish indie rock band"]
|
31
|
+
assert_equal "Two Door <em>Cinema</em> Club are", Product.search("cinema", fields: [:name], highlight: {fields: {name: {fragment_size: 20}}}).with_details.first[1][:highlight][:name]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_multiple_words
|
35
|
+
store_names ["Hello World Hello"]
|
36
|
+
assert_equal "<em>Hello</em> World <em>Hello</em>", Product.search("hello", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_json
|
40
|
+
store_names ["Two Door Cinema Club"]
|
41
|
+
json = {
|
42
|
+
query: {
|
43
|
+
match: {
|
44
|
+
_all: "cinema"
|
45
|
+
}
|
46
|
+
},
|
47
|
+
highlight: {
|
48
|
+
pre_tags: ["<strong>"],
|
49
|
+
post_tags: ["</strong>"],
|
50
|
+
fields: {
|
51
|
+
"name.analyzed" => {}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
assert_equal "Two Door <strong>Cinema</strong> Club", Product.search(json: json).with_details.first[1][:highlight][:"name.analyzed"]
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/test/index_test.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class TestIndex < Minitest::Test
|
4
|
+
|
5
|
+
def test_clean_indices
|
6
|
+
old_index = Searchkick::Index.new("products_test_20130801000000000")
|
7
|
+
different_index = Searchkick::Index.new("items_test_20130801000000000")
|
8
|
+
|
9
|
+
old_index.delete if old_index.exists?
|
10
|
+
different_index.delete if different_index.exists?
|
11
|
+
|
12
|
+
# create indexes
|
13
|
+
old_index.create
|
14
|
+
different_index.create
|
15
|
+
|
16
|
+
Product.clean_indices
|
17
|
+
|
18
|
+
assert Product.searchkick_index.exists?
|
19
|
+
assert different_index.exists?
|
20
|
+
assert !old_index.exists?
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_clean_indices_old_format
|
24
|
+
old_index = Searchkick::Index.new("products_test_20130801000000")
|
25
|
+
old_index.create
|
26
|
+
|
27
|
+
Product.clean_indices
|
28
|
+
|
29
|
+
assert !old_index.exists?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_mapping
|
33
|
+
store_names ["Dollar Tree"], Store
|
34
|
+
assert_equal [], Store.search(query: {match: {name: "dollar"}}).map(&:name)
|
35
|
+
assert_equal ["Dollar Tree"], Store.search(query: {match: {name: "Dollar Tree"}}).map(&:name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_json
|
39
|
+
store_names ["Dollar Tree"], Store
|
40
|
+
assert_equal [], Store.search(query: {match: {name: "dollar"}}).map(&:name)
|
41
|
+
assert_equal ["Dollar Tree"], Store.search(json: {query: {match: {name: "Dollar Tree"}}}, load: false).map(&:name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_body
|
45
|
+
store_names ["Dollar Tree"], Store
|
46
|
+
assert_equal [], Store.search(query: {match: {name: "dollar"}}).map(&:name)
|
47
|
+
assert_equal ["Dollar Tree"], Store.search(body: {query: {match: {name: "Dollar Tree"}}}, load: false).map(&:name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_block
|
51
|
+
store_names ["Dollar Tree"]
|
52
|
+
products =
|
53
|
+
Product.search "boom" do |body|
|
54
|
+
body[:query] = {match_all: {}}
|
55
|
+
end
|
56
|
+
assert_equal ["Dollar Tree"], products.map(&:name)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_tokens
|
60
|
+
assert_equal ["dollar", "dollartre", "tree"], Product.searchkick_index.tokens("Dollar Tree")
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_tokens_analyzer
|
64
|
+
assert_equal ["dollar", "tree"], Product.searchkick_index.tokens("Dollar Tree", analyzer: "searchkick_search2")
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_record_not_found
|
68
|
+
store_names ["Product A", "Product B"]
|
69
|
+
Product.where(name: "Product A").delete_all
|
70
|
+
assert_search "product", ["Product B"]
|
71
|
+
ensure
|
72
|
+
Product.reindex
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_bad_mapping
|
76
|
+
Product.searchkick_index.delete
|
77
|
+
store_names ["Product A"]
|
78
|
+
assert_raises(Searchkick::InvalidQueryError) { Product.search "test" }
|
79
|
+
ensure
|
80
|
+
Product.reindex
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_remove_blank_id
|
84
|
+
store_names ["Product A"]
|
85
|
+
Product.searchkick_index.remove(OpenStruct.new)
|
86
|
+
assert_search "product", ["Product A"]
|
87
|
+
ensure
|
88
|
+
Product.reindex
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_missing_index
|
92
|
+
assert_raises(Searchkick::MissingIndexError) { Product.search "test", index_name: "not_found" }
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_unsupported_version
|
96
|
+
raises_exception = ->(s) { raise Elasticsearch::Transport::Transport::Error.new("[500] No query registered for [multi_match]") }
|
97
|
+
Searchkick.client.stub :search, raises_exception do
|
98
|
+
assert_raises(Searchkick::UnsupportedVersionError) { Product.search("test") }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_invalid_query
|
103
|
+
assert_raises(Searchkick::InvalidQueryError) { Product.search(query: {}) }
|
104
|
+
end
|
105
|
+
|
106
|
+
if defined?(ActiveRecord)
|
107
|
+
|
108
|
+
def test_transaction
|
109
|
+
Product.transaction do
|
110
|
+
store_names ["Product A"]
|
111
|
+
raise ActiveRecord::Rollback
|
112
|
+
end
|
113
|
+
|
114
|
+
assert_search "product", []
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative "test_helper"
|
2
|
+
|
3
|
+
class TestInheritance < Minitest::Test
|
4
|
+
|
5
|
+
def test_child_reindex
|
6
|
+
store_names ["Max"], Cat
|
7
|
+
assert Dog.reindex
|
8
|
+
Animal.searchkick_index.refresh
|
9
|
+
assert_equal 1, Animal.search("*").size
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_child_index_name
|
13
|
+
assert_equal "animals-#{Date.today.year}", Dog.searchkick_index.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_child_search
|
17
|
+
store_names ["Bear"], Dog
|
18
|
+
store_names ["Bear"], Cat
|
19
|
+
assert_equal 1, Dog.search("bear").size
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_parent_search
|
23
|
+
store_names ["Bear"], Dog
|
24
|
+
store_names ["Bear"], Cat
|
25
|
+
assert_equal 2, Animal.search("bear").size
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_force_one_type
|
29
|
+
store_names ["Green Bear"], Dog
|
30
|
+
store_names ["Blue Bear"], Cat
|
31
|
+
assert_equal ["Blue Bear"], Animal.search("bear", type: [Cat]).map(&:name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_force_multiple_types
|
35
|
+
store_names ["Green Bear"], Dog
|
36
|
+
store_names ["Blue Bear"], Cat
|
37
|
+
store_names ["Red Bear"], Animal
|
38
|
+
assert_equal ["Green Bear", "Blue Bear"], Animal.search("bear", type: [Dog, Cat]).map(&:name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_child_autocomplete
|
42
|
+
store_names ["Max"], Cat
|
43
|
+
store_names ["Mark"], Dog
|
44
|
+
assert_equal ["Max"], Cat.search("ma", fields: [:name], autocomplete: true).map(&:name)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_parent_autocomplete
|
48
|
+
store_names ["Max"], Cat
|
49
|
+
store_names ["Bear"], Dog
|
50
|
+
assert_equal ["Bear"], Animal.search("bea", fields: [:name], autocomplete: true).map(&:name).sort
|
51
|
+
end
|
52
|
+
|
53
|
+
# def test_child_suggest
|
54
|
+
# store_names ["Shark"], Cat
|
55
|
+
# store_names ["Sharp"], Dog
|
56
|
+
# assert_equal ["shark"], Cat.search("shar", fields: [:name], suggest: true).suggestions
|
57
|
+
# end
|
58
|
+
|
59
|
+
def test_parent_suggest
|
60
|
+
store_names ["Shark"], Cat
|
61
|
+
store_names ["Tiger"], Dog
|
62
|
+
assert_equal ["tiger"], Animal.search("tige", fields: [:name], suggest: true).suggestions.sort
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_reindex
|
66
|
+
store_names ["Bear A"], Cat
|
67
|
+
store_names ["Bear B"], Dog
|
68
|
+
Animal.reindex
|
69
|
+
assert_equal 1, Dog.search("bear").size
|
70
|
+
end
|
71
|
+
|
72
|
+
# TODO move somewhere better
|
73
|
+
|
74
|
+
def test_multiple_indices
|
75
|
+
store_names ["Product A"]
|
76
|
+
store_names ["Product B"], Animal
|
77
|
+
assert_search "product", ["Product A", "Product B"], index_name: [Product.searchkick_index.name, Animal.searchkick_index.name], conversions: false
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/test/match_test.rb
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "test_helper"
|
4
|
+
|
5
|
+
class TestMatch < Minitest::Test
|
6
|
+
|
7
|
+
# exact
|
8
|
+
|
9
|
+
def test_match
|
10
|
+
store_names ["Whole Milk", "Fat Free Milk", "Milk"]
|
11
|
+
assert_search "milk", ["Milk", "Whole Milk", "Fat Free Milk"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_case
|
15
|
+
store_names ["Whole Milk", "Fat Free Milk", "Milk"]
|
16
|
+
assert_search "MILK", ["Milk", "Whole Milk", "Fat Free Milk"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_cheese_space_in_index
|
20
|
+
store_names ["Pepper Jack Cheese Skewers"]
|
21
|
+
assert_search "pepperjack cheese skewers", ["Pepper Jack Cheese Skewers"]
|
22
|
+
end
|
23
|
+
|
24
|
+
# def test_cheese_space_in_query
|
25
|
+
# store_names ["Pepperjack Cheese Skewers"]
|
26
|
+
# assert_search "pepper jack cheese skewers", ["Pepperjack Cheese Skewers"]
|
27
|
+
# end
|
28
|
+
|
29
|
+
def test_middle_token
|
30
|
+
store_names ["Dish Washer Amazing Organic Soap"]
|
31
|
+
assert_search "dish soap", ["Dish Washer Amazing Organic Soap"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_middle_token_wine
|
35
|
+
store_names ["Beringer Wine Founders Estate Chardonnay"]
|
36
|
+
assert_search "beringer chardonnay", ["Beringer Wine Founders Estate Chardonnay"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_percent
|
40
|
+
store_names ["1% Milk", "2% Milk", "Whole Milk"]
|
41
|
+
assert_search "1%", ["1% Milk"]
|
42
|
+
end
|
43
|
+
|
44
|
+
# ascii
|
45
|
+
|
46
|
+
def test_jalapenos
|
47
|
+
store_names ["Jalapeño"]
|
48
|
+
assert_search "jalapeno", ["Jalapeño"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_swedish
|
52
|
+
store_names ["ÅÄÖ"]
|
53
|
+
assert_search "aao", ["ÅÄÖ"]
|
54
|
+
end
|
55
|
+
|
56
|
+
# stemming
|
57
|
+
|
58
|
+
def test_stemming
|
59
|
+
store_names ["Whole Milk", "Fat Free Milk", "Milk"]
|
60
|
+
assert_search "milks", ["Milk", "Whole Milk", "Fat Free Milk"]
|
61
|
+
end
|
62
|
+
|
63
|
+
# fuzzy
|
64
|
+
|
65
|
+
def test_misspelling_sriracha
|
66
|
+
store_names ["Sriracha"]
|
67
|
+
assert_search "siracha", ["Sriracha"]
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_misspelling_multiple
|
71
|
+
store_names ["Greek Yogurt", "Green Onions"]
|
72
|
+
assert_search "greed", ["Greek Yogurt", "Green Onions"]
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_short_word
|
76
|
+
store_names ["Finn"]
|
77
|
+
assert_search "fin", ["Finn"]
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_edit_distance_two
|
81
|
+
store_names ["Bingo"]
|
82
|
+
assert_search "bin", []
|
83
|
+
assert_search "bingooo", []
|
84
|
+
assert_search "mango", []
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_edit_distance_one
|
88
|
+
store_names ["Bingo"]
|
89
|
+
assert_search "bing", ["Bingo"]
|
90
|
+
assert_search "bingoo", ["Bingo"]
|
91
|
+
assert_search "ringo", ["Bingo"]
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_edit_distance_long_word
|
95
|
+
store_names ["thisisareallylongword"]
|
96
|
+
assert_search "thisisareallylongwor", ["thisisareallylongword"] # missing letter
|
97
|
+
assert_search "thisisareelylongword", [] # edit distance = 2
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_misspelling_tabasco
|
101
|
+
store_names ["Tabasco"]
|
102
|
+
assert_search "tobasco", ["Tabasco"]
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_misspelling_zucchini
|
106
|
+
store_names ["Zucchini"]
|
107
|
+
assert_search "zuchini", ["Zucchini"]
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_misspelling_ziploc
|
111
|
+
store_names ["Ziploc"]
|
112
|
+
assert_search "zip lock", ["Ziploc"]
|
113
|
+
end
|
114
|
+
|
115
|
+
# spaces
|
116
|
+
|
117
|
+
def test_spaces_in_field
|
118
|
+
store_names ["Red Bull"]
|
119
|
+
assert_search "redbull", ["Red Bull"]
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_spaces_in_query
|
123
|
+
store_names ["Dishwasher"]
|
124
|
+
assert_search "dish washer", ["Dishwasher"]
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_spaces_three_words
|
128
|
+
store_names ["Dish Washer Soap", "Dish Washer"]
|
129
|
+
assert_search "dish washer soap", ["Dish Washer Soap"]
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_spaces_stemming
|
133
|
+
store_names ["Almond Milk"]
|
134
|
+
assert_search "almondmilks", ["Almond Milk"]
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_all
|
138
|
+
store_names ["Product A", "Product B"]
|
139
|
+
assert_search "*", ["Product A", "Product B"]
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_no_arguments
|
143
|
+
assert_equal [], Product.search.to_a
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_no_term
|
147
|
+
store_names ["Product A"]
|
148
|
+
assert_equal ["Product A"], Product.search(where: {name: "Product A"}).map(&:name)
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_to_be_or_not_to_be
|
152
|
+
store_names ["to be or not to be"]
|
153
|
+
assert_search "to be", ["to be or not to be"]
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_unsearchable
|
157
|
+
store [
|
158
|
+
{name: "Unsearchable", description: "Almond"}
|
159
|
+
]
|
160
|
+
assert_search "almond", []
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|