pg_search 2.3.2 → 2.3.3

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +11 -0
  3. data/.rubocop.yml +86 -4
  4. data/.travis.yml +4 -12
  5. data/CHANGELOG.md +25 -20
  6. data/LICENSE +1 -1
  7. data/README.md +5 -5
  8. data/lib/pg_search.rb +4 -4
  9. data/lib/pg_search/document.rb +1 -1
  10. data/lib/pg_search/features/dmetaphone.rb +4 -6
  11. data/lib/pg_search/features/tsearch.rb +13 -12
  12. data/lib/pg_search/migration/templates/add_pg_search_dmetaphone_support_functions.rb.erb +6 -6
  13. data/lib/pg_search/migration/templates/create_pg_search_documents.rb.erb +2 -2
  14. data/lib/pg_search/model.rb +2 -0
  15. data/lib/pg_search/multisearch.rb +10 -1
  16. data/lib/pg_search/multisearch/rebuilder.rb +2 -2
  17. data/lib/pg_search/scope_options.rb +2 -2
  18. data/lib/pg_search/tasks.rb +1 -1
  19. data/lib/pg_search/version.rb +1 -1
  20. data/pg_search.gemspec +8 -3
  21. data/spec/integration/.rubocop.yml +11 -0
  22. data/spec/integration/associations_spec.rb +17 -56
  23. data/spec/integration/deprecation_spec.rb +1 -1
  24. data/spec/integration/pg_search_spec.rb +62 -51
  25. data/spec/lib/pg_search/configuration/association_spec.rb +8 -6
  26. data/spec/lib/pg_search/features/dmetaphone_spec.rb +2 -2
  27. data/spec/lib/pg_search/features/trigram_spec.rb +15 -11
  28. data/spec/lib/pg_search/features/tsearch_spec.rb +16 -10
  29. data/spec/lib/pg_search/multisearch/rebuilder_spec.rb +89 -55
  30. data/spec/lib/pg_search/multisearch_spec.rb +47 -28
  31. data/spec/lib/pg_search/multisearchable_spec.rb +148 -94
  32. data/spec/lib/pg_search/normalizer_spec.rb +12 -10
  33. data/spec/lib/pg_search_spec.rb +57 -41
  34. data/spec/spec_helper.rb +10 -4
  35. data/spec/support/database.rb +1 -1
  36. metadata +81 -8
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ # rubocop:disable RSpec/NestedGroups
5
6
  describe PgSearch::Configuration::Association do
6
7
  with_model :Avatar do
7
8
  table do |t|
@@ -39,7 +40,7 @@ describe PgSearch::Configuration::Association do
39
40
  end
40
41
  end
41
42
 
42
- context "has_one" do
43
+ context "with has_one" do
43
44
  let(:association) { described_class.new(User, :avatar, :url) }
44
45
 
45
46
  describe "#table_name" do
@@ -50,7 +51,7 @@ describe PgSearch::Configuration::Association do
50
51
 
51
52
  describe "#join" do
52
53
  let(:expected_sql) do
53
- <<-SQL.gsub(/\s+/, ' ').strip
54
+ <<~SQL.squish
54
55
  LEFT OUTER JOIN
55
56
  (SELECT model_id AS id,
56
57
  #{column_select} AS #{association.columns.first.alias}
@@ -70,7 +71,7 @@ describe PgSearch::Configuration::Association do
70
71
  end
71
72
  end
72
73
 
73
- context "belongs_to" do
74
+ context "with belongs_to" do
74
75
  let(:association) { described_class.new(User, :site, :title) }
75
76
 
76
77
  describe "#table_name" do
@@ -81,7 +82,7 @@ describe PgSearch::Configuration::Association do
81
82
 
82
83
  describe "#join" do
83
84
  let(:expected_sql) do
84
- <<-SQL.gsub(/\s+/, ' ').strip
85
+ <<~SQL.squish
85
86
  LEFT OUTER JOIN
86
87
  (SELECT model_id AS id,
87
88
  #{column_select} AS #{association.columns.first.alias}
@@ -101,7 +102,7 @@ describe PgSearch::Configuration::Association do
101
102
  end
102
103
  end
103
104
 
104
- context "has_many" do
105
+ context "with has_many" do
105
106
  let(:association) { described_class.new(Site, :users, :name) }
106
107
 
107
108
  describe "#table_name" do
@@ -112,7 +113,7 @@ describe PgSearch::Configuration::Association do
112
113
 
113
114
  describe "#join" do
114
115
  let(:expected_sql) do
115
- <<-SQL.gsub(/\s+/, ' ').strip
116
+ <<~SQL.squish
116
117
  LEFT OUTER JOIN
117
118
  (SELECT model_id AS id,
118
119
  string_agg(\"#{association.table_name}\".\"name\"::text, ' ') AS #{association.columns.first.alias}
@@ -138,3 +139,4 @@ describe PgSearch::Configuration::Association do
138
139
  end
139
140
  end
140
141
  end
142
+ # rubocop:enable RSpec/NestedGroups
@@ -18,7 +18,7 @@ describe PgSearch::Features::DMetaphone do
18
18
  PgSearch::Configuration::Column.new(:content, nil, Model)
19
19
  ]
20
20
  options = {}
21
- config = double(:config, ignore: [])
21
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
22
22
  normalizer = PgSearch::Normalizer.new(config)
23
23
 
24
24
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -43,7 +43,7 @@ describe PgSearch::Features::DMetaphone do
43
43
  PgSearch::Configuration::Column.new(:content, nil, Model)
44
44
  ]
45
45
  options = {}
46
- config = double(:config, ignore: [])
46
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
47
47
  normalizer = PgSearch::Normalizer.new(config)
48
48
 
49
49
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -3,8 +3,10 @@
3
3
  require 'spec_helper'
4
4
  require 'ostruct'
5
5
 
6
+ # rubocop:disable RSpec/MultipleMemoizedHelpers, RSpec/NestedGroups
6
7
  describe PgSearch::Features::Trigram do
7
8
  subject(:feature) { described_class.new(query, options, columns, Model, normalizer) }
9
+
8
10
  let(:query) { 'lolwut' }
9
11
  let(:options) { {} }
10
12
  let(:columns) {
@@ -17,8 +19,10 @@ describe PgSearch::Features::Trigram do
17
19
  let(:config) { OpenStruct.new(ignore: []) }
18
20
 
19
21
  let(:coalesced_columns) do
20
- <<-SQL.strip_heredoc.chomp
21
- coalesce(#{Model.quoted_table_name}."name"::text, '') || ' ' || coalesce(#{Model.quoted_table_name}."content"::text, '')
22
+ <<~SQL.squish
23
+ coalesce(#{Model.quoted_table_name}."name"::text, '')
24
+ || ' '
25
+ || coalesce(#{Model.quoted_table_name}."content"::text, '')
22
26
  SQL
23
27
  end
24
28
 
@@ -35,7 +39,7 @@ describe PgSearch::Features::Trigram do
35
39
  expect(feature.conditions.to_sql).to eq("('#{query}' % (#{coalesced_columns}))")
36
40
  end
37
41
 
38
- context 'searching by word_similarity' do
42
+ context 'when searching by word_similarity' do
39
43
  let(:options) do
40
44
  { word_similarity: true }
41
45
  end
@@ -46,7 +50,7 @@ describe PgSearch::Features::Trigram do
46
50
  end
47
51
  end
48
52
 
49
- context 'ignoring accents' do
53
+ context 'when ignoring accents' do
50
54
  it 'escapes the search document and query, but not the accent function' do
51
55
  config.ignore = [:accents]
52
56
  expect(feature.conditions.to_sql).to eq("(unaccent('#{query}') % (unaccent(#{coalesced_columns})))")
@@ -54,7 +58,7 @@ describe PgSearch::Features::Trigram do
54
58
  end
55
59
 
56
60
  context 'when a threshold is specified' do
57
- context 'searching by similarity' do
61
+ context 'when searching by similarity' do
58
62
  let(:options) do
59
63
  { threshold: 0.5 }
60
64
  end
@@ -66,7 +70,7 @@ describe PgSearch::Features::Trigram do
66
70
  end
67
71
  end
68
72
 
69
- context 'searching by word_similarity' do
73
+ context 'when searching by word_similarity' do
70
74
  let(:options) do
71
75
  { threshold: 0.5, word_similarity: true }
72
76
  end
@@ -79,21 +83,20 @@ describe PgSearch::Features::Trigram do
79
83
  end
80
84
  end
81
85
 
82
- context 'only certain columns are selected' do
83
- context 'one column' do
86
+ context 'when only certain columns are selected' do
87
+ context 'with one column' do
84
88
  let(:options) { { only: :name } }
85
89
 
86
90
  it 'only searches against the select column' do
87
- options = { only: :name }
88
91
  coalesced_column = "coalesce(#{Model.quoted_table_name}.\"name\"::text, '')"
89
92
  expect(feature.conditions.to_sql).to eq("('#{query}' % (#{coalesced_column}))")
90
93
  end
91
94
  end
92
- context 'multiple columns' do
95
+
96
+ context 'with multiple columns' do
93
97
  let(:options) { { only: %i[name content] } }
94
98
 
95
99
  it 'concatenates when multiples columns are selected' do
96
- options = { only: %i[name content] }
97
100
  expect(feature.conditions.to_sql).to eq("('#{query}' % (#{coalesced_columns}))")
98
101
  end
99
102
  end
@@ -106,3 +109,4 @@ describe PgSearch::Features::Trigram do
106
109
  end
107
110
  end
108
111
  end
112
+ # rubocop:enable RSpec/MultipleMemoizedHelpers, RSpec/NestedGroups
@@ -19,7 +19,7 @@ describe PgSearch::Features::TSearch do
19
19
  PgSearch::Configuration::Column.new(:content, nil, Model)
20
20
  ]
21
21
  options = {}
22
- config = double(:config, ignore: [])
22
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
23
23
  normalizer = PgSearch::Normalizer.new(config)
24
24
 
25
25
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -44,7 +44,7 @@ describe PgSearch::Features::TSearch do
44
44
  PgSearch::Configuration::Column.new(:content, nil, Model)
45
45
  ]
46
46
  options = {}
47
- config = double(:config, ignore: [])
47
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
48
48
  normalizer = PgSearch::Normalizer.new(config)
49
49
 
50
50
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -61,7 +61,7 @@ describe PgSearch::Features::TSearch do
61
61
  PgSearch::Configuration::Column.new(:content, nil, Model)
62
62
  ]
63
63
  options = { negation: true }
64
- config = double(:config, ignore: [])
64
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
65
65
  normalizer = PgSearch::Normalizer.new(config)
66
66
 
67
67
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -79,7 +79,7 @@ describe PgSearch::Features::TSearch do
79
79
  PgSearch::Configuration::Column.new(:content, nil, Model)
80
80
  ]
81
81
  options = { negation: false }
82
- config = double(:config, ignore: [])
82
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
83
83
  normalizer = PgSearch::Normalizer.new(config)
84
84
 
85
85
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -97,7 +97,7 @@ describe PgSearch::Features::TSearch do
97
97
  PgSearch::Configuration::Column.new(:content, nil, Model)
98
98
  ]
99
99
  options = { tsvector_column: "my_tsvector" }
100
- config = double(:config, ignore: [])
100
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
101
101
  normalizer = PgSearch::Normalizer.new(config)
102
102
 
103
103
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -115,7 +115,7 @@ describe PgSearch::Features::TSearch do
115
115
  PgSearch::Configuration::Column.new(:content, nil, Model)
116
116
  ]
117
117
  options = { tsvector_column: ["tsvector1", "tsvector2"] }
118
- config = double(:config, ignore: [])
118
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
119
119
  normalizer = PgSearch::Normalizer.new(config)
120
120
 
121
121
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -141,7 +141,7 @@ describe PgSearch::Features::TSearch do
141
141
  ]
142
142
  options = {}
143
143
 
144
- config = double(:config, ignore: [])
144
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
145
145
  normalizer = PgSearch::Normalizer.new(config)
146
146
 
147
147
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -151,6 +151,7 @@ describe PgSearch::Features::TSearch do
151
151
  end
152
152
 
153
153
  context "when options[:dictionary] is passed" do
154
+ # rubocop:disable RSpec/ExampleLength
154
155
  it 'uses the provided dictionary' do
155
156
  query = "query"
156
157
  columns = [
@@ -165,7 +166,7 @@ describe PgSearch::Features::TSearch do
165
166
  }
166
167
  }
167
168
 
168
- config = double(:config, ignore: [])
169
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
169
170
  normalizer = PgSearch::Normalizer.new(config)
170
171
 
171
172
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -174,9 +175,11 @@ describe PgSearch::Features::TSearch do
174
175
 
175
176
  expect(feature.highlight.to_sql).to eq(expected_sql)
176
177
  end
178
+ # rubocop:enable RSpec/ExampleLength
177
179
  end
178
180
 
179
181
  context "when options[:highlight] has options set" do
182
+ # rubocop:disable RSpec/ExampleLength
180
183
  it "passes the options to ts_headline" do
181
184
  query = "query"
182
185
  columns = [
@@ -195,7 +198,7 @@ describe PgSearch::Features::TSearch do
195
198
  }
196
199
  }
197
200
 
198
- config = double(:config, ignore: [])
201
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
199
202
  normalizer = PgSearch::Normalizer.new(config)
200
203
 
201
204
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -204,7 +207,9 @@ describe PgSearch::Features::TSearch do
204
207
 
205
208
  expect(feature.highlight.to_sql).to eq(expected_sql)
206
209
  end
210
+ # rubocop:enable RSpec/ExampleLength
207
211
 
212
+ # rubocop:disable RSpec/ExampleLength
208
213
  it "passes deprecated options to ts_headline" do
209
214
  query = "query"
210
215
  columns = [
@@ -223,7 +228,7 @@ describe PgSearch::Features::TSearch do
223
228
  }
224
229
  }
225
230
 
226
- config = double(:config, ignore: [])
231
+ config = instance_double("PgSearch::Configuration", :config, ignore: [])
227
232
  normalizer = PgSearch::Normalizer.new(config)
228
233
 
229
234
  feature = described_class.new(query, options, columns, Model, normalizer)
@@ -233,6 +238,7 @@ describe PgSearch::Features::TSearch do
233
238
 
234
239
  expect(highlight_sql).to eq(expected_sql)
235
240
  end
241
+ # rubocop:enable RSpec/ExampleLength
236
242
  end
237
243
  end
238
244
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ # rubocop:disable RSpec/NestedGroups
5
6
  describe PgSearch::Multisearch::Rebuilder do
6
7
  with_table "pg_search_documents", &DOCUMENTS_SCHEMA
7
8
 
@@ -10,7 +11,7 @@ describe PgSearch::Multisearch::Rebuilder do
10
11
 
11
12
  it 'raises an exception' do
12
13
  expect {
13
- PgSearch::Multisearch::Rebuilder.new(NotMultisearchable)
14
+ described_class.new(NotMultisearchable)
14
15
  }.to raise_exception(
15
16
  PgSearch::Multisearch::ModelNotMultisearchable,
16
17
  "NotMultisearchable is not multisearchable. See PgSearch::ClassMethods#multisearchable"
@@ -20,7 +21,7 @@ describe PgSearch::Multisearch::Rebuilder do
20
21
 
21
22
  describe "#rebuild" do
22
23
  context "when the model defines .rebuild_pg_search_documents" do
23
- context "and multisearchable is not conditional" do
24
+ context "when multisearchable is not conditional" do
24
25
  with_model :Model do
25
26
  model do
26
27
  include PgSearch::Model
@@ -31,14 +32,18 @@ describe PgSearch::Multisearch::Rebuilder do
31
32
  end
32
33
  end
33
34
 
34
- it "should call .rebuild_pg_search_documents" do
35
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
36
- expect(Model).to receive(:rebuild_pg_search_documents)
37
- rebuilder.rebuild
35
+ it "calls .rebuild_pg_search_documents" do
36
+ rebuilder = described_class.new(Model)
37
+
38
+ without_partial_double_verification do
39
+ allow(Model).to receive(:rebuild_pg_search_documents)
40
+ rebuilder.rebuild
41
+ expect(Model).to have_received(:rebuild_pg_search_documents)
42
+ end
38
43
  end
39
44
  end
40
45
 
41
- context "and multisearchable is conditional" do
46
+ context "when multisearchable is conditional" do
42
47
  %i[if unless].each do |conditional_key|
43
48
  context "via :#{conditional_key}" do
44
49
  with_model :Model do
@@ -55,10 +60,14 @@ describe PgSearch::Multisearch::Rebuilder do
55
60
  end
56
61
  end
57
62
 
58
- it "should call .rebuild_pg_search_documents" do
59
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
60
- expect(Model).to receive(:rebuild_pg_search_documents)
61
- rebuilder.rebuild
63
+ it "calls .rebuild_pg_search_documents" do
64
+ rebuilder = described_class.new(Model)
65
+
66
+ without_partial_double_verification do
67
+ allow(Model).to receive(:rebuild_pg_search_documents)
68
+ rebuilder.rebuild
69
+ expect(Model).to have_received(:rebuild_pg_search_documents)
70
+ end
62
71
  end
63
72
  end
64
73
  end
@@ -66,7 +75,7 @@ describe PgSearch::Multisearch::Rebuilder do
66
75
  end
67
76
 
68
77
  context "when the model does not define .rebuild_pg_search_documents" do
69
- context "and multisearchable is not conditional" do
78
+ context "when multisearchable is not conditional" do
70
79
  context "when :against only includes columns" do
71
80
  with_model :Model do
72
81
  table do |t|
@@ -79,8 +88,8 @@ describe PgSearch::Multisearch::Rebuilder do
79
88
  end
80
89
  end
81
90
 
82
- it "should not call :rebuild_pg_search_documents" do
83
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
91
+ it "does not call :rebuild_pg_search_documents" do
92
+ rebuilder = described_class.new(Model)
84
93
 
85
94
  # stub respond_to? to return false since should_not_receive defines the method
86
95
  original_respond_to = Model.method(:respond_to?)
@@ -92,24 +101,28 @@ describe PgSearch::Multisearch::Rebuilder do
92
101
  end
93
102
  end
94
103
 
95
- expect(Model).not_to receive(:rebuild_pg_search_documents)
96
- rebuilder.rebuild
104
+ without_partial_double_verification do
105
+ allow(Model).to receive(:rebuild_pg_search_documents)
106
+ rebuilder.rebuild
107
+ expect(Model).not_to have_received(:rebuild_pg_search_documents)
108
+ end
97
109
  end
98
110
 
99
- it "should execute the default SQL" do
111
+ # rubocop:disable RSpec/ExampleLength
112
+ it "executes the default SQL" do
100
113
  time = Time.utc(2001, 1, 1, 0, 0, 0)
101
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model, -> { time })
102
-
103
- expected_sql = <<-SQL.strip_heredoc
104
- INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
105
- SELECT 'Model' AS searchable_type,
106
- #{Model.quoted_table_name}.#{Model.primary_key} AS searchable_id,
107
- (
108
- coalesce(#{Model.quoted_table_name}."name"::text, '')
109
- ) AS content,
110
- '2001-01-01 00:00:00' AS created_at,
111
- '2001-01-01 00:00:00' AS updated_at
112
- FROM #{Model.quoted_table_name}
114
+ rebuilder = described_class.new(Model, -> { time })
115
+
116
+ expected_sql = <<~SQL.squish
117
+ INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
118
+ SELECT 'Model' AS searchable_type,
119
+ #{Model.quoted_table_name}.#{Model.primary_key} AS searchable_id,
120
+ (
121
+ coalesce(#{Model.quoted_table_name}."name"::text, '')
122
+ ) AS content,
123
+ '2001-01-01 00:00:00' AS created_at,
124
+ '2001-01-01 00:00:00' AS updated_at
125
+ FROM #{Model.quoted_table_name}
113
126
  SQL
114
127
 
115
128
  executed_sql = []
@@ -124,8 +137,9 @@ describe PgSearch::Multisearch::Rebuilder do
124
137
  expect(executed_sql.length).to eq(1)
125
138
  expect(executed_sql.first.strip).to eq(expected_sql.strip)
126
139
  end
140
+ # rubocop:enable RSpec/ExampleLength
127
141
 
128
- context "for a model with a camel case column" do
142
+ context "with a model with a camel case column" do
129
143
  with_model :ModelWithCamelCaseColumn do
130
144
  table do |t|
131
145
  t.string :camelName
@@ -139,12 +153,12 @@ describe PgSearch::Multisearch::Rebuilder do
139
153
 
140
154
  it "creates search document without PG error" do
141
155
  time = Time.utc(2001, 1, 1, 0, 0, 0)
142
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model, -> { time })
156
+ rebuilder = described_class.new(Model, -> { time })
143
157
  rebuilder.rebuild
144
158
  end
145
159
  end
146
160
 
147
- context "for a model with a non-standard primary key" do
161
+ context "with a model with a non-standard primary key" do
148
162
  with_model :ModelWithNonStandardPrimaryKey do
149
163
  table primary_key: :non_standard_primary_key do |t|
150
164
  t.string :name
@@ -156,20 +170,21 @@ describe PgSearch::Multisearch::Rebuilder do
156
170
  end
157
171
  end
158
172
 
173
+ # rubocop:disable RSpec/ExampleLength
159
174
  it "generates SQL with the correct primary key" do
160
175
  time = Time.utc(2001, 1, 1, 0, 0, 0)
161
- rebuilder = PgSearch::Multisearch::Rebuilder.new(ModelWithNonStandardPrimaryKey, -> { time })
162
-
163
- expected_sql = <<-SQL.strip_heredoc
164
- INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
165
- SELECT 'ModelWithNonStandardPrimaryKey' AS searchable_type,
166
- #{ModelWithNonStandardPrimaryKey.quoted_table_name}.non_standard_primary_key AS searchable_id,
167
- (
168
- coalesce(#{ModelWithNonStandardPrimaryKey.quoted_table_name}."name"::text, '')
169
- ) AS content,
170
- '2001-01-01 00:00:00' AS created_at,
171
- '2001-01-01 00:00:00' AS updated_at
172
- FROM #{ModelWithNonStandardPrimaryKey.quoted_table_name}
176
+ rebuilder = described_class.new(ModelWithNonStandardPrimaryKey, -> { time })
177
+
178
+ expected_sql = <<~SQL.squish
179
+ INSERT INTO "pg_search_documents" (searchable_type, searchable_id, content, created_at, updated_at)
180
+ SELECT 'ModelWithNonStandardPrimaryKey' AS searchable_type,
181
+ #{ModelWithNonStandardPrimaryKey.quoted_table_name}.non_standard_primary_key AS searchable_id,
182
+ (
183
+ coalesce(#{ModelWithNonStandardPrimaryKey.quoted_table_name}."name"::text, '')
184
+ ) AS content,
185
+ '2001-01-01 00:00:00' AS created_at,
186
+ '2001-01-01 00:00:00' AS updated_at
187
+ FROM #{ModelWithNonStandardPrimaryKey.quoted_table_name}
173
188
  SQL
174
189
 
175
190
  executed_sql = []
@@ -184,6 +199,7 @@ describe PgSearch::Multisearch::Rebuilder do
184
199
  expect(executed_sql.length).to eq(1)
185
200
  expect(executed_sql.first.strip).to eq(expected_sql.strip)
186
201
  end
202
+ # rubocop:enable RSpec/ExampleLength
187
203
  end
188
204
  end
189
205
 
@@ -202,10 +218,11 @@ describe PgSearch::Multisearch::Rebuilder do
202
218
  end
203
219
  end
204
220
 
221
+ # rubocop:disable RSpec/ExampleLength
205
222
  it "calls update_pg_search_document on each record" do
206
223
  record = Model.create!
207
224
 
208
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
225
+ rebuilder = described_class.new(Model)
209
226
 
210
227
  # stub respond_to? to return false since should_not_receive defines the method
211
228
  original_respond_to = Model.method(:respond_to?)
@@ -216,12 +233,18 @@ describe PgSearch::Multisearch::Rebuilder do
216
233
  original_respond_to.call(method_name, *args)
217
234
  end
218
235
  end
219
- expect(Model).not_to receive(:rebuild_pg_search_documents)
220
236
 
221
- rebuilder.rebuild
237
+ without_partial_double_verification do
238
+ allow(Model).to receive(:rebuild_pg_search_documents)
239
+
240
+ rebuilder.rebuild
241
+
242
+ expect(Model).not_to have_received(:rebuild_pg_search_documents)
243
+ end
222
244
 
223
245
  expect(record.pg_search_document).to be_present
224
246
  end
247
+ # rubocop:enable RSpec/ExampleLength
225
248
  end
226
249
 
227
250
  context "when only additional_attributes is set" do
@@ -243,7 +266,7 @@ describe PgSearch::Multisearch::Rebuilder do
243
266
 
244
267
  PgSearch::Document.delete_all
245
268
 
246
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
269
+ rebuilder = described_class.new(Model)
247
270
  rebuilder.rebuild
248
271
 
249
272
  expect(record_1.reload.pg_search_document.additional_attribute_column).to eq("Model::1")
@@ -252,7 +275,7 @@ describe PgSearch::Multisearch::Rebuilder do
252
275
  end
253
276
  end
254
277
 
255
- context "and multisearchable is conditional" do
278
+ context "when multisearchable is conditional" do
256
279
  context "via :if" do
257
280
  with_model :Model do
258
281
  table do |t|
@@ -265,11 +288,12 @@ describe PgSearch::Multisearch::Rebuilder do
265
288
  end
266
289
  end
267
290
 
291
+ # rubocop:disable RSpec/ExampleLength
268
292
  it "calls update_pg_search_document on each record" do
269
293
  record_1 = Model.create!(active: true)
270
294
  record_2 = Model.create!(active: false)
271
295
 
272
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
296
+ rebuilder = described_class.new(Model)
273
297
 
274
298
  # stub respond_to? to return false since should_not_receive defines the method
275
299
  original_respond_to = Model.method(:respond_to?)
@@ -280,13 +304,17 @@ describe PgSearch::Multisearch::Rebuilder do
280
304
  original_respond_to.call(method_name, *args)
281
305
  end
282
306
  end
283
- expect(Model).not_to receive(:rebuild_pg_search_documents)
284
307
 
285
- rebuilder.rebuild
308
+ without_partial_double_verification do
309
+ allow(Model).to receive(:rebuild_pg_search_documents)
310
+ rebuilder.rebuild
311
+ expect(Model).not_to have_received(:rebuild_pg_search_documents)
312
+ end
286
313
 
287
314
  expect(record_1.pg_search_document).to be_present
288
315
  expect(record_2.pg_search_document).not_to be_present
289
316
  end
317
+ # rubocop:enable RSpec/ExampleLength
290
318
  end
291
319
 
292
320
  context "via :unless" do
@@ -301,11 +329,12 @@ describe PgSearch::Multisearch::Rebuilder do
301
329
  end
302
330
  end
303
331
 
332
+ # rubocop:disable RSpec/ExampleLength
304
333
  it "calls update_pg_search_document on each record" do
305
334
  record_1 = Model.create!(inactive: true)
306
335
  record_2 = Model.create!(inactive: false)
307
336
 
308
- rebuilder = PgSearch::Multisearch::Rebuilder.new(Model)
337
+ rebuilder = described_class.new(Model)
309
338
 
310
339
  # stub respond_to? to return false since should_not_receive defines the method
311
340
  original_respond_to = Model.method(:respond_to?)
@@ -316,15 +345,20 @@ describe PgSearch::Multisearch::Rebuilder do
316
345
  original_respond_to.call(method_name, *args)
317
346
  end
318
347
  end
319
- expect(Model).not_to receive(:rebuild_pg_search_documents)
320
348
 
321
- rebuilder.rebuild
349
+ without_partial_double_verification do
350
+ allow(Model).to receive(:rebuild_pg_search_documents)
351
+ rebuilder.rebuild
352
+ expect(Model).not_to have_received(:rebuild_pg_search_documents)
353
+ end
322
354
 
323
355
  expect(record_1.pg_search_document).not_to be_present
324
356
  expect(record_2.pg_search_document).to be_present
325
357
  end
358
+ # rubocop:enable RSpec/ExampleLength
326
359
  end
327
360
  end
328
361
  end
329
362
  end
330
363
  end
364
+ # rubocop:enable RSpec/NestedGroups