ajax-datatables-rails 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +120 -0
  3. data/.rubocop.yml +3 -1
  4. data/Appraisals +7 -13
  5. data/CHANGELOG.md +23 -2
  6. data/README.md +51 -70
  7. data/ajax-datatables-rails.gemspec +11 -5
  8. data/doc/migrate.md +44 -0
  9. data/doc/webpack.md +4 -1
  10. data/gemfiles/{rails_5.2.3.gemfile → rails_5.2.4.gemfile} +1 -1
  11. data/gemfiles/{rails_6.0.1.gemfile → rails_6.0.3.gemfile} +1 -1
  12. data/gemfiles/{rails_5.0.7.gemfile → rails_6.1.0.gemfile} +3 -3
  13. data/lib/ajax-datatables-rails.rb +0 -16
  14. data/lib/ajax-datatables-rails/base.rb +38 -13
  15. data/lib/ajax-datatables-rails/datatable.rb +6 -0
  16. data/lib/ajax-datatables-rails/datatable/column.rb +59 -21
  17. data/lib/ajax-datatables-rails/datatable/column/date_filter.rb +1 -1
  18. data/lib/ajax-datatables-rails/datatable/column/search.rb +2 -2
  19. data/lib/ajax-datatables-rails/datatable/datatable.rb +17 -3
  20. data/lib/ajax-datatables-rails/datatable/simple_order.rb +7 -5
  21. data/lib/ajax-datatables-rails/error.rb +9 -0
  22. data/lib/ajax-datatables-rails/orm.rb +6 -0
  23. data/lib/ajax-datatables-rails/orm/active_record.rb +9 -10
  24. data/lib/ajax-datatables-rails/version.rb +1 -1
  25. data/spec/ajax-datatables-rails/base_spec.rb +77 -120
  26. data/spec/ajax-datatables-rails/datatable/column_spec.rb +30 -10
  27. data/spec/ajax-datatables-rails/datatable/datatable_spec.rb +61 -22
  28. data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +11 -9
  29. data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +352 -257
  30. data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +4 -4
  31. data/spec/install_oracle.sh +4 -4
  32. data/spec/spec_helper.rb +10 -19
  33. data/spec/support/datatables/complex_datatable.rb +29 -0
  34. data/spec/support/datatables/complex_datatable_array.rb +14 -0
  35. data/spec/support/{datatable_cond_date.rb → datatables/datatable_cond_date.rb} +0 -0
  36. data/spec/support/{datatable_cond_numeric.rb → datatables/datatable_cond_numeric.rb} +0 -0
  37. data/spec/support/{datatable_cond_proc.rb → datatables/datatable_cond_proc.rb} +0 -0
  38. data/spec/support/{datatable_cond_string.rb → datatables/datatable_cond_string.rb} +0 -0
  39. data/spec/support/datatables/datatable_cond_unknown.rb +5 -0
  40. data/spec/support/{datatable_order_nulls_last.rb → datatables/datatable_order_nulls_last.rb} +0 -0
  41. data/spec/support/{test_helpers.rb → helpers/params.rb} +8 -46
  42. data/spec/support/{test_models.rb → models/user.rb} +0 -0
  43. metadata +53 -49
  44. data/.travis.yml +0 -57
  45. data/gemfiles/rails_5.1.7.gemfile +0 -11
  46. data/lib/ajax-datatables-rails/configuration.rb +0 -10
  47. data/lib/generators/datatable/config_generator.rb +0 -19
  48. data/lib/generators/datatable/templates/ajax_datatables_rails_config.rb +0 -9
  49. data/spec/ajax-datatables-rails/configuration_spec.rb +0 -34
  50. data/spec/ajax-datatables-rails/extended_spec.rb +0 -19
@@ -2,7 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe AjaxDatatablesRails::Datatable::SimpleOrder do
4
4
 
5
- let(:datatable) { ComplexDatatable.new(sample_params).datatable }
5
+ let(:parent) { ComplexDatatable.new(sample_params) }
6
+ let(:datatable) { parent.datatable }
6
7
  let(:options) { ActiveSupport::HashWithIndifferentAccess.new({'column' => '1', 'dir' => 'desc'}) }
7
8
  let(:simple_order) { AjaxDatatablesRails::Datatable::SimpleOrder.new(datatable, options) }
8
9
 
@@ -13,25 +14,26 @@ describe AjaxDatatablesRails::Datatable::SimpleOrder do
13
14
  end
14
15
 
15
16
  describe 'option methods with nulls last' do
16
- describe 'using global option' do
17
- before { AjaxDatatablesRails.config.nulls_last = true }
18
- after { AjaxDatatablesRails.config.nulls_last = false }
17
+ describe 'using class option' do
18
+ before { parent.nulls_last = true }
19
+ after { parent.nulls_last = false }
19
20
 
20
21
  it 'sql query' do
21
22
  skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
22
23
 
23
24
  expect(simple_order.query('email')).to eq(
24
- "email DESC #{nulls_last_sql}"
25
+ "email DESC #{nulls_last_sql(parent)}"
25
26
  )
26
27
  end
27
28
  end
28
29
 
29
30
  describe 'using column option' do
30
- let(:sorted_datatable) { DatatableOrderNullsLast.new(sample_params).datatable }
31
+ let(:parent) { DatatableOrderNullsLast.new(sample_params) }
32
+ let(:sorted_datatable) { parent.datatable }
31
33
  let(:nulls_last_order) { AjaxDatatablesRails::Datatable::SimpleOrder.new(sorted_datatable, options) }
32
34
 
33
35
  context 'with postgres database adapter' do
34
- before { AjaxDatatablesRails.config.db_adapter = :pg }
36
+ before { parent.db_adapter = :pg }
35
37
 
36
38
  it 'sql query' do
37
39
  expect(nulls_last_order.query('email')).to eq('email DESC NULLS LAST')
@@ -39,7 +41,7 @@ describe AjaxDatatablesRails::Datatable::SimpleOrder do
39
41
  end
40
42
 
41
43
  context 'with sqlite database adapter' do
42
- before { AjaxDatatablesRails.config.db_adapter = :sqlite }
44
+ before { parent.db_adapter = :sqlite }
43
45
 
44
46
  it 'sql query' do
45
47
  expect(nulls_last_order.query('email')).to eq('email DESC IS NULL')
@@ -47,7 +49,7 @@ describe AjaxDatatablesRails::Datatable::SimpleOrder do
47
49
  end
48
50
 
49
51
  context 'with mysql database adapter' do
50
- before { AjaxDatatablesRails.config.db_adapter = :mysql }
52
+ before { parent.db_adapter = :mysql }
51
53
 
52
54
  it 'sql query' do
53
55
  expect(nulls_last_order.query('email')).to eq('email DESC IS NULL')
@@ -23,6 +23,29 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
23
23
  end
24
24
  end
25
25
 
26
+ describe '#build_conditions' do
27
+ before(:each) do
28
+ create(:user, username: 'johndoe', email: 'johndoe@example.com')
29
+ create(:user, username: 'msmith', email: 'mary.smith@example.com')
30
+ create(:user, username: 'hsmith', email: 'henry.smith@example.net')
31
+ end
32
+
33
+ context 'with column and global search' do
34
+ before(:each) do
35
+ datatable.params[:search] = { value: 'example.com', regex: 'false' }
36
+ datatable.params[:columns]['0'][:search][:value] = 'smith'
37
+ end
38
+
39
+ it 'return a filtered set of records' do
40
+ query = datatable.build_conditions
41
+ results = records.where(query).map(&:username)
42
+ expect(results).to include('msmith')
43
+ expect(results).not_to include('johndoe')
44
+ expect(results).not_to include('hsmith')
45
+ end
46
+ end
47
+ end
48
+
26
49
  describe '#build_conditions_for_datatable' do
27
50
  before(:each) do
28
51
  create(:user, username: 'johndoe', email: 'johndoe@example.com')
@@ -106,6 +129,23 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
106
129
  expect(results).not_to include('msmith')
107
130
  end
108
131
  end
132
+
133
+ # TODO: improve (or delete?) this test
134
+ context 'when column.search_query returns nil' do
135
+ let(:datatable) { DatatableCondUnknown.new(sample_params) }
136
+
137
+ before(:each) do
138
+ datatable.params[:search] = { value: 'john doe', regex: 'false' }
139
+ end
140
+
141
+ it 'does not raise error' do
142
+ allow_any_instance_of(AjaxDatatablesRails::Datatable::Column).to receive(:valid_search_condition?).and_return(true)
143
+
144
+ expect {
145
+ datatable.data.size
146
+ }.to_not raise_error
147
+ end
148
+ end
109
149
  end
110
150
  end
111
151
 
@@ -183,373 +223,428 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
183
223
  end
184
224
 
185
225
  describe 'filter conditions' do
186
- describe 'it can filter records with condition :date_range' do
187
- let(:datatable) { DatatableCondDate.new(sample_params) }
188
-
189
- before(:each) do
190
- create(:user, username: 'johndoe', email: 'johndoe@example.com', last_name: 'Doe', created_at: '01/01/2000')
191
- create(:user, username: 'msmith', email: 'mary.smith@example.com', last_name: 'Smith', created_at: '01/02/2000')
192
- end
193
-
194
- context 'when range is empty' do
195
- it 'should not filter records' do
196
- datatable.params[:columns]['5'][:search][:value] = '-'
197
- expect(datatable.data.size).to eq 2
198
- item = datatable.data.first
199
- expect(item[:last_name]).to eq 'Doe'
200
- end
201
- end
202
-
203
- context 'when start date is filled' do
204
- it 'should filter records created after this date' do
205
- datatable.params[:columns]['5'][:search][:value] = '31/12/1999-'
206
- expect(datatable.data.size).to eq 2
207
- end
208
- end
209
-
210
- context 'when end date is filled' do
211
- it 'should filter records created before this date' do
212
- datatable.params[:columns]['5'][:search][:value] = '-31/12/1999'
213
- expect(datatable.data.size).to eq 0
214
- end
215
- end
226
+ context 'date condition' do
227
+ describe 'it can filter records with condition :date_range' do
228
+ let(:datatable) { DatatableCondDate.new(sample_params) }
216
229
 
217
- context 'when both date are filled' do
218
- it 'should filter records created between the range' do
219
- datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
220
- expect(datatable.data.size).to eq 1
230
+ before(:each) do
231
+ create(:user, username: 'johndoe', email: 'johndoe@example.com', last_name: 'Doe', created_at: '01/01/2000')
232
+ create(:user, username: 'msmith', email: 'mary.smith@example.com', last_name: 'Smith', created_at: '01/02/2000')
221
233
  end
222
- end
223
234
 
224
- context 'when another filter is active' do
225
235
  context 'when range is empty' do
226
- it 'should filter records' do
227
- datatable.params[:columns]['0'][:search][:value] = 'doe'
236
+ it 'should not filter records' do
228
237
  datatable.params[:columns]['5'][:search][:value] = '-'
229
- expect(datatable.data.size).to eq 1
238
+ expect(datatable.data.size).to eq 2
230
239
  item = datatable.data.first
231
240
  expect(item[:last_name]).to eq 'Doe'
232
241
  end
233
242
  end
234
243
 
235
244
  context 'when start date is filled' do
236
- it 'should filter records' do
237
- datatable.params[:columns]['0'][:search][:value] = 'doe'
238
- datatable.params[:columns]['5'][:search][:value] = '01/12/1999-'
239
- expect(datatable.data.size).to eq 1
240
- item = datatable.data.first
241
- expect(item[:last_name]).to eq 'Doe'
245
+ it 'should filter records created after this date' do
246
+ datatable.params[:columns]['5'][:search][:value] = '31/12/1999-'
247
+ expect(datatable.data.size).to eq 2
242
248
  end
243
249
  end
244
250
 
245
251
  context 'when end date is filled' do
246
- it 'should filter records' do
247
- datatable.params[:columns]['0'][:search][:value] = 'doe'
248
- datatable.params[:columns]['5'][:search][:value] = '-15/01/2000'
249
- expect(datatable.data.size).to eq 1
250
- item = datatable.data.first
251
- expect(item[:last_name]).to eq 'Doe'
252
+ it 'should filter records created before this date' do
253
+ datatable.params[:columns]['5'][:search][:value] = '-31/12/1999'
254
+ expect(datatable.data.size).to eq 0
252
255
  end
253
256
  end
254
257
 
255
258
  context 'when both date are filled' do
256
- it 'should filter records' do
257
- datatable.params[:columns]['0'][:search][:value] = 'doe'
259
+ it 'should filter records created between the range' do
258
260
  datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
259
261
  expect(datatable.data.size).to eq 1
260
- item = datatable.data.first
261
- expect(item[:last_name]).to eq 'Doe'
262
262
  end
263
263
  end
264
- end
265
- end
266
264
 
267
- describe 'it can filter records with condition :start_with' do
268
- let(:datatable) { DatatableCondStartWith.new(sample_params) }
265
+ context 'when another filter is active' do
266
+ context 'when range is empty' do
267
+ it 'should filter records' do
268
+ datatable.params[:columns]['0'][:search][:value] = 'doe'
269
+ datatable.params[:columns]['5'][:search][:value] = '-'
270
+ expect(datatable.data.size).to eq 1
271
+ item = datatable.data.first
272
+ expect(item[:last_name]).to eq 'Doe'
273
+ end
274
+ end
269
275
 
270
- before(:each) do
271
- create(:user, first_name: 'John')
272
- create(:user, first_name: 'Mary')
273
- end
276
+ context 'when start date is filled' do
277
+ it 'should filter records' do
278
+ datatable.params[:columns]['0'][:search][:value] = 'doe'
279
+ datatable.params[:columns]['5'][:search][:value] = '01/12/1999-'
280
+ expect(datatable.data.size).to eq 1
281
+ item = datatable.data.first
282
+ expect(item[:last_name]).to eq 'Doe'
283
+ end
284
+ end
285
+
286
+ context 'when end date is filled' do
287
+ it 'should filter records' do
288
+ datatable.params[:columns]['0'][:search][:value] = 'doe'
289
+ datatable.params[:columns]['5'][:search][:value] = '-15/01/2000'
290
+ expect(datatable.data.size).to eq 1
291
+ item = datatable.data.first
292
+ expect(item[:last_name]).to eq 'Doe'
293
+ end
294
+ end
274
295
 
275
- it 'should filter records matching' do
276
- datatable.params[:columns]['2'][:search][:value] = 'Jo'
277
- expect(datatable.data.size).to eq 1
278
- item = datatable.data.first
279
- expect(item[:first_name]).to eq 'John'
296
+ context 'when both date are filled' do
297
+ it 'should filter records' do
298
+ datatable.params[:columns]['0'][:search][:value] = 'doe'
299
+ datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
300
+ expect(datatable.data.size).to eq 1
301
+ item = datatable.data.first
302
+ expect(item[:last_name]).to eq 'Doe'
303
+ end
304
+ end
305
+ end
280
306
  end
281
307
  end
282
308
 
283
- describe 'it can filter records with condition :end_with' do
284
- let(:datatable) { DatatableCondEndWith.new(sample_params) }
309
+ context 'numeric condition' do
310
+ describe 'it can filter records with condition :eq' do
311
+ let(:datatable) { DatatableCondEq.new(sample_params) }
285
312
 
286
- before(:each) do
287
- create(:user, last_name: 'JOHN')
288
- create(:user, last_name: 'MARY')
313
+ before(:each) do
314
+ create(:user, first_name: 'john', post_id: 1)
315
+ create(:user, first_name: 'mary', post_id: 2)
316
+ end
317
+
318
+ it 'should filter records matching' do
319
+ datatable.params[:columns]['4'][:search][:value] = 1
320
+ expect(datatable.data.size).to eq 1
321
+ item = datatable.data.first
322
+ expect(item[:first_name]).to eq 'john'
323
+ end
289
324
  end
290
325
 
291
- if ENV['DB_ADAPTER'] == 'oracle_enhanced'
292
- context 'when db_adapter is oracleenhanced' do
293
- it 'should filter records matching' do
294
- datatable.params[:columns]['3'][:search][:value] = 'RY'
295
- expect(datatable.data.size).to eq 1
296
- item = datatable.data.first
297
- expect(item[:last_name]).to eq 'MARY'
298
- end
326
+ describe 'it can filter records with condition :not_eq' do
327
+ let(:datatable) { DatatableCondNotEq.new(sample_params) }
328
+
329
+ before(:each) do
330
+ create(:user, first_name: 'john', post_id: 1)
331
+ create(:user, first_name: 'mary', post_id: 2)
299
332
  end
300
- else
333
+
301
334
  it 'should filter records matching' do
302
- datatable.params[:columns]['3'][:search][:value] = 'ry'
335
+ datatable.params[:columns]['4'][:search][:value] = 1
303
336
  expect(datatable.data.size).to eq 1
304
337
  item = datatable.data.first
305
- expect(item[:last_name]).to eq 'MARY'
338
+ expect(item[:first_name]).to eq 'mary'
306
339
  end
307
340
  end
308
- end
309
341
 
310
- describe 'it can filter records with condition :like' do
311
- let(:datatable) { DatatableCondLike.new(sample_params) }
342
+ describe 'it can filter records with condition :lt' do
343
+ let(:datatable) { DatatableCondLt.new(sample_params) }
312
344
 
313
- before(:each) do
314
- create(:user, email: 'john@foo.com')
315
- create(:user, email: 'mary@bar.com')
316
- end
345
+ before(:each) do
346
+ create(:user, first_name: 'john', post_id: 1)
347
+ create(:user, first_name: 'mary', post_id: 2)
348
+ end
317
349
 
318
- it 'should filter records matching' do
319
- datatable.params[:columns]['1'][:search][:value] = 'foo'
320
- expect(datatable.data.size).to eq 1
321
- item = datatable.data.first
322
- expect(item[:email]).to eq 'john@foo.com'
350
+ it 'should filter records matching' do
351
+ datatable.params[:columns]['4'][:search][:value] = 2
352
+ expect(datatable.data.size).to eq 1
353
+ item = datatable.data.first
354
+ expect(item[:first_name]).to eq 'john'
355
+ end
323
356
  end
324
- end
325
357
 
326
- describe 'it can filter records with condition :string_eq' do
327
- let(:datatable) { DatatableCondStringEq.new(sample_params) }
358
+ describe 'it can filter records with condition :gt' do
359
+ let(:datatable) { DatatableCondGt.new(sample_params) }
328
360
 
329
- before(:each) do
330
- create(:user, email: 'john@foo.com')
331
- create(:user, email: 'mary@bar.com')
332
- end
361
+ before(:each) do
362
+ create(:user, first_name: 'john', post_id: 1)
363
+ create(:user, first_name: 'mary', post_id: 2)
364
+ end
333
365
 
334
- it 'should filter records matching' do
335
- datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
336
- expect(datatable.data.size).to eq 1
337
- item = datatable.data.first
338
- expect(item[:email]).to eq 'john@foo.com'
366
+ it 'should filter records matching' do
367
+ datatable.params[:columns]['4'][:search][:value] = 1
368
+ expect(datatable.data.size).to eq 1
369
+ item = datatable.data.first
370
+ expect(item[:first_name]).to eq 'mary'
371
+ end
339
372
  end
340
- end
341
373
 
342
- describe 'it can filter records with condition :string_in' do
343
- let(:datatable) { DatatableCondStringIn.new(sample_params) }
374
+ describe 'it can filter records with condition :lteq' do
375
+ let(:datatable) { DatatableCondLteq.new(sample_params) }
344
376
 
345
- before(:each) do
346
- create(:user, email: 'john@foo.com')
347
- create(:user, email: 'mary@bar.com')
348
- create(:user, email: 'henry@baz.com')
349
- end
377
+ before(:each) do
378
+ create(:user, first_name: 'john', post_id: 1)
379
+ create(:user, first_name: 'mary', post_id: 2)
380
+ end
350
381
 
351
- it 'should filter records matching' do
352
- datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
353
- expect(datatable.data.size).to eq 1
354
- item = datatable.data.first
355
- expect(item[:email]).to eq 'john@foo.com'
382
+ it 'should filter records matching' do
383
+ datatable.params[:columns]['4'][:search][:value] = 2
384
+ expect(datatable.data.size).to eq 2
385
+ end
356
386
  end
357
387
 
358
- it 'should filter records matching with multiple' do
359
- datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry@baz.com'
360
- expect(datatable.data.size).to eq 2
361
- items = datatable.data.sort_by { |h| h[:email] }
362
- item_first = items.first
363
- item_last = items.last
364
- expect(item_first[:email]).to eq 'henry@baz.com'
365
- expect(item_last[:email]).to eq 'john@foo.com'
366
- end
388
+ describe 'it can filter records with condition :gteq' do
389
+ let(:datatable) { DatatableCondGteq.new(sample_params) }
367
390
 
368
- it 'should filter records matching with multiple contains not found' do
369
- datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry_not@baz.com'
370
- expect(datatable.data.size).to eq 1
371
- item = datatable.data.first
372
- expect(item[:email]).to eq 'john@foo.com'
391
+ before(:each) do
392
+ create(:user, first_name: 'john', post_id: 1)
393
+ create(:user, first_name: 'mary', post_id: 2)
394
+ end
395
+
396
+ it 'should filter records matching' do
397
+ datatable.params[:columns]['4'][:search][:value] = 1
398
+ expect(datatable.data.size).to eq 2
399
+ end
373
400
  end
374
- end
375
401
 
376
- describe 'it can filter records with condition :null_value' do
377
- let(:datatable) { DatatableCondNullValue.new(sample_params) }
402
+ describe 'it can filter records with condition :in' do
403
+ let(:datatable) { DatatableCondIn.new(sample_params) }
378
404
 
379
- before(:each) do
380
- create(:user, first_name: 'john', email: 'foo@bar.com')
381
- create(:user, first_name: 'mary', email: nil)
382
- end
405
+ before(:each) do
406
+ create(:user, first_name: 'john', post_id: 1)
407
+ create(:user, first_name: 'mary', post_id: 2)
408
+ end
383
409
 
384
- context 'when condition is NULL' do
385
410
  it 'should filter records matching' do
386
- datatable.params[:columns]['1'][:search][:value] = 'NULL'
411
+ datatable.params[:columns]['4'][:search][:value] = [1]
387
412
  expect(datatable.data.size).to eq 1
388
413
  item = datatable.data.first
389
- expect(item[:first_name]).to eq 'mary'
414
+ expect(item[:first_name]).to eq 'john'
390
415
  end
391
416
  end
392
417
 
393
- context 'when condition is !NULL' do
418
+ describe 'it can filter records with condition :in with regex' do
419
+ let(:datatable) { DatatableCondInWithRegex.new(sample_params) }
420
+
421
+ before(:each) do
422
+ create(:user, first_name: 'john', post_id: 1)
423
+ create(:user, first_name: 'mary', post_id: 2)
424
+ end
425
+
394
426
  it 'should filter records matching' do
395
- datatable.params[:columns]['1'][:search][:value] = '!NULL'
396
- expect(datatable.data.size).to eq 1
427
+ datatable.params[:columns]['4'][:search][:value] = '1|2'
428
+ datatable.params[:order]['0'] = { column: '4', dir: 'asc' }
429
+ expect(datatable.data.size).to eq 2
397
430
  item = datatable.data.first
398
431
  expect(item[:first_name]).to eq 'john'
399
432
  end
400
433
  end
401
- end
402
434
 
403
- describe 'it can filter records with condition :eq' do
404
- let(:datatable) { DatatableCondEq.new(sample_params) }
435
+ describe 'Integer overflows' do
436
+ let(:datatable) { DatatableCondEq.new(sample_params) }
437
+ let(:largest_postgresql_integer_value) { 2147483647 }
438
+ let(:smallest_postgresql_integer_value) { -2147483648 }
405
439
 
406
- before(:each) do
407
- create(:user, first_name: 'john', post_id: 1)
408
- create(:user, first_name: 'mary', post_id: 2)
409
- end
440
+ before(:each) do
441
+ create(:user, first_name: 'john', post_id: 1)
442
+ create(:user, first_name: 'mary', post_id: 2)
443
+ create(:user, first_name: 'phil', post_id: largest_postgresql_integer_value)
444
+ end
445
+
446
+ it 'Returns an empty result if input value is too large' do
447
+ datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value + 1
448
+ expect(datatable.data.size).to eq 0
449
+ end
450
+
451
+ it 'Returns an empty result if input value is too small' do
452
+ datatable.params[:columns]['4'][:search][:value] = smallest_postgresql_integer_value - 1
453
+ expect(datatable.data.size).to eq 0
454
+ end
410
455
 
411
- it 'should filter records matching' do
412
- datatable.params[:columns]['4'][:search][:value] = 1
413
- expect(datatable.data.size).to eq 1
414
- item = datatable.data.first
415
- expect(item[:first_name]).to eq 'john'
456
+ it 'returns the matching user' do
457
+ datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value
458
+ expect(datatable.data.size).to eq 1
459
+ end
416
460
  end
417
461
  end
418
462
 
419
- describe 'it can filter records with condition :not_eq' do
420
- let(:datatable) { DatatableCondNotEq.new(sample_params) }
463
+ context 'proc condition' do
464
+ describe 'it can filter records with lambda/proc condition' do
465
+ let(:datatable) { DatatableCondProc.new(sample_params) }
421
466
 
422
- before(:each) do
423
- create(:user, first_name: 'john', post_id: 1)
424
- create(:user, first_name: 'mary', post_id: 2)
425
- end
467
+ before(:each) do
468
+ create(:user, username: 'johndoe', email: 'johndoe@example.com')
469
+ create(:user, username: 'johndie', email: 'johndie@example.com')
470
+ create(:user, username: 'msmith', email: 'mary.smith@example.com')
471
+ end
426
472
 
427
- it 'should filter records matching' do
428
- datatable.params[:columns]['4'][:search][:value] = 1
429
- expect(datatable.data.size).to eq 1
430
- item = datatable.data.first
431
- expect(item[:first_name]).to eq 'mary'
473
+ it 'should filter records matching' do
474
+ datatable.params[:columns]['0'][:search][:value] = 'john'
475
+ expect(datatable.data.size).to eq 2
476
+ item = datatable.data.first
477
+ expect(item[:username]).to eq 'johndie'
478
+ end
432
479
  end
433
480
  end
434
481
 
435
- describe 'it can filter records with condition :lt' do
436
- let(:datatable) { DatatableCondLt.new(sample_params) }
482
+ context 'string condition' do
483
+ describe 'it can filter records with condition :start_with' do
484
+ let(:datatable) { DatatableCondStartWith.new(sample_params) }
437
485
 
438
- before(:each) do
439
- create(:user, first_name: 'john', post_id: 1)
440
- create(:user, first_name: 'mary', post_id: 2)
441
- end
486
+ before(:each) do
487
+ create(:user, first_name: 'John')
488
+ create(:user, first_name: 'Mary')
489
+ end
442
490
 
443
- it 'should filter records matching' do
444
- datatable.params[:columns]['4'][:search][:value] = 2
445
- expect(datatable.data.size).to eq 1
446
- item = datatable.data.first
447
- expect(item[:first_name]).to eq 'john'
491
+ it 'should filter records matching' do
492
+ datatable.params[:columns]['2'][:search][:value] = 'Jo'
493
+ expect(datatable.data.size).to eq 1
494
+ item = datatable.data.first
495
+ expect(item[:first_name]).to eq 'John'
496
+ end
448
497
  end
449
- end
450
498
 
451
- describe 'it can filter records with condition :gt' do
452
- let(:datatable) { DatatableCondGt.new(sample_params) }
499
+ describe 'it can filter records with condition :end_with' do
500
+ let(:datatable) { DatatableCondEndWith.new(sample_params) }
453
501
 
454
- before(:each) do
455
- create(:user, first_name: 'john', post_id: 1)
456
- create(:user, first_name: 'mary', post_id: 2)
457
- end
502
+ before(:each) do
503
+ create(:user, last_name: 'JOHN')
504
+ create(:user, last_name: 'MARY')
505
+ end
458
506
 
459
- it 'should filter records matching' do
460
- datatable.params[:columns]['4'][:search][:value] = 1
461
- expect(datatable.data.size).to eq 1
462
- item = datatable.data.first
463
- expect(item[:first_name]).to eq 'mary'
507
+ if ENV['DB_ADAPTER'] == 'oracle_enhanced'
508
+ context 'when db_adapter is oracleenhanced' do
509
+ it 'should filter records matching' do
510
+ datatable.params[:columns]['3'][:search][:value] = 'RY'
511
+ expect(datatable.data.size).to eq 1
512
+ item = datatable.data.first
513
+ expect(item[:last_name]).to eq 'MARY'
514
+ end
515
+ end
516
+ else
517
+ it 'should filter records matching' do
518
+ datatable.params[:columns]['3'][:search][:value] = 'ry'
519
+ expect(datatable.data.size).to eq 1
520
+ item = datatable.data.first
521
+ expect(item[:last_name]).to eq 'MARY'
522
+ end
523
+ end
464
524
  end
465
- end
466
525
 
467
- describe 'it can filter records with condition :lteq' do
468
- let(:datatable) { DatatableCondLteq.new(sample_params) }
526
+ describe 'it can filter records with condition :like' do
527
+ let(:datatable) { DatatableCondLike.new(sample_params) }
469
528
 
470
- before(:each) do
471
- create(:user, first_name: 'john', post_id: 1)
472
- create(:user, first_name: 'mary', post_id: 2)
473
- end
529
+ before(:each) do
530
+ create(:user, email: 'john@foo.com')
531
+ create(:user, email: 'mary@bar.com')
532
+ end
474
533
 
475
- it 'should filter records matching' do
476
- datatable.params[:columns]['4'][:search][:value] = 2
477
- expect(datatable.data.size).to eq 2
534
+ it 'should filter records matching' do
535
+ datatable.params[:columns]['1'][:search][:value] = 'foo'
536
+ expect(datatable.data.size).to eq 1
537
+ item = datatable.data.first
538
+ expect(item[:email]).to eq 'john@foo.com'
539
+ end
478
540
  end
479
- end
480
541
 
481
- describe 'it can filter records with condition :gteq' do
482
- let(:datatable) { DatatableCondGteq.new(sample_params) }
542
+ describe 'it can filter records with condition :string_eq' do
543
+ let(:datatable) { DatatableCondStringEq.new(sample_params) }
483
544
 
484
- before(:each) do
485
- create(:user, first_name: 'john', post_id: 1)
486
- create(:user, first_name: 'mary', post_id: 2)
487
- end
545
+ before(:each) do
546
+ create(:user, email: 'john@foo.com')
547
+ create(:user, email: 'mary@bar.com')
548
+ end
488
549
 
489
- it 'should filter records matching' do
490
- datatable.params[:columns]['4'][:search][:value] = 1
491
- expect(datatable.data.size).to eq 2
550
+ it 'should filter records matching' do
551
+ datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
552
+ expect(datatable.data.size).to eq 1
553
+ item = datatable.data.first
554
+ expect(item[:email]).to eq 'john@foo.com'
555
+ end
492
556
  end
493
- end
494
557
 
495
- describe 'it can filter records with condition :in' do
496
- let(:datatable) { DatatableCondIn.new(sample_params) }
558
+ describe 'it can filter records with condition :string_in' do
559
+ let(:datatable) { DatatableCondStringIn.new(sample_params) }
497
560
 
498
- before(:each) do
499
- create(:user, first_name: 'john', post_id: 1)
500
- create(:user, first_name: 'mary', post_id: 2)
501
- end
561
+ before(:each) do
562
+ create(:user, email: 'john@foo.com')
563
+ create(:user, email: 'mary@bar.com')
564
+ create(:user, email: 'henry@baz.com')
565
+ end
502
566
 
503
- it 'should filter records matching' do
504
- datatable.params[:columns]['4'][:search][:value] = [1]
505
- expect(datatable.data.size).to eq 1
506
- item = datatable.data.first
507
- expect(item[:first_name]).to eq 'john'
508
- end
509
- end
567
+ it 'should filter records matching' do
568
+ datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
569
+ expect(datatable.data.size).to eq 1
570
+ item = datatable.data.first
571
+ expect(item[:email]).to eq 'john@foo.com'
572
+ end
510
573
 
511
- describe 'it can filter records with condition :in with regex' do
512
- let(:datatable) { DatatableCondInWithRegex.new(sample_params) }
574
+ it 'should filter records matching with multiple' do
575
+ datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry@baz.com'
576
+ expect(datatable.data.size).to eq 2
577
+ items = datatable.data.sort_by { |h| h[:email] }
578
+ item_first = items.first
579
+ item_last = items.last
580
+ expect(item_first[:email]).to eq 'henry@baz.com'
581
+ expect(item_last[:email]).to eq 'john@foo.com'
582
+ end
513
583
 
514
- before(:each) do
515
- create(:user, first_name: 'john', post_id: 1)
516
- create(:user, first_name: 'mary', post_id: 2)
584
+ it 'should filter records matching with multiple contains not found' do
585
+ datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry_not@baz.com'
586
+ expect(datatable.data.size).to eq 1
587
+ item = datatable.data.first
588
+ expect(item[:email]).to eq 'john@foo.com'
589
+ end
517
590
  end
518
591
 
519
- it 'should filter records matching' do
520
- datatable.params[:columns]['4'][:search][:value] = '1|2'
521
- datatable.params[:order]['0'] = { column: '4', dir: 'asc' }
522
- expect(datatable.data.size).to eq 2
523
- item = datatable.data.first
524
- expect(item[:first_name]).to eq 'john'
592
+ describe 'it can filter records with condition :null_value' do
593
+ let(:datatable) { DatatableCondNullValue.new(sample_params) }
594
+
595
+ before(:each) do
596
+ create(:user, first_name: 'john', email: 'foo@bar.com')
597
+ create(:user, first_name: 'mary', email: nil)
598
+ end
599
+
600
+ context 'when condition is NULL' do
601
+ it 'should filter records matching' do
602
+ datatable.params[:columns]['1'][:search][:value] = 'NULL'
603
+ expect(datatable.data.size).to eq 1
604
+ item = datatable.data.first
605
+ expect(item[:first_name]).to eq 'mary'
606
+ end
607
+ end
608
+
609
+ context 'when condition is !NULL' do
610
+ it 'should filter records matching' do
611
+ datatable.params[:columns]['1'][:search][:value] = '!NULL'
612
+ expect(datatable.data.size).to eq 1
613
+ item = datatable.data.first
614
+ expect(item[:first_name]).to eq 'john'
615
+ end
616
+ end
525
617
  end
526
618
  end
527
619
 
528
- describe 'Integer overflows' do
529
- let(:datatable) { DatatableCondEq.new(sample_params) }
530
- let(:largest_postgresql_integer_value) { 2147483647 }
531
- let(:smallest_postgresql_integer_value) { -2147483648 }
620
+ context 'unknown condition' do
621
+ let(:datatable) { DatatableCondUnknown.new(sample_params) }
532
622
 
533
623
  before(:each) do
534
- create(:user, first_name: 'john', post_id: 1)
535
- create(:user, first_name: 'mary', post_id: 2)
536
- create(:user, first_name: 'phil', post_id: largest_postgresql_integer_value)
624
+ datatable.params[:search] = { value: 'john doe', regex: 'false' }
537
625
  end
538
626
 
539
- it 'Returns an empty result if input value is too large' do
540
- datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value + 1
541
- expect(datatable.data.size).to eq 0
627
+ it 'should raise error' do
628
+ expect {
629
+ datatable.data.size
630
+ }.to raise_error(AjaxDatatablesRails::Error::InvalidSearchCondition).with_message('foo')
542
631
  end
632
+ end
633
+ end
543
634
 
544
- it 'Returns an empty result if input value is too small' do
545
- datatable.params[:columns]['4'][:search][:value] = smallest_postgresql_integer_value - 1
546
- expect(datatable.data.size).to eq 0
547
- end
635
+ describe 'formatter option' do
636
+ let(:datatable) { DatatableWithFormater.new(sample_params) }
548
637
 
549
- it 'returns the matching user' do
550
- datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value
551
- expect(datatable.data.size).to eq 1
552
- end
638
+ before(:each) do
639
+ create(:user, username: 'johndoe', email: 'johndoe@example.com', last_name: 'DOE')
640
+ create(:user, username: 'msmith', email: 'mary.smith@example.com', last_name: 'SMITH')
641
+ datatable.params[:columns]['3'][:search][:value] = 'doe'
642
+ end
643
+
644
+ it 'can transform search value before asking the database' do
645
+ expect(datatable.data.size).to eq 1
646
+ item = datatable.data.first
647
+ expect(item[:last_name]).to eq 'DOE'
553
648
  end
554
649
  end
555
650
  end