query_test.rb
2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
require_relative "test_helper"
class QueryTest < Minitest::Test
def test_basic
store_names ["Milk", "Apple"]
query = Product.search("milk", body: {query: {match_all: {}}})
assert_equal ["Apple", "Milk"], query.map(&:name).sort
end
def test_with_uneffective_min_score
store_names ["Milk", "Milk2"]
assert_search "milk", ["Milk", "Milk2"], body_options: {min_score: 0.0001}
end
def test_default_timeout
assert_equal "6s", Product.search("*").body[:timeout]
end
def test_timeout_override
assert_equal "1s", Product.search("*", body_options: {timeout: "1s"}).body[:timeout]
end
def test_request_params
assert_equal "dfs_query_then_fetch", Product.search("*", request_params: {search_type: "dfs_query_then_fetch"}).params[:search_type]
end
def test_debug
store_names ["Milk"]
out, _ = capture_io do
assert_search "milk", ["Milk"], debug: true
end
refute_includes out, "Error"
end
def test_big_decimal
store [
{name: "Product", latitude: 80.0}
]
assert_search "product", ["Product"], where: {latitude: {gt: 79}}
end
# body_options
def test_body_options_should_merge_into_body
query = Product.search("*", body_options: {min_score: 1.0})
assert_equal 1.0, query.body[:min_score]
end
# nested
def test_nested_search
setup_speaker
store [{name: "Product A", aisle: {"id" => 1, "name" => "Frozen"}}], Speaker
assert_search "frozen", ["Product A"], {fields: ["aisle.name"]}, Speaker
end
# other tests
def test_includes
skip unless activerecord?
store_names ["Product A"]
assert Product.search("product", includes: [:store]).first.association(:store).loaded?
assert Product.search("product").includes(:store).first.association(:store).loaded?
end
def test_model_includes
skip unless activerecord?
store_names ["Product A"]
store_names ["Store A"], Store
associations = {Product => [:store], Store => [:products]}
result = Searchkick.search("*", models: [Product, Store], model_includes: associations)
assert_equal 2, result.length
result.group_by(&:class).each_pair do |model, records|
assert records.first.association(associations[model].first).loaded?
end
end
def test_scope_results
skip unless activerecord?
store_names ["Product A", "Product B"]
assert_warns "Records in search index do not exist in database" do
assert_search "product", ["Product A"], scope_results: ->(r) { r.where(name: "Product A") }
end
end
end