ajax-datatables-rails 1.2.0 → 1.3.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 (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