chewy 7.1.0 → 7.2.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +58 -0
- data/.rubocop.yml +13 -8
- data/.rubocop_todo.yml +110 -22
- data/CHANGELOG.md +53 -0
- data/Gemfile +0 -7
- data/Guardfile +3 -1
- data/README.md +282 -245
- data/chewy.gemspec +3 -5
- data/gemfiles/rails.5.2.activerecord.gemfile +8 -14
- data/gemfiles/rails.6.0.activerecord.gemfile +8 -14
- data/gemfiles/rails.6.1.activerecord.gemfile +8 -14
- data/lib/chewy.rb +21 -75
- data/lib/chewy/config.rb +40 -40
- data/lib/chewy/errors.rb +0 -12
- data/lib/chewy/fields/base.rb +11 -1
- data/lib/chewy/fields/root.rb +3 -4
- data/lib/chewy/index.rb +46 -87
- data/lib/chewy/index/actions.rb +51 -32
- data/lib/chewy/{type → index}/adapter/active_record.rb +12 -3
- data/lib/chewy/{type → index}/adapter/base.rb +2 -3
- data/lib/chewy/{type → index}/adapter/object.rb +27 -31
- data/lib/chewy/{type → index}/adapter/orm.rb +11 -14
- data/lib/chewy/{type → index}/crutch.rb +5 -5
- data/lib/chewy/{type → index}/import.rb +36 -27
- data/lib/chewy/{type → index}/import/bulk_builder.rb +15 -13
- data/lib/chewy/{type → index}/import/bulk_request.rb +6 -6
- data/lib/chewy/{type → index}/import/journal_builder.rb +10 -10
- data/lib/chewy/{type → index}/import/routine.rb +15 -14
- data/lib/chewy/{type → index}/mapping.rb +26 -31
- data/lib/chewy/{type → index}/observe.rb +9 -19
- data/lib/chewy/index/specification.rb +1 -0
- data/lib/chewy/{type → index}/syncer.rb +60 -57
- data/lib/chewy/{type → index}/witchcraft.rb +11 -7
- data/lib/chewy/{type → index}/wrapper.rb +2 -2
- data/lib/chewy/journal.rb +8 -8
- data/lib/chewy/minitest/helpers.rb +9 -13
- data/lib/chewy/minitest/search_index_receiver.rb +22 -26
- data/lib/chewy/railtie.rb +4 -2
- data/lib/chewy/rake_helper.rb +82 -107
- data/lib/chewy/rspec/update_index.rb +47 -43
- data/lib/chewy/search.rb +4 -17
- data/lib/chewy/search/loader.rb +18 -30
- data/lib/chewy/search/parameters.rb +4 -2
- data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
- data/lib/chewy/search/parameters/source.rb +5 -1
- data/lib/chewy/search/query_proxy.rb +9 -2
- data/lib/chewy/search/request.rb +82 -86
- data/lib/chewy/search/response.rb +4 -4
- data/lib/chewy/search/scoping.rb +6 -7
- data/lib/chewy/search/scrolling.rb +11 -11
- data/lib/chewy/stash.rb +14 -22
- data/lib/chewy/strategy.rb +3 -19
- data/lib/chewy/strategy/sidekiq.rb +1 -0
- data/lib/chewy/version.rb +1 -1
- data/lib/generators/chewy/install_generator.rb +1 -1
- data/lib/tasks/chewy.rake +10 -22
- data/migration_guide.md +14 -0
- data/spec/chewy/config_spec.rb +14 -39
- data/spec/chewy/fields/base_spec.rb +412 -148
- data/spec/chewy/fields/root_spec.rb +16 -24
- data/spec/chewy/fields/time_fields_spec.rb +5 -5
- data/spec/chewy/index/actions_spec.rb +270 -24
- data/spec/chewy/{type → index}/adapter/active_record_spec.rb +68 -40
- data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
- data/spec/chewy/{type → index}/import/bulk_builder_spec.rb +23 -31
- data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -6
- data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -15
- data/spec/chewy/{type → index}/import/routine_spec.rb +16 -16
- data/spec/chewy/{type → index}/import_spec.rb +102 -98
- data/spec/chewy/{type → index}/mapping_spec.rb +46 -54
- data/spec/chewy/index/observe_spec.rb +116 -0
- data/spec/chewy/index/settings_spec.rb +3 -1
- data/spec/chewy/index/specification_spec.rb +7 -17
- data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
- data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
- data/spec/chewy/index/wrapper_spec.rb +100 -0
- data/spec/chewy/index_spec.rb +59 -102
- data/spec/chewy/journal_spec.rb +9 -22
- data/spec/chewy/minitest/helpers_spec.rb +13 -15
- data/spec/chewy/minitest/search_index_receiver_spec.rb +22 -26
- data/spec/chewy/multi_search_spec.rb +4 -5
- data/spec/chewy/rake_helper_spec.rb +145 -55
- data/spec/chewy/rspec/update_index_spec.rb +74 -71
- data/spec/chewy/search/loader_spec.rb +19 -37
- data/spec/chewy/search/pagination/kaminari_examples.rb +3 -5
- data/spec/chewy/search/pagination/kaminari_spec.rb +1 -1
- data/spec/chewy/search/parameters/indices_spec.rb +2 -8
- data/spec/chewy/search/parameters/order_spec.rb +1 -1
- data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
- data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
- data/spec/chewy/search/parameters/source_spec.rb +8 -2
- data/spec/chewy/search/parameters_spec.rb +12 -3
- data/spec/chewy/search/query_proxy_spec.rb +68 -17
- data/spec/chewy/search/request_spec.rb +222 -74
- data/spec/chewy/search/response_spec.rb +12 -12
- data/spec/chewy/search/scrolling_spec.rb +7 -9
- data/spec/chewy/search_spec.rb +32 -35
- data/spec/chewy/stash_spec.rb +9 -21
- data/spec/chewy/strategy/active_job_spec.rb +8 -8
- data/spec/chewy/strategy/atomic_spec.rb +9 -10
- data/spec/chewy/strategy/sidekiq_spec.rb +8 -8
- data/spec/chewy/strategy_spec.rb +19 -15
- data/spec/chewy_spec.rb +14 -100
- data/spec/spec_helper.rb +2 -21
- data/spec/support/active_record.rb +15 -5
- metadata +44 -103
- data/.circleci/config.yml +0 -214
- data/Appraisals +0 -81
- data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
- data/gemfiles/sequel.4.45.gemfile +0 -11
- data/lib/chewy/search/pagination/will_paginate.rb +0 -43
- data/lib/chewy/strategy/resque.rb +0 -27
- data/lib/chewy/strategy/shoryuken.rb +0 -40
- data/lib/chewy/type.rb +0 -120
- data/lib/chewy/type/actions.rb +0 -43
- data/lib/chewy/type/adapter/mongoid.rb +0 -67
- data/lib/chewy/type/adapter/sequel.rb +0 -93
- data/lib/sequel/plugins/chewy_observe.rb +0 -63
- data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
- data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
- data/spec/chewy/strategy/resque_spec.rb +0 -46
- data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
- data/spec/chewy/type/actions_spec.rb +0 -50
- data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
- data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
- data/spec/chewy/type/observe_spec.rb +0 -137
- data/spec/chewy/type/wrapper_spec.rb +0 -100
- data/spec/chewy/type_spec.rb +0 -55
- data/spec/support/mongoid.rb +0 -93
- data/spec/support/sequel.rb +0 -80
|
@@ -1,47 +1,41 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe Chewy::
|
|
4
|
-
let(:product) { ProductsIndex
|
|
5
|
-
let(:review) { ReviewsIndex
|
|
3
|
+
describe Chewy::Index::Mapping do
|
|
4
|
+
let(:product) { ProductsIndex }
|
|
5
|
+
let(:review) { ReviewsIndex }
|
|
6
6
|
|
|
7
7
|
before do
|
|
8
8
|
stub_index(:products) do
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
field :
|
|
13
|
-
field :subfield1
|
|
14
|
-
end
|
|
15
|
-
field 'price', type: 'float' do
|
|
16
|
-
field :subfield2
|
|
17
|
-
end
|
|
18
|
-
agg :named_agg do
|
|
19
|
-
{avg: {field: 'title.subfield1'}}
|
|
20
|
-
end
|
|
9
|
+
root do
|
|
10
|
+
field :name, 'surname'
|
|
11
|
+
field :title, type: 'text' do
|
|
12
|
+
field :subfield1
|
|
21
13
|
end
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
stub_index(:reviews) do
|
|
25
|
-
define_type :review do
|
|
26
|
-
field :title, :body
|
|
27
|
-
field :comments do
|
|
28
|
-
field :message
|
|
29
|
-
field :rating, type: 'long'
|
|
14
|
+
field 'price', type: 'float' do
|
|
15
|
+
field :subfield2
|
|
30
16
|
end
|
|
31
17
|
agg :named_agg do
|
|
32
|
-
{avg: {field: '
|
|
18
|
+
{avg: {field: 'title.subfield1'}}
|
|
33
19
|
end
|
|
34
20
|
end
|
|
35
21
|
end
|
|
22
|
+
stub_index(:reviews) do
|
|
23
|
+
field :title, :body
|
|
24
|
+
field :comments do
|
|
25
|
+
field :message
|
|
26
|
+
field :rating, type: 'long'
|
|
27
|
+
end
|
|
28
|
+
agg :named_agg do
|
|
29
|
+
{avg: {field: 'comments.rating'}}
|
|
30
|
+
end
|
|
31
|
+
end
|
|
36
32
|
end
|
|
37
33
|
|
|
38
34
|
context 'no root element call' do
|
|
39
35
|
before do
|
|
40
36
|
stub_index(:products) do
|
|
41
|
-
|
|
42
|
-
field :
|
|
43
|
-
field :subfield1
|
|
44
|
-
end
|
|
37
|
+
field :title, type: 'text' do
|
|
38
|
+
field :subfield1
|
|
45
39
|
end
|
|
46
40
|
end
|
|
47
41
|
end
|
|
@@ -59,7 +53,7 @@ describe Chewy::Type::Mapping do
|
|
|
59
53
|
Chewy.default_root_options = previous_options
|
|
60
54
|
end
|
|
61
55
|
|
|
62
|
-
specify { expect(product.mappings_hash).to include(_all: {enabled: false}) }
|
|
56
|
+
specify { expect(product.mappings_hash[:mappings]).to include(_all: {enabled: false}) }
|
|
63
57
|
end
|
|
64
58
|
end
|
|
65
59
|
|
|
@@ -83,33 +77,33 @@ describe Chewy::Type::Mapping do
|
|
|
83
77
|
end
|
|
84
78
|
|
|
85
79
|
describe '.mappings_hash' do
|
|
86
|
-
specify { expect(product.mappings_hash).to eq(product.root.mappings_hash) }
|
|
80
|
+
specify { expect(product.mappings_hash[:mappings]).to eq(product.root.mappings_hash) }
|
|
87
81
|
|
|
88
82
|
context 'root merging' do
|
|
89
83
|
context do
|
|
90
84
|
before do
|
|
91
85
|
stub_index(:products) do
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
field :
|
|
95
|
-
field :last_name # will be redefined in the following root flock
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
root other_option: 'option_value' do
|
|
99
|
-
field :identifier
|
|
100
|
-
field :name, type: 'integer'
|
|
86
|
+
root other_option: 'nothing' do
|
|
87
|
+
field :name do
|
|
88
|
+
field :last_name # will be redefined in the following root flock
|
|
101
89
|
end
|
|
102
90
|
end
|
|
91
|
+
root other_option: 'option_value' do
|
|
92
|
+
field :identifier
|
|
93
|
+
field :name, type: 'integer'
|
|
94
|
+
end
|
|
103
95
|
end
|
|
104
96
|
end
|
|
105
97
|
|
|
106
98
|
specify do
|
|
107
99
|
expect(product.mappings_hash).to eq(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
100
|
+
mappings: {
|
|
101
|
+
properties: {
|
|
102
|
+
name: {type: 'integer'},
|
|
103
|
+
identifier: {type: Chewy.default_field_type}
|
|
104
|
+
},
|
|
105
|
+
other_option: 'option_value'
|
|
106
|
+
}
|
|
113
107
|
)
|
|
114
108
|
end
|
|
115
109
|
end
|
|
@@ -117,24 +111,22 @@ describe Chewy::Type::Mapping do
|
|
|
117
111
|
end
|
|
118
112
|
|
|
119
113
|
describe '.supports_outdated_sync?' do
|
|
120
|
-
def
|
|
121
|
-
stub_index(:cities)
|
|
122
|
-
|
|
123
|
-
end
|
|
124
|
-
CitiesIndex::City
|
|
114
|
+
def index(&block)
|
|
115
|
+
stub_index(:cities, &block)
|
|
116
|
+
CitiesIndex
|
|
125
117
|
end
|
|
126
118
|
|
|
127
|
-
specify { expect(
|
|
128
|
-
specify { expect(
|
|
129
|
-
specify { expect(
|
|
119
|
+
specify { expect(index.supports_outdated_sync?).to eq(false) }
|
|
120
|
+
specify { expect(index { field :updated_at }.supports_outdated_sync?).to eq(true) }
|
|
121
|
+
specify { expect(index { field :updated_at, value: -> {} }.supports_outdated_sync?).to eq(false) }
|
|
130
122
|
specify do
|
|
131
|
-
expect(
|
|
123
|
+
expect(index do
|
|
132
124
|
self.outdated_sync_field = :version
|
|
133
125
|
field :updated_at
|
|
134
126
|
end.supports_outdated_sync?).to eq(false)
|
|
135
127
|
end
|
|
136
128
|
specify do
|
|
137
|
-
expect(
|
|
129
|
+
expect(index do
|
|
138
130
|
self.outdated_sync_field = :version
|
|
139
131
|
field :version
|
|
140
132
|
end.supports_outdated_sync?).to eq(true)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Chewy::Index::Observe do
|
|
4
|
+
describe '.update_index' do
|
|
5
|
+
before do
|
|
6
|
+
stub_index(:dummies)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:backreferenced) { Array.new(3) { |i| double(id: i) } }
|
|
10
|
+
|
|
11
|
+
specify do
|
|
12
|
+
expect { DummiesIndex.update_index(backreferenced) }
|
|
13
|
+
.to raise_error Chewy::UndefinedUpdateStrategy
|
|
14
|
+
end
|
|
15
|
+
specify do
|
|
16
|
+
expect { DummiesIndex.update_index([]) }
|
|
17
|
+
.not_to update_index('dummies')
|
|
18
|
+
end
|
|
19
|
+
specify do
|
|
20
|
+
expect { DummiesIndex.update_index(nil) }
|
|
21
|
+
.not_to update_index('dummies')
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context 'integration', :orm do
|
|
26
|
+
let(:update_condition) { true }
|
|
27
|
+
|
|
28
|
+
before do
|
|
29
|
+
stub_model(:city) do
|
|
30
|
+
update_index(-> { 'cities' }, :self)
|
|
31
|
+
update_index('countries') { changes['country_id'] || previous_changes['country_id'] || country }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
stub_model(:country) do
|
|
35
|
+
update_index('cities', if: -> { update_condition }) { cities }
|
|
36
|
+
update_index(-> { 'countries' }, :self)
|
|
37
|
+
attr_accessor :update_condition
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
City.belongs_to :country
|
|
41
|
+
Country.has_many :cities
|
|
42
|
+
|
|
43
|
+
stub_index(:cities) do
|
|
44
|
+
index_scope City
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
stub_index(:countries) do
|
|
48
|
+
index_scope Country
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context do
|
|
53
|
+
let!(:country1) { Chewy.strategy(:atomic) { Country.create!(id: 1, update_condition: update_condition) } }
|
|
54
|
+
let!(:country2) { Chewy.strategy(:atomic) { Country.create!(id: 2, update_condition: update_condition) } }
|
|
55
|
+
let!(:city) { Chewy.strategy(:atomic) { City.create!(id: 1, country: country1) } }
|
|
56
|
+
|
|
57
|
+
specify { expect { city.save! }.to update_index('cities').and_reindex(city).only }
|
|
58
|
+
specify { expect { city.save! }.to update_index('countries').and_reindex(country1).only }
|
|
59
|
+
|
|
60
|
+
specify { expect { city.update!(country: nil) }.to update_index('cities').and_reindex(city).only }
|
|
61
|
+
specify { expect { city.update!(country: nil) }.to update_index('countries').and_reindex(country1).only }
|
|
62
|
+
|
|
63
|
+
specify { expect { city.update!(country: country2) }.to update_index('cities').and_reindex(city).only }
|
|
64
|
+
specify do
|
|
65
|
+
expect { city.update!(country: country2) }
|
|
66
|
+
.to update_index('countries').and_reindex(country1, country2).only
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context do
|
|
71
|
+
let!(:country) do
|
|
72
|
+
Chewy.strategy(:atomic) do
|
|
73
|
+
cities = Array.new(2) { |i| City.create!(id: i) }
|
|
74
|
+
Country.create!(id: 1, cities: cities, update_condition: update_condition)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
specify { expect { country.save! }.to update_index('cities').and_reindex(country.cities).only }
|
|
79
|
+
specify { expect { country.save! }.to update_index('countries').and_reindex(country).only }
|
|
80
|
+
|
|
81
|
+
context 'conditional update' do
|
|
82
|
+
let(:update_condition) { false }
|
|
83
|
+
specify { expect { country.save! }.not_to update_index('cities') }
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context 'transactions', :active_record do
|
|
89
|
+
context do
|
|
90
|
+
before { stub_model(:city) { update_index 'cities', :self } }
|
|
91
|
+
before { stub_index(:cities) { index_scope City } }
|
|
92
|
+
|
|
93
|
+
specify do
|
|
94
|
+
Chewy.strategy(:urgent) do
|
|
95
|
+
ActiveRecord::Base.transaction do
|
|
96
|
+
expect { City.create! }.not_to update_index('cities')
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
context do
|
|
103
|
+
before { allow(Chewy).to receive_messages(use_after_commit_callbacks: false) }
|
|
104
|
+
before { stub_model(:city) { update_index 'cities', :self } }
|
|
105
|
+
before { stub_index(:cities) { index_scope City } }
|
|
106
|
+
|
|
107
|
+
specify do
|
|
108
|
+
Chewy.strategy(:urgent) do
|
|
109
|
+
ActiveRecord::Base.transaction do
|
|
110
|
+
expect { City.create! }.to update_index('cities')
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -118,7 +118,9 @@ describe Chewy::Index::Settings do
|
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
context do
|
|
121
|
-
before
|
|
121
|
+
before do
|
|
122
|
+
allow(Chewy).to receive_messages(configuration: {index: {number_of_shards: 7, number_of_replicas: 2}})
|
|
123
|
+
end
|
|
122
124
|
|
|
123
125
|
specify do
|
|
124
126
|
expect(described_class.new.to_hash)
|
|
@@ -5,44 +5,34 @@ describe Chewy::Index::Specification do
|
|
|
5
5
|
|
|
6
6
|
let(:index1) do
|
|
7
7
|
stub_index(:places) do
|
|
8
|
-
|
|
9
|
-
field :founded_on, type: 'date'
|
|
10
|
-
end
|
|
8
|
+
field :founded_on, type: 'date'
|
|
11
9
|
end
|
|
12
10
|
end
|
|
13
11
|
|
|
14
12
|
let(:index2) do
|
|
15
13
|
stub_index(:places) do
|
|
16
14
|
settings analyzer: {}
|
|
17
|
-
|
|
18
|
-
field :founded_on, type: 'date'
|
|
19
|
-
end
|
|
15
|
+
field :founded_on, type: 'date'
|
|
20
16
|
end
|
|
21
17
|
end
|
|
22
18
|
|
|
23
19
|
let(:index3) do
|
|
24
20
|
stub_index(:places) do
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
field :population, type: 'integer'
|
|
28
|
-
end
|
|
21
|
+
field :founded_on, type: 'date'
|
|
22
|
+
field :population, type: 'integer'
|
|
29
23
|
end
|
|
30
24
|
end
|
|
31
25
|
|
|
32
26
|
let(:index4) do
|
|
33
27
|
stub_index(:places) do
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
field :founded_on, type: 'date'
|
|
37
|
-
end
|
|
28
|
+
field :population, type: 'integer'
|
|
29
|
+
field :founded_on, type: 'date'
|
|
38
30
|
end
|
|
39
31
|
end
|
|
40
32
|
|
|
41
33
|
let(:index5) do
|
|
42
34
|
stub_index('namespace/cities') do
|
|
43
|
-
|
|
44
|
-
field :population, type: 'integer'
|
|
45
|
-
end
|
|
35
|
+
field :population, type: 'integer'
|
|
46
36
|
end
|
|
47
37
|
end
|
|
48
38
|
|
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe Chewy::
|
|
3
|
+
describe Chewy::Index::Syncer, :orm do
|
|
4
4
|
before { Chewy.massacre }
|
|
5
5
|
before do
|
|
6
6
|
stub_model(:city)
|
|
7
7
|
stub_index(:cities) do
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
8
|
+
index_scope City
|
|
9
|
+
field :name
|
|
10
|
+
field :updated_at, type: 'date'
|
|
12
11
|
end
|
|
13
12
|
end
|
|
14
13
|
|
|
15
14
|
shared_examples 'sync' do |options = {}|
|
|
16
15
|
let!(:cities) { Array.new(3) { |i| City.create!(name: "Name#{i + 1}") } }
|
|
17
|
-
subject { described_class.new(CitiesIndex
|
|
16
|
+
subject { described_class.new(CitiesIndex, **options) }
|
|
18
17
|
|
|
19
18
|
describe '#perform' do
|
|
20
|
-
before { CitiesIndex
|
|
19
|
+
before { CitiesIndex.import!(cities) }
|
|
21
20
|
specify { expect(subject.perform).to eq(0) }
|
|
22
21
|
|
|
23
22
|
context do
|
|
24
23
|
before do
|
|
25
24
|
cities.first.destroy
|
|
26
|
-
sleep(1) if ActiveSupport::VERSION::STRING < '4.1.0'
|
|
27
25
|
cities.last.update(name: 'Name5')
|
|
28
26
|
end
|
|
29
27
|
let!(:additional_city) { City.create!(name: 'Name4') }
|
|
30
28
|
|
|
31
29
|
specify { expect(subject.perform).to eq(3) }
|
|
32
30
|
specify do
|
|
33
|
-
expect { subject.perform }.to update_index(CitiesIndex
|
|
31
|
+
expect { subject.perform }.to update_index(CitiesIndex)
|
|
34
32
|
.and_reindex(additional_city, cities.last)
|
|
35
33
|
.and_delete(cities.first).only
|
|
36
34
|
end
|
|
@@ -39,9 +37,8 @@ describe Chewy::Type::Syncer, :orm do
|
|
|
39
37
|
context 'does not support outdated sync' do
|
|
40
38
|
before do
|
|
41
39
|
stub_index(:cities) do
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
end
|
|
40
|
+
index_scope City
|
|
41
|
+
field :name
|
|
45
42
|
end
|
|
46
43
|
end
|
|
47
44
|
|
|
@@ -56,7 +53,7 @@ describe Chewy::Type::Syncer, :orm do
|
|
|
56
53
|
|
|
57
54
|
specify { expect(subject.perform).to eq(2) }
|
|
58
55
|
specify do
|
|
59
|
-
expect { subject.perform }.to update_index(CitiesIndex
|
|
56
|
+
expect { subject.perform }.to update_index(CitiesIndex)
|
|
60
57
|
.and_reindex(additional_city)
|
|
61
58
|
.and_delete(cities.first).only
|
|
62
59
|
end
|
|
@@ -68,7 +65,7 @@ describe Chewy::Type::Syncer, :orm do
|
|
|
68
65
|
specify { expect(subject.missing_ids).to match_array(cities.map(&:id).map(&:to_s)) }
|
|
69
66
|
|
|
70
67
|
context do
|
|
71
|
-
before { CitiesIndex
|
|
68
|
+
before { CitiesIndex.import!(cities) }
|
|
72
69
|
specify { expect(subject.missing_ids).to eq([]) }
|
|
73
70
|
|
|
74
71
|
context do
|
|
@@ -83,12 +80,11 @@ describe Chewy::Type::Syncer, :orm do
|
|
|
83
80
|
specify { expect(subject.outdated_ids).to eq([]) }
|
|
84
81
|
|
|
85
82
|
context do
|
|
86
|
-
before { CitiesIndex
|
|
83
|
+
before { CitiesIndex.import!(cities) }
|
|
87
84
|
specify { expect(subject.outdated_ids).to eq([]) }
|
|
88
85
|
|
|
89
86
|
context do
|
|
90
87
|
before do
|
|
91
|
-
sleep(1) if ActiveSupport::VERSION::STRING < '4.1.0'
|
|
92
88
|
cities.first.update(name: 'Name4')
|
|
93
89
|
cities.last.update(name: 'Name5')
|
|
94
90
|
end
|
|
@@ -99,9 +95,8 @@ describe Chewy::Type::Syncer, :orm do
|
|
|
99
95
|
context 'does not support outdated sync' do
|
|
100
96
|
before do
|
|
101
97
|
stub_index(:cities) do
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
end
|
|
98
|
+
index_scope City
|
|
99
|
+
field :name
|
|
105
100
|
end
|
|
106
101
|
end
|
|
107
102
|
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe Chewy::
|
|
3
|
+
describe Chewy::Index::Witchcraft do
|
|
4
4
|
def self.mapping(&block)
|
|
5
5
|
before do
|
|
6
6
|
stub_index(:products) do
|
|
7
|
-
|
|
8
|
-
witchcraft!
|
|
7
|
+
witchcraft!
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
end
|
|
9
|
+
instance_exec(&block)
|
|
12
10
|
end
|
|
13
11
|
end
|
|
14
12
|
end
|
|
15
13
|
|
|
16
14
|
describe '#cauldron' do
|
|
17
|
-
let(:
|
|
15
|
+
let(:index) { ProductsIndex }
|
|
18
16
|
let(:object) {}
|
|
19
17
|
|
|
20
18
|
context 'empty mapping' do
|
|
21
19
|
mapping {}
|
|
22
|
-
specify { expect(
|
|
20
|
+
specify { expect(index.cauldron.brew(object)).to eq({}) }
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
context do
|
|
@@ -32,18 +30,18 @@ describe Chewy::Type::Witchcraft do
|
|
|
32
30
|
|
|
33
31
|
context do
|
|
34
32
|
let(:object) { double(attributes) }
|
|
35
|
-
specify { expect(
|
|
33
|
+
specify { expect(index.cauldron.brew(object)).to eq(attributes.as_json) }
|
|
36
34
|
end
|
|
37
35
|
|
|
38
36
|
context do
|
|
39
37
|
let(:object) { attributes }
|
|
40
|
-
specify { expect(
|
|
38
|
+
specify { expect(index.cauldron.brew(object)).to eq(attributes.as_json) }
|
|
41
39
|
end
|
|
42
40
|
|
|
43
41
|
context do
|
|
44
42
|
let(:object) { double(attributes) }
|
|
45
43
|
specify do
|
|
46
|
-
expect(
|
|
44
|
+
expect(index.cauldron(fields: %i[name tags]).brew(object))
|
|
47
45
|
.to eq('name' => 'Name', 'tags' => %w[Ruby RoR])
|
|
48
46
|
end
|
|
49
47
|
end
|
|
@@ -51,7 +49,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
51
49
|
context do
|
|
52
50
|
let(:object) { attributes }
|
|
53
51
|
specify do
|
|
54
|
-
expect(
|
|
52
|
+
expect(index.cauldron(fields: %i[name tags]).brew(object))
|
|
55
53
|
.to eq('name' => 'Name', 'tags' => %w[Ruby RoR])
|
|
56
54
|
end
|
|
57
55
|
end
|
|
@@ -69,7 +67,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
69
67
|
|
|
70
68
|
context do
|
|
71
69
|
let(:object) { double(attributes) }
|
|
72
|
-
specify { expect(
|
|
70
|
+
specify { expect(index.cauldron.brew(object)).to eq(attributes.merge(tags: %i[Ruby RoR]).as_json) }
|
|
73
71
|
end
|
|
74
72
|
end
|
|
75
73
|
|
|
@@ -82,7 +80,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
82
80
|
context do
|
|
83
81
|
let(:object) { double(attributes) }
|
|
84
82
|
let(:crutches) { double(names: ['Other']) }
|
|
85
|
-
specify { expect(
|
|
83
|
+
specify { expect(index.cauldron.brew(object, crutches)).to eq({name: 'Other'}.as_json) }
|
|
86
84
|
end
|
|
87
85
|
end
|
|
88
86
|
|
|
@@ -102,7 +100,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
102
100
|
])
|
|
103
101
|
end
|
|
104
102
|
specify do
|
|
105
|
-
expect(
|
|
103
|
+
expect(index.cauldron.brew(object)).to eq({queries: [
|
|
106
104
|
{title: 'Title1', body: 'This Body1'},
|
|
107
105
|
{title: 'Title2', body: 'This Body2'}
|
|
108
106
|
]}.as_json)
|
|
@@ -124,7 +122,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
124
122
|
])
|
|
125
123
|
end
|
|
126
124
|
specify do
|
|
127
|
-
expect(
|
|
125
|
+
expect(index.cauldron.brew(object)).to eq({queries: [
|
|
128
126
|
{title: 'Title1', body: 'This Body1'},
|
|
129
127
|
{title: 'Title2', body: 'This Body2'}
|
|
130
128
|
]}.as_json)
|
|
@@ -146,7 +144,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
146
144
|
])
|
|
147
145
|
end
|
|
148
146
|
specify do
|
|
149
|
-
expect(
|
|
147
|
+
expect(index.cauldron.brew(object)).to eq({queries: [
|
|
150
148
|
{title: 'Title1', body: 'This Body1'},
|
|
151
149
|
{title: 'Title2', body: 'This Body2'}
|
|
152
150
|
]}.as_json)
|
|
@@ -172,7 +170,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
172
170
|
])
|
|
173
171
|
end
|
|
174
172
|
specify do
|
|
175
|
-
expect(
|
|
173
|
+
expect(index.cauldron.brew(object, double(second: 'Crutch'))).to eq({queries: [
|
|
176
174
|
{fields: [
|
|
177
175
|
{first: 'First1', second: 'Value1Second1'},
|
|
178
176
|
{first: 'First2', second: 'Value1Crutch'}
|
|
@@ -193,7 +191,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
193
191
|
double(not_present: nil)
|
|
194
192
|
end
|
|
195
193
|
specify do
|
|
196
|
-
expect(
|
|
194
|
+
expect(index.cauldron.brew(object)).to eq({not_present: nil}.as_json)
|
|
197
195
|
end
|
|
198
196
|
end
|
|
199
197
|
end
|
|
@@ -208,7 +206,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
208
206
|
|
|
209
207
|
context do
|
|
210
208
|
let(:object) { double(attributes) }
|
|
211
|
-
specify { expect(
|
|
209
|
+
specify { expect(index.cauldron.brew(object)).to eq(attributes.as_json) }
|
|
212
210
|
end
|
|
213
211
|
end
|
|
214
212
|
|
|
@@ -224,7 +222,7 @@ describe Chewy::Type::Witchcraft do
|
|
|
224
222
|
|
|
225
223
|
context do
|
|
226
224
|
let(:object) { double(attributes) }
|
|
227
|
-
specify { expect(
|
|
225
|
+
specify { expect(index.cauldron.brew(object)).to eq(attributes.as_json) }
|
|
228
226
|
end
|
|
229
227
|
end
|
|
230
228
|
|
|
@@ -235,12 +233,12 @@ describe Chewy::Type::Witchcraft do
|
|
|
235
233
|
|
|
236
234
|
context do
|
|
237
235
|
let(:object) { double(last_name: 'Name') }
|
|
238
|
-
specify { expect(
|
|
236
|
+
specify { expect(index.cauldron.brew(object)).to eq({name: 'Name'}.as_json) }
|
|
239
237
|
end
|
|
240
238
|
|
|
241
239
|
context do
|
|
242
240
|
let(:object) { {'last_name' => 'Name'} }
|
|
243
|
-
specify { expect(
|
|
241
|
+
specify { expect(index.cauldron.brew(object)).to eq({name: 'Name'}.as_json) }
|
|
244
242
|
end
|
|
245
243
|
end
|
|
246
244
|
end
|