inheritance_test.rb
4.31 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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
require_relative "test_helper"
class InheritanceTest < Minitest::Test
def setup
super
setup_animal
end
def test_child_reindex
store_names ["Max"], Cat
assert Dog.reindex
assert_equal 1, Animal.search("*").size
end
def test_child_index_name
assert_equal "animals_test#{ENV["TEST_ENV_NUMBER"]}", Dog.search_index.name
end
def test_child_search
store_names ["Bear"], Dog
store_names ["Bear"], Cat
assert_equal 1, Dog.search("bear").size
end
def test_parent_search
store_names ["Bear"], Dog
store_names ["Bear"], Cat
assert_equal 2, Animal.search("bear").size
end
def test_force_one_type
store_names ["Green Bear"], Dog
store_names ["Blue Bear"], Cat
assert_equal ["Blue Bear"], Animal.search("bear", type: [Cat]).map(&:name)
end
def test_force_multiple_types
store_names ["Green Bear"], Dog
store_names ["Blue Bear"], Cat
store_names ["Red Bear"], Animal
assert_equal ["Green Bear", "Blue Bear"], Animal.search("bear", type: [Dog, Cat]).map(&:name)
end
def test_child_autocomplete
store_names ["Max"], Cat
store_names ["Mark"], Dog
assert_equal ["Max"], Cat.search("ma", fields: [:name], match: :text_start).map(&:name)
end
def test_parent_autocomplete
store_names ["Max"], Cat
store_names ["Bear"], Dog
assert_equal ["Bear"], Animal.search("bea", fields: [:name], match: :text_start).map(&:name).sort
end
# def test_child_suggest
# store_names ["Shark"], Cat
# store_names ["Sharp"], Dog
# assert_equal ["shark"], Cat.search("shar", fields: [:name], suggest: true).suggestions
# end
def test_parent_suggest
store_names ["Shark"], Cat
store_names ["Tiger"], Dog
assert_equal ["tiger"], Animal.search("tige", fields: [:name], suggest: true).suggestions.sort
end
def test_reindex
store_names ["Bear A"], Cat
store_names ["Bear B"], Dog
Animal.reindex
assert_equal 2, Animal.search("bear").size
end
def test_child_models_option
store_names ["Bear A"], Cat
store_names ["Bear B"], Dog
Animal.reindex
# note: the models option is less efficient than Animal.search("bear", type: [Cat, Dog])
# since it requires two database calls instead of one to Animal
assert_equal 2, Searchkick.search("bear", models: [Cat, Dog]).size
end
def test_inherited_and_non_inherited_models
store_names ["Bear A"], Cat
store_names ["Bear B"], Dog
store_names ["Bear C"]
Animal.reindex
assert_equal 2, Searchkick.search("bear", models: [Cat, Product]).size
# hits and pagination will be off with this approach (for now)
# ideal case is add where conditions (index a, type a OR index b)
# however, we don't know the exact index name and aliases don't work for filters
# see https://github.com/elastic/elasticsearch/issues/23306
# show warning for now
# alternative is disallow inherited models with models option
expected = Searchkick.server_below?("7.5.0") ? 3 : 2
assert_equal expected, Searchkick.search("bear", models: [Cat, Product]).hits.size
assert_equal expected, Searchkick.search("bear", models: [Cat, Product], per_page: 1).total_pages
end
# TODO move somewhere better
def test_multiple_indices
store_names ["Product A"]
store_names ["Product B"], Animal
assert_search "product", ["Product A", "Product B"], {models: [Product, Animal], conversions: false}, Searchkick
assert_search "product", ["Product A", "Product B"], {index_name: [Product, Animal], conversions: false}, Searchkick
end
def test_index_name_model
store_names ["Product A"]
assert_equal ["Product A"], Searchkick.search("product", index_name: [Product]).map(&:name)
end
def test_index_name_string
store_names ["Product A"]
error = assert_raises Searchkick::Error do
Searchkick.search("product", index_name: [Product.search_index.name]).map(&:name)
end
assert_includes error.message, "Unknown model"
end
def test_similar
store_names ["Dog", "Other dog"], Dog
store_names ["Not dog"], Cat
dog = Dog.find_by!(name: "Dog")
assert_equal ["Other dog"], dog.similar(fields: [:name]).map(&:name)
assert_equal ["Not dog", "Other dog"], dog.similar(fields: [:name], models: [Animal]).map(&:name).sort
assert_equal ["Not dog"], dog.similar(fields: [:name], models: [Cat]).map(&:name).sort
end
end