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.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +58 -0
  3. data/.rubocop.yml +13 -8
  4. data/.rubocop_todo.yml +110 -22
  5. data/CHANGELOG.md +53 -0
  6. data/Gemfile +0 -7
  7. data/Guardfile +3 -1
  8. data/README.md +282 -245
  9. data/chewy.gemspec +3 -5
  10. data/gemfiles/rails.5.2.activerecord.gemfile +8 -14
  11. data/gemfiles/rails.6.0.activerecord.gemfile +8 -14
  12. data/gemfiles/rails.6.1.activerecord.gemfile +8 -14
  13. data/lib/chewy.rb +21 -75
  14. data/lib/chewy/config.rb +40 -40
  15. data/lib/chewy/errors.rb +0 -12
  16. data/lib/chewy/fields/base.rb +11 -1
  17. data/lib/chewy/fields/root.rb +3 -4
  18. data/lib/chewy/index.rb +46 -87
  19. data/lib/chewy/index/actions.rb +51 -32
  20. data/lib/chewy/{type → index}/adapter/active_record.rb +12 -3
  21. data/lib/chewy/{type → index}/adapter/base.rb +2 -3
  22. data/lib/chewy/{type → index}/adapter/object.rb +27 -31
  23. data/lib/chewy/{type → index}/adapter/orm.rb +11 -14
  24. data/lib/chewy/{type → index}/crutch.rb +5 -5
  25. data/lib/chewy/{type → index}/import.rb +36 -27
  26. data/lib/chewy/{type → index}/import/bulk_builder.rb +15 -13
  27. data/lib/chewy/{type → index}/import/bulk_request.rb +6 -6
  28. data/lib/chewy/{type → index}/import/journal_builder.rb +10 -10
  29. data/lib/chewy/{type → index}/import/routine.rb +15 -14
  30. data/lib/chewy/{type → index}/mapping.rb +26 -31
  31. data/lib/chewy/{type → index}/observe.rb +9 -19
  32. data/lib/chewy/index/specification.rb +1 -0
  33. data/lib/chewy/{type → index}/syncer.rb +60 -57
  34. data/lib/chewy/{type → index}/witchcraft.rb +11 -7
  35. data/lib/chewy/{type → index}/wrapper.rb +2 -2
  36. data/lib/chewy/journal.rb +8 -8
  37. data/lib/chewy/minitest/helpers.rb +9 -13
  38. data/lib/chewy/minitest/search_index_receiver.rb +22 -26
  39. data/lib/chewy/railtie.rb +4 -2
  40. data/lib/chewy/rake_helper.rb +82 -107
  41. data/lib/chewy/rspec/update_index.rb +47 -43
  42. data/lib/chewy/search.rb +4 -17
  43. data/lib/chewy/search/loader.rb +18 -30
  44. data/lib/chewy/search/parameters.rb +4 -2
  45. data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
  46. data/lib/chewy/search/parameters/source.rb +5 -1
  47. data/lib/chewy/search/query_proxy.rb +9 -2
  48. data/lib/chewy/search/request.rb +82 -86
  49. data/lib/chewy/search/response.rb +4 -4
  50. data/lib/chewy/search/scoping.rb +6 -7
  51. data/lib/chewy/search/scrolling.rb +11 -11
  52. data/lib/chewy/stash.rb +14 -22
  53. data/lib/chewy/strategy.rb +3 -19
  54. data/lib/chewy/strategy/sidekiq.rb +1 -0
  55. data/lib/chewy/version.rb +1 -1
  56. data/lib/generators/chewy/install_generator.rb +1 -1
  57. data/lib/tasks/chewy.rake +10 -22
  58. data/migration_guide.md +14 -0
  59. data/spec/chewy/config_spec.rb +14 -39
  60. data/spec/chewy/fields/base_spec.rb +412 -148
  61. data/spec/chewy/fields/root_spec.rb +16 -24
  62. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  63. data/spec/chewy/index/actions_spec.rb +270 -24
  64. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +68 -40
  65. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  66. data/spec/chewy/{type → index}/import/bulk_builder_spec.rb +23 -31
  67. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -6
  68. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -15
  69. data/spec/chewy/{type → index}/import/routine_spec.rb +16 -16
  70. data/spec/chewy/{type → index}/import_spec.rb +102 -98
  71. data/spec/chewy/{type → index}/mapping_spec.rb +46 -54
  72. data/spec/chewy/index/observe_spec.rb +116 -0
  73. data/spec/chewy/index/settings_spec.rb +3 -1
  74. data/spec/chewy/index/specification_spec.rb +7 -17
  75. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  76. data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
  77. data/spec/chewy/index/wrapper_spec.rb +100 -0
  78. data/spec/chewy/index_spec.rb +59 -102
  79. data/spec/chewy/journal_spec.rb +9 -22
  80. data/spec/chewy/minitest/helpers_spec.rb +13 -15
  81. data/spec/chewy/minitest/search_index_receiver_spec.rb +22 -26
  82. data/spec/chewy/multi_search_spec.rb +4 -5
  83. data/spec/chewy/rake_helper_spec.rb +145 -55
  84. data/spec/chewy/rspec/update_index_spec.rb +74 -71
  85. data/spec/chewy/search/loader_spec.rb +19 -37
  86. data/spec/chewy/search/pagination/kaminari_examples.rb +3 -5
  87. data/spec/chewy/search/pagination/kaminari_spec.rb +1 -1
  88. data/spec/chewy/search/parameters/indices_spec.rb +2 -8
  89. data/spec/chewy/search/parameters/order_spec.rb +1 -1
  90. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  91. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  92. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  93. data/spec/chewy/search/parameters_spec.rb +12 -3
  94. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  95. data/spec/chewy/search/request_spec.rb +222 -74
  96. data/spec/chewy/search/response_spec.rb +12 -12
  97. data/spec/chewy/search/scrolling_spec.rb +7 -9
  98. data/spec/chewy/search_spec.rb +32 -35
  99. data/spec/chewy/stash_spec.rb +9 -21
  100. data/spec/chewy/strategy/active_job_spec.rb +8 -8
  101. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  102. data/spec/chewy/strategy/sidekiq_spec.rb +8 -8
  103. data/spec/chewy/strategy_spec.rb +19 -15
  104. data/spec/chewy_spec.rb +14 -100
  105. data/spec/spec_helper.rb +2 -21
  106. data/spec/support/active_record.rb +15 -5
  107. metadata +44 -103
  108. data/.circleci/config.yml +0 -214
  109. data/Appraisals +0 -81
  110. data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
  111. data/gemfiles/sequel.4.45.gemfile +0 -11
  112. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  113. data/lib/chewy/strategy/resque.rb +0 -27
  114. data/lib/chewy/strategy/shoryuken.rb +0 -40
  115. data/lib/chewy/type.rb +0 -120
  116. data/lib/chewy/type/actions.rb +0 -43
  117. data/lib/chewy/type/adapter/mongoid.rb +0 -67
  118. data/lib/chewy/type/adapter/sequel.rb +0 -93
  119. data/lib/sequel/plugins/chewy_observe.rb +0 -63
  120. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  121. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  122. data/spec/chewy/strategy/resque_spec.rb +0 -46
  123. data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
  124. data/spec/chewy/type/actions_spec.rb +0 -50
  125. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  126. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  127. data/spec/chewy/type/observe_spec.rb +0 -137
  128. data/spec/chewy/type/wrapper_spec.rb +0 -100
  129. data/spec/chewy/type_spec.rb +0 -55
  130. data/spec/support/mongoid.rb +0 -93
  131. data/spec/support/sequel.rb +0 -80
@@ -1,47 +1,41 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Chewy::Type::Mapping do
4
- let(:product) { ProductsIndex::Product }
5
- let(:review) { ReviewsIndex::Review }
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
- define_type :product do
10
- root do
11
- field :name, 'surname'
12
- field :title, type: 'text' do
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
- end
23
- end
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: 'comments.rating'}}
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
- define_type :product do
42
- field :title, type: 'text' do
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
- define_type :product do
93
- root other_option: 'nothing' do
94
- field :name do
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
- properties: {
109
- name: {type: 'integer'},
110
- identifier: {type: Chewy.default_field_type}
111
- },
112
- other_option: 'option_value'
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 type(&block)
121
- stub_index(:cities) do
122
- define_type :city, &block
123
- end
124
- CitiesIndex::City
114
+ def index(&block)
115
+ stub_index(:cities, &block)
116
+ CitiesIndex
125
117
  end
126
118
 
127
- specify { expect(type.supports_outdated_sync?).to eq(false) }
128
- specify { expect(type { field :updated_at }.supports_outdated_sync?).to eq(true) }
129
- specify { expect(type { field :updated_at, value: -> {} }.supports_outdated_sync?).to eq(false) }
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(type do
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(type do
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 { allow(Chewy).to receive_messages(configuration: {index: {number_of_shards: 7, number_of_replicas: 2}}) }
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
- define_type(:city) do
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
- define_type(:city) do
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
- define_type(:city) do
26
- field :founded_on, type: 'date'
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
- define_type(:city) do
35
- field :population, type: 'integer'
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
- define_type(:city) do
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::Type::Syncer, :orm do
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
- define_type City do
9
- field :name
10
- field :updated_at, type: 'date'
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::City, **options) }
16
+ subject { described_class.new(CitiesIndex, **options) }
18
17
 
19
18
  describe '#perform' do
20
- before { CitiesIndex::City.import!(cities) }
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::City)
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
- define_type City do
43
- field :name
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::City)
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::City.import!(cities) }
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::City.import!(cities) }
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
- define_type City do
103
- field :name
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::Type::Witchcraft do
3
+ describe Chewy::Index::Witchcraft do
4
4
  def self.mapping(&block)
5
5
  before do
6
6
  stub_index(:products) do
7
- define_type :product do
8
- witchcraft!
7
+ witchcraft!
9
8
 
10
- instance_exec(&block)
11
- end
9
+ instance_exec(&block)
12
10
  end
13
11
  end
14
12
  end
15
13
 
16
14
  describe '#cauldron' do
17
- let(:type) { ProductsIndex::Product }
15
+ let(:index) { ProductsIndex }
18
16
  let(:object) {}
19
17
 
20
18
  context 'empty mapping' do
21
19
  mapping {}
22
- specify { expect(type.cauldron.brew(object)).to eq({}) }
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(type.cauldron.brew(object)).to eq(attributes.as_json) }
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(type.cauldron.brew(object)).to eq(attributes.as_json) }
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(type.cauldron(fields: %i[name tags]).brew(object))
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(type.cauldron(fields: %i[name tags]).brew(object))
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(type.cauldron.brew(object)).to eq(attributes.merge(tags: %i[Ruby RoR]).as_json) }
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(type.cauldron.brew(object, crutches)).to eq({name: 'Other'}.as_json) }
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(type.cauldron.brew(object)).to eq({queries: [
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(type.cauldron.brew(object)).to eq({queries: [
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(type.cauldron.brew(object)).to eq({queries: [
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(type.cauldron.brew(object, double(second: 'Crutch'))).to eq({queries: [
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(type.cauldron.brew(object)).to eq({not_present: nil}.as_json)
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(type.cauldron.brew(object)).to eq(attributes.as_json) }
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(type.cauldron.brew(object)).to eq(attributes.as_json) }
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(type.cauldron.brew(object)).to eq({name: 'Name'}.as_json) }
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(type.cauldron.brew(object)).to eq({name: 'Name'}.as_json) }
241
+ specify { expect(index.cauldron.brew(object)).to eq({name: 'Name'}.as_json) }
244
242
  end
245
243
  end
246
244
  end