searchkick 2.3.2 → 4.4.1

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.
Files changed (80) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +251 -84
  3. data/LICENSE.txt +1 -1
  4. data/README.md +552 -432
  5. data/lib/searchkick/bulk_indexer.rb +173 -0
  6. data/lib/searchkick/bulk_reindex_job.rb +2 -2
  7. data/lib/searchkick/hash_wrapper.rb +12 -0
  8. data/lib/searchkick/index.rb +187 -348
  9. data/lib/searchkick/index_options.rb +494 -282
  10. data/lib/searchkick/logging.rb +17 -13
  11. data/lib/searchkick/model.rb +52 -97
  12. data/lib/searchkick/multi_search.rb +9 -10
  13. data/lib/searchkick/process_batch_job.rb +17 -4
  14. data/lib/searchkick/process_queue_job.rb +20 -12
  15. data/lib/searchkick/query.rb +415 -199
  16. data/lib/searchkick/railtie.rb +7 -0
  17. data/lib/searchkick/record_data.rb +128 -0
  18. data/lib/searchkick/record_indexer.rb +79 -0
  19. data/lib/searchkick/reindex_queue.rb +1 -1
  20. data/lib/searchkick/reindex_v2_job.rb +14 -12
  21. data/lib/searchkick/results.rb +135 -41
  22. data/lib/searchkick/version.rb +1 -1
  23. data/lib/searchkick.rb +130 -61
  24. data/lib/tasks/searchkick.rake +34 -0
  25. metadata +18 -162
  26. data/.gitignore +0 -22
  27. data/.travis.yml +0 -39
  28. data/Gemfile +0 -16
  29. data/Rakefile +0 -20
  30. data/benchmark/Gemfile +0 -23
  31. data/benchmark/benchmark.rb +0 -97
  32. data/lib/searchkick/tasks.rb +0 -33
  33. data/searchkick.gemspec +0 -28
  34. data/test/aggs_test.rb +0 -197
  35. data/test/autocomplete_test.rb +0 -75
  36. data/test/boost_test.rb +0 -202
  37. data/test/callbacks_test.rb +0 -59
  38. data/test/ci/before_install.sh +0 -17
  39. data/test/errors_test.rb +0 -19
  40. data/test/gemfiles/activerecord31.gemfile +0 -7
  41. data/test/gemfiles/activerecord32.gemfile +0 -7
  42. data/test/gemfiles/activerecord40.gemfile +0 -8
  43. data/test/gemfiles/activerecord41.gemfile +0 -8
  44. data/test/gemfiles/activerecord42.gemfile +0 -7
  45. data/test/gemfiles/activerecord50.gemfile +0 -7
  46. data/test/gemfiles/apartment.gemfile +0 -8
  47. data/test/gemfiles/cequel.gemfile +0 -8
  48. data/test/gemfiles/mongoid2.gemfile +0 -7
  49. data/test/gemfiles/mongoid3.gemfile +0 -6
  50. data/test/gemfiles/mongoid4.gemfile +0 -7
  51. data/test/gemfiles/mongoid5.gemfile +0 -7
  52. data/test/gemfiles/mongoid6.gemfile +0 -12
  53. data/test/gemfiles/nobrainer.gemfile +0 -8
  54. data/test/gemfiles/parallel_tests.gemfile +0 -8
  55. data/test/geo_shape_test.rb +0 -175
  56. data/test/highlight_test.rb +0 -78
  57. data/test/index_test.rb +0 -166
  58. data/test/inheritance_test.rb +0 -83
  59. data/test/marshal_test.rb +0 -8
  60. data/test/match_test.rb +0 -276
  61. data/test/misspellings_test.rb +0 -56
  62. data/test/model_test.rb +0 -42
  63. data/test/multi_search_test.rb +0 -36
  64. data/test/multi_tenancy_test.rb +0 -22
  65. data/test/order_test.rb +0 -46
  66. data/test/pagination_test.rb +0 -70
  67. data/test/partial_reindex_test.rb +0 -58
  68. data/test/query_test.rb +0 -35
  69. data/test/records_test.rb +0 -10
  70. data/test/reindex_test.rb +0 -64
  71. data/test/reindex_v2_job_test.rb +0 -32
  72. data/test/routing_test.rb +0 -23
  73. data/test/should_index_test.rb +0 -32
  74. data/test/similar_test.rb +0 -28
  75. data/test/sql_test.rb +0 -214
  76. data/test/suggest_test.rb +0 -95
  77. data/test/support/kaminari.yml +0 -21
  78. data/test/synonyms_test.rb +0 -67
  79. data/test/test_helper.rb +0 -567
  80. data/test/where_test.rb +0 -223
@@ -1,59 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class CallbacksTest < Minitest::Test
4
- def test_true_create
5
- Searchkick.callbacks(true) do
6
- store_names ["Product A", "Product B"]
7
- end
8
- Product.searchkick_index.refresh
9
- assert_search "product", ["Product A", "Product B"]
10
- end
11
-
12
- def test_false_create
13
- Searchkick.callbacks(false) do
14
- store_names ["Product A", "Product B"]
15
- end
16
- Product.searchkick_index.refresh
17
- assert_search "product", []
18
- end
19
-
20
- def test_bulk_create
21
- Searchkick.callbacks(:bulk) do
22
- store_names ["Product A", "Product B"]
23
- end
24
- Product.searchkick_index.refresh
25
- assert_search "product", ["Product A", "Product B"]
26
- end
27
-
28
- def test_queue
29
- skip unless defined?(ActiveJob) && defined?(Redis)
30
-
31
- reindex_queue = Product.searchkick_index.reindex_queue
32
- reindex_queue.clear
33
-
34
- Searchkick.callbacks(:queue) do
35
- store_names ["Product A", "Product B"]
36
- end
37
- Product.searchkick_index.refresh
38
- assert_search "product", [], load: false, conversions: false
39
- assert_equal 2, reindex_queue.length
40
-
41
- Searchkick::ProcessQueueJob.perform_later(class_name: "Product")
42
- Product.searchkick_index.refresh
43
- assert_search "product", ["Product A", "Product B"], load: false
44
- assert_equal 0, reindex_queue.length
45
-
46
- Searchkick.callbacks(:queue) do
47
- Product.where(name: "Product B").destroy_all
48
- Product.create!(name: "Product C")
49
- end
50
- Product.searchkick_index.refresh
51
- assert_search "product", ["Product A", "Product B"], load: false
52
- assert_equal 2, reindex_queue.length
53
-
54
- Searchkick::ProcessQueueJob.perform_later(class_name: "Product")
55
- Product.searchkick_index.refresh
56
- assert_search "product", ["Product A", "Product C"], load: false
57
- assert_equal 0, reindex_queue.length
58
- end
59
- end
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -e
4
-
5
- gem install bundler
6
-
7
- if [[ $ELASTICSEARCH_VERSION == 1* ]]; then
8
- curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
9
- elif [[ $ELASTICSEARCH_VERSION == 2* ]]; then
10
- curl -L -O https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/$ELASTICSEARCH_VERSION/elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
11
- else
12
- curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
13
- fi
14
- tar -xvf elasticsearch-$ELASTICSEARCH_VERSION.tar.gz
15
- cd elasticsearch-$ELASTICSEARCH_VERSION/bin
16
- ./elasticsearch -d
17
- wget -O- --waitretry=1 --tries=30 --retry-connrefused -v http://127.0.0.1:9200/
data/test/errors_test.rb DELETED
@@ -1,19 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class ErrorsTest < Minitest::Test
4
- def test_bulk_import_raises_error
5
- valid_dog = Product.create(name: "2016-01-02")
6
- invalid_dog = Product.create(name: "Ol' One-Leg")
7
- index = Searchkick::Index.new "dogs", mappings: {
8
- dog: {
9
- properties: {
10
- name: {type: "date"}
11
- }
12
- }
13
- }
14
- index.store valid_dog
15
- assert_raises(Searchkick::ImportError) do
16
- index.bulk_index [valid_dog, invalid_dog]
17
- end
18
- end
19
- end
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 3.1.0"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 3.2.0"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.0.0"
8
- gem "activejob_backport"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.1.0"
8
- gem "activejob_backport"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.2.0"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 5.0.0"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 4.2.0"
8
- gem "apartment"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "cequel"
7
- gem "activejob"
8
- gem "redis"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 2"
7
- gem "bson_ext"
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 3.1.0"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 4.0.0"
7
- gem "activejob_backport"
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 5.0.0"
7
- gem "activejob"
@@ -1,12 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "mongoid", "~> 6.0.0"
7
- gem "activejob"
8
- gem "redis"
9
-
10
- # kaminari
11
- gem "actionpack"
12
- gem "kaminari"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "nobrainer", ">= 0.21.0"
7
- gem "activejob"
8
- gem "redis"
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in searchkick.gemspec
4
- gemspec path: "../../"
5
-
6
- gem "sqlite3"
7
- gem "activerecord", "~> 5.0.0"
8
- gem "parallel_tests"
@@ -1,175 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class GeoShapeTest < Minitest::Test
4
- def setup
5
- Region.destroy_all
6
- store [
7
- {
8
- name: "Region A",
9
- text: "The witch had a cat",
10
- territory: {
11
- type: "polygon",
12
- coordinates: [[[30, 40], [35, 45], [40, 40], [40, 30], [30, 30], [30, 40]]]
13
- }
14
- },
15
- {
16
- name: "Region B",
17
- text: "and a very tall hat",
18
- territory: {
19
- type: "polygon",
20
- coordinates: [[[50, 60], [55, 65], [60, 60], [60, 50], [50, 50], [50, 60]]]
21
- }
22
- },
23
- {
24
- name: "Region C",
25
- text: "and long ginger hair which she wore in a plait",
26
- territory: {
27
- type: "polygon",
28
- coordinates: [[[10, 20], [15, 25], [20, 20], [20, 10], [10, 10], [10, 20]]]
29
- }
30
- }
31
- ], Region
32
- end
33
-
34
- def test_circle
35
- assert_search "*", ["Region A"], {
36
- where: {
37
- territory: {
38
- geo_shape: {
39
- type: "circle",
40
- coordinates: {lat: 28.0, lon: 38.0},
41
- radius: "444000m"
42
- }
43
- }
44
- }
45
- }, Region
46
- end
47
-
48
- def test_envelope
49
- assert_search "*", ["Region A"], {
50
- where: {
51
- territory: {
52
- geo_shape: {
53
- type: "envelope",
54
- coordinates: [[28, 42], [32, 38]]
55
- }
56
- }
57
- }
58
- }, Region
59
- end
60
-
61
- def test_polygon
62
- assert_search "*", ["Region A"], {
63
- where: {
64
- territory: {
65
- geo_shape: {
66
- type: "polygon",
67
- coordinates: [[[38, 42], [42, 42], [42, 38], [38, 38], [38, 42]]]
68
- }
69
- }
70
- }
71
- }, Region
72
- end
73
-
74
- def test_multipolygon
75
- assert_search "*", ["Region A", "Region B"], {
76
- where: {
77
- territory: {
78
- geo_shape: {
79
- type: "multipolygon",
80
- coordinates: [
81
- [[[38, 42], [42, 42], [42, 38], [38, 38], [38, 42]]],
82
- [[[58, 62], [62, 62], [62, 58], [58, 58], [58, 62]]]
83
- ]
84
- }
85
- }
86
- }
87
- }, Region
88
- end
89
-
90
- def test_disjoint
91
- assert_search "*", ["Region B", "Region C"], {
92
- where: {
93
- territory: {
94
- geo_shape: {
95
- type: "envelope",
96
- relation: "disjoint",
97
- coordinates: [[28, 42], [32, 38]]
98
- }
99
- }
100
- }
101
- }, Region
102
- end
103
-
104
- def test_within
105
- assert_search "*", ["Region A"], {
106
- where: {
107
- territory: {
108
- geo_shape: {
109
- type: "envelope",
110
- relation: "within",
111
- coordinates: [[20, 50], [50, 20]]
112
- }
113
- }
114
- }
115
- }, Region
116
- end
117
-
118
- def test_search_math
119
- # TODO find out why this is failing
120
- skip unless elasticsearch_below60?
121
-
122
- assert_search "witch", ["Region A"], {
123
- where: {
124
- territory: {
125
- geo_shape: {
126
- type: "envelope",
127
- coordinates: [[28, 42], [32, 38]]
128
- }
129
- }
130
- }
131
- }, Region
132
- end
133
-
134
- def test_search_no_match
135
- assert_search "ginger hair", [], {
136
- where: {
137
- territory: {
138
- geo_shape: {
139
- type: "envelope",
140
- coordinates: [[28, 42], [32, 38]]
141
- }
142
- }
143
- }
144
- }, Region
145
- end
146
-
147
- def test_contains
148
- skip if elasticsearch_below22?
149
- assert_search "*", ["Region C"], {
150
- where: {
151
- territory: {
152
- geo_shape: {
153
- type: "envelope",
154
- relation: "contains",
155
- coordinates: [[12, 13], [13, 12]]
156
- }
157
- }
158
- }
159
- }, Region
160
- end
161
-
162
- def test_latlon
163
- assert_search "*", ["Region A"], {
164
- where: {
165
- territory: {
166
- geo_shape: {
167
- type: "envelope",
168
- coordinates: [{lat: 42, lon: 28}, {lat: 38, lon: 32}]
169
- }
170
- }
171
- }
172
- }, Region
173
- end
174
-
175
- end
@@ -1,78 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class HighlightTest < Minitest::Test
4
- def test_basic
5
- store_names ["Two Door Cinema Club"]
6
- assert_equal "Two Door <em>Cinema</em> Club", Product.search("cinema", fields: [:name], highlight: true).first.search_highlights[:name]
7
- end
8
-
9
- def test_tag
10
- store_names ["Two Door Cinema Club"]
11
- assert_equal "Two Door <strong>Cinema</strong> Club", Product.search("cinema", fields: [:name], highlight: {tag: "<strong>"}).first.search_highlights[:name]
12
- end
13
-
14
- def test_tag_class
15
- store_names ["Two Door Cinema Club"]
16
- assert_equal "Two Door <strong class='classy'>Cinema</strong> Club", Product.search("cinema", fields: [:name], highlight: {tag: "<strong class='classy'>"}).first.search_highlights[:name]
17
- end
18
-
19
- def test_multiple_fields
20
- store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
21
- highlights = Product.search("cinema", fields: [:name, :color], highlight: true).first.search_highlights
22
- assert_equal "Two Door <em>Cinema</em> Club", highlights[:name]
23
- assert_equal "<em>Cinema</em> Orange", highlights[:color]
24
- end
25
-
26
- def test_fields
27
- store [{name: "Two Door Cinema Club", color: "Cinema Orange"}]
28
- highlights = Product.search("cinema", fields: [:name, :color], highlight: {fields: [:name]}).first.search_highlights
29
- assert_equal "Two Door <em>Cinema</em> Club", highlights[:name]
30
- assert_nil highlights[:color]
31
- end
32
-
33
- def test_field_options
34
- store_names ["Two Door Cinema Club are a Northern Irish indie rock band"]
35
- fragment_size = ENV["MATCH"] == "word_start" ? 26 : 21
36
- assert_equal "Two Door <em>Cinema</em> Club are", Product.search("cinema", fields: [:name], highlight: {fields: {name: {fragment_size: fragment_size}}}).first.search_highlights[:name]
37
- end
38
-
39
- def test_multiple_words
40
- store_names ["Hello World Hello"]
41
- assert_equal "<em>Hello</em> World <em>Hello</em>", Product.search("hello", fields: [:name], highlight: true).first.search_highlights[:name]
42
- end
43
-
44
- def test_encoder
45
- store_names ["<b>Hello</b>"]
46
- assert_equal "&lt;b&gt;<em>Hello</em>&lt;&#x2F;b&gt;", Product.search("hello", fields: [:name], highlight: {encoder: "html"}, misspellings: false).first.search_highlights[:name]
47
- end
48
-
49
- def test_word_middle
50
- store_names ["Two Door Cinema Club"]
51
- assert_equal "Two Door <em>Cinema</em> Club", Product.search("ine", fields: [:name], match: :word_middle, highlight: true).first.search_highlights[:name]
52
- end
53
-
54
- def test_body
55
- skip if ENV["MATCH"] == "word_start"
56
- store_names ["Two Door Cinema Club"]
57
- body = {
58
- query: {
59
- match: {
60
- "name.analyzed" => "cinema"
61
- }
62
- },
63
- highlight: {
64
- pre_tags: ["<strong>"],
65
- post_tags: ["</strong>"],
66
- fields: {
67
- "name.analyzed" => {}
68
- }
69
- }
70
- }
71
- assert_equal "Two Door <strong>Cinema</strong> Club", Product.search(body: body).first.search_highlights[:"name.analyzed"]
72
- end
73
-
74
- def test_legacy
75
- store_names ["Two Door Cinema Club"]
76
- assert_equal "Two Door <em>Cinema</em> Club", Product.search("cinema", fields: [:name], highlight: true).with_details.first[1][:highlight][:name]
77
- end
78
- end
data/test/index_test.rb DELETED
@@ -1,166 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class IndexTest < Minitest::Test
4
- def setup
5
- super
6
- Region.destroy_all
7
- end
8
-
9
- def test_clean_indices
10
- suffix = Searchkick.index_suffix ? "_#{Searchkick.index_suffix}" : ""
11
- old_index = Searchkick::Index.new("products_test#{suffix}_20130801000000000")
12
- different_index = Searchkick::Index.new("items_test#{suffix}_20130801000000000")
13
-
14
- old_index.delete if old_index.exists?
15
- different_index.delete if different_index.exists?
16
-
17
- # create indexes
18
- old_index.create
19
- different_index.create
20
-
21
- Product.searchkick_index.clean_indices
22
-
23
- assert Product.searchkick_index.exists?
24
- assert different_index.exists?
25
- assert !old_index.exists?
26
- end
27
-
28
- def test_clean_indices_old_format
29
- suffix = Searchkick.index_suffix ? "_#{Searchkick.index_suffix}" : ""
30
- old_index = Searchkick::Index.new("products_test#{suffix}_20130801000000")
31
- old_index.create
32
-
33
- Product.searchkick_index.clean_indices
34
-
35
- assert !old_index.exists?
36
- end
37
-
38
- def test_retain
39
- Product.reindex
40
- assert_equal 1, Product.searchkick_index.all_indices.size
41
- Product.reindex(retain: true)
42
- assert_equal 2, Product.searchkick_index.all_indices.size
43
- end
44
-
45
- def test_total_docs
46
- store_names ["Product A"]
47
- assert_equal 1, Product.searchkick_index.total_docs
48
- end
49
-
50
- def test_mapping
51
- store_names ["Dollar Tree"], Store
52
- assert_equal [], Store.search(body: {query: {match: {name: "dollar"}}}).map(&:name)
53
- assert_equal ["Dollar Tree"], Store.search(body: {query: {match: {name: "Dollar Tree"}}}).map(&:name)
54
- end
55
-
56
- def test_body
57
- store_names ["Dollar Tree"], Store
58
- assert_equal [], Store.search(body: {query: {match: {name: "dollar"}}}).map(&:name)
59
- assert_equal ["Dollar Tree"], Store.search(body: {query: {match: {name: "Dollar Tree"}}}, load: false).map(&:name)
60
- end
61
-
62
- def test_body_warning
63
- assert_output(nil, "The body option replaces the entire body, so the following options are ignored: where\n") { Store.search(body: {query: {match: {name: "dollar"}}}, where: {id: 1}) }
64
- end
65
-
66
- def test_block
67
- store_names ["Dollar Tree"]
68
- products =
69
- Product.search "boom" do |body|
70
- body[:query] = {match_all: {}}
71
- end
72
- assert_equal ["Dollar Tree"], products.map(&:name)
73
- end
74
-
75
- def test_tokens
76
- assert_equal ["dollar", "dollartre", "tree"], Product.searchkick_index.tokens("Dollar Tree", analyzer: "searchkick_index")
77
- end
78
-
79
- def test_tokens_analyzer
80
- assert_equal ["dollar", "tree"], Product.searchkick_index.tokens("Dollar Tree", analyzer: "searchkick_search2")
81
- end
82
-
83
- def test_record_not_found
84
- store_names ["Product A", "Product B"]
85
- Product.where(name: "Product A").delete_all
86
- assert_search "product", ["Product B"]
87
- ensure
88
- Product.reindex
89
- end
90
-
91
- def test_bad_mapping
92
- Product.searchkick_index.delete
93
- store_names ["Product A"]
94
- assert_raises(Searchkick::InvalidQueryError) { Product.search "test" }
95
- ensure
96
- Product.reindex
97
- end
98
-
99
- def test_remove_blank_id
100
- store_names ["Product A"]
101
- Product.searchkick_index.remove(Product.new)
102
- assert_search "product", ["Product A"]
103
- ensure
104
- Product.reindex
105
- end
106
-
107
- def test_missing_index
108
- assert_raises(Searchkick::MissingIndexError) { Product.search("test", index_name: "not_found") }
109
- end
110
-
111
- def test_unsupported_version
112
- raises_exception = ->(_) { raise Elasticsearch::Transport::Transport::Error, "[500] No query registered for [multi_match]" }
113
- Searchkick.client.stub :search, raises_exception do
114
- assert_raises(Searchkick::UnsupportedVersionError) { Product.search("test") }
115
- end
116
- end
117
-
118
- def test_invalid_body
119
- assert_raises(Searchkick::InvalidQueryError) { Product.search(body: {boom: true}) }
120
- end
121
-
122
- def test_transaction
123
- skip unless defined?(ActiveRecord)
124
- Product.transaction do
125
- store_names ["Product A"]
126
- raise ActiveRecord::Rollback
127
- end
128
- assert_search "*", []
129
- end
130
-
131
- def test_filterable
132
- # skip for 5.0 since it throws
133
- # Cannot search on field [alt_description] since it is not indexed.
134
- skip unless elasticsearch_below50?
135
- store [{name: "Product A", alt_description: "Hello"}]
136
- assert_search "*", [], where: {alt_description: "Hello"}
137
- end
138
-
139
- def test_filterable_non_string
140
- store [{name: "Product A", store_id: 1}]
141
- assert_search "*", ["Product A"], where: {store_id: 1}
142
- end
143
-
144
- def test_large_value
145
- skip if nobrainer?
146
- large_value = 1000.times.map { "hello" }.join(" ")
147
- store [{name: "Product A", text: large_value}], Region
148
- assert_search "product", ["Product A"], {}, Region
149
- assert_search "hello", ["Product A"], {fields: [:name, :text]}, Region
150
-
151
- # needs fields for ES 6
152
- if elasticsearch_below60?
153
- assert_search "hello", ["Product A"], {}, Region
154
- end
155
- end
156
-
157
- def test_very_large_value
158
- skip if nobrainer? || elasticsearch_below22?
159
- large_value = 10000.times.map { "hello" }.join(" ")
160
- store [{name: "Product A", text: large_value}], Region
161
- assert_search "product", ["Product A"], {}, Region
162
- assert_search "hello", ["Product A"], {fields: [:name, :text]}, Region
163
- # values that exceed ignore_above are not included in _all field :(
164
- # assert_search "hello", ["Product A"], {}, Region
165
- end
166
- end