ajax-datatables-rails 1.3.1 → 1.5.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +5 -23
  3. data/.github/workflows/ci.yml +35 -17
  4. data/.gitignore +6 -3
  5. data/.rubocop.yml +1 -1
  6. data/Appraisals +18 -25
  7. data/CHANGELOG.md +22 -0
  8. data/Gemfile +3 -0
  9. data/README.md +2 -2
  10. data/ajax-datatables-rails.gemspec +5 -2
  11. data/appraisal.yml +131 -0
  12. data/bin/rackup +27 -0
  13. data/config.ru +7 -0
  14. data/gemfiles/rails_6.0.6.gemfile +37 -0
  15. data/gemfiles/rails_6.1.7.gemfile +37 -0
  16. data/gemfiles/rails_7.0.8.gemfile +37 -0
  17. data/gemfiles/rails_7.1.0.gemfile +32 -0
  18. data/lib/ajax-datatables-rails/base.rb +33 -4
  19. data/lib/ajax-datatables-rails/datatable/column/search.rb +2 -6
  20. data/lib/ajax-datatables-rails/datatable/column.rb +11 -9
  21. data/lib/ajax-datatables-rails/datatable/simple_order.rb +2 -2
  22. data/lib/ajax-datatables-rails/version.rb +2 -2
  23. data/spec/ajax-datatables-rails/base_spec.rb +2 -0
  24. data/spec/ajax-datatables-rails/datatable/column_spec.rb +10 -0
  25. data/spec/ajax-datatables-rails/datatable/datatable_spec.rb +2 -2
  26. data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +9 -1
  27. data/spec/ajax-datatables-rails/orm/active_record_count_records_spec.rb +42 -0
  28. data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +58 -26
  29. data/spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb +2 -2
  30. data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +2 -2
  31. data/spec/dummy/app/assets/config/manifest.js +0 -0
  32. data/spec/dummy/config/database.yml +25 -0
  33. data/spec/dummy/config/routes.rb +5 -0
  34. data/spec/dummy/config/storage.yml +3 -0
  35. data/spec/{support → dummy/db}/schema.rb +0 -3
  36. data/spec/dummy/log/.gitignore +1 -0
  37. data/spec/dummy/public/favicon.ico +0 -0
  38. data/spec/spec_helper.rb +20 -23
  39. data/spec/support/datatables/complex_datatable.rb +2 -0
  40. data/spec/support/datatables/datatable_custom_column.rb +17 -0
  41. data/spec/support/datatables/grouped_datatable_array.rb +8 -0
  42. data/spec/support/helpers/params.rb +9 -3
  43. data/spec/support/models/user.rb +3 -0
  44. metadata +66 -11
  45. data/gemfiles/rails_5.2.4.gemfile +0 -11
  46. data/gemfiles/rails_6.0.3.gemfile +0 -11
  47. data/gemfiles/rails_6.1.0.gemfile +0 -11
@@ -3,7 +3,27 @@
3
3
  module AjaxDatatablesRails
4
4
  class Base
5
5
 
6
- class_attribute :db_adapter, default: ::ActiveRecord::Base.connection.adapter_name.downcase.to_sym
6
+ class << self
7
+ def rails_52?
8
+ Rails.gem_version >= Gem::Version.new('5.2') && Rails.gem_version <= Gem::Version.new('6.0')
9
+ end
10
+
11
+ def rails_60?
12
+ Rails.gem_version >= Gem::Version.new('6.0') && Rails.gem_version <= Gem::Version.new('6.1')
13
+ end
14
+
15
+ def default_db_adapter
16
+ if rails_52?
17
+ ::ActiveRecord::Base.configurations.dig(Rails.env, 'adapter').downcase.to_sym
18
+ elsif rails_60?
19
+ ::ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).first.config['adapter'].downcase.to_sym
20
+ else
21
+ ::ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).first.adapter.downcase.to_sym
22
+ end
23
+ end
24
+ end
25
+
26
+ class_attribute :db_adapter, default: default_db_adapter
7
27
  class_attribute :nulls_last, default: false
8
28
 
9
29
  attr_reader :params, :options, :datatable
@@ -57,7 +77,7 @@ module AjaxDatatablesRails
57
77
  recordsTotal: records_total_count,
58
78
  recordsFiltered: records_filtered_count,
59
79
  data: sanitize_data(data),
60
- }.merge(additional_data)
80
+ }.merge(draw_id).merge(additional_data)
61
81
  end
62
82
 
63
83
  # User helper methods
@@ -117,17 +137,26 @@ module AjaxDatatablesRails
117
137
  end
118
138
 
119
139
  def records_total_count
120
- fetch_records.count(:all)
140
+ numeric_count fetch_records.count(:all)
121
141
  end
122
142
 
123
143
  def records_filtered_count
124
- filter_records(fetch_records).count(:all)
144
+ numeric_count filter_records(fetch_records).count(:all)
145
+ end
146
+
147
+ def numeric_count(count)
148
+ count.is_a?(Hash) ? count.values.size : count
125
149
  end
126
150
 
127
151
  def global_search_delimiter
128
152
  GLOBAL_SEARCH_DELIMITER
129
153
  end
130
154
 
155
+ # See: https://datatables.net/manual/server-side#Returned-data
156
+ def draw_id
157
+ params[:draw].present? ? { draw: params[:draw].to_i } : {}
158
+ end
159
+
131
160
  def raw_records_error_text
132
161
  <<-ERROR
133
162
 
@@ -88,15 +88,11 @@ module AjaxDatatablesRails
88
88
  end
89
89
 
90
90
  def raw_search(cond)
91
- if custom_field?
92
- ::Arel::Nodes::SqlLiteral.new(field).eq(formatted_value)
93
- else
94
- table[field].send(cond, formatted_value)
95
- end
91
+ table[field].send(cond, formatted_value) unless custom_field?
96
92
  end
97
93
 
98
94
  def text_search(value)
99
- casted_column.matches(value)
95
+ casted_column.matches(value) unless custom_field?
100
96
  end
101
97
 
102
98
  def empty_search
@@ -36,11 +36,11 @@ module AjaxDatatablesRails
36
36
  end
37
37
 
38
38
  def model
39
- @model ||= source.split('.').first.constantize
39
+ @model ||= custom_field? ? source : source.split('.').first.constantize
40
40
  end
41
41
 
42
42
  def field
43
- @field ||= source.split('.').last.to_sym
43
+ @field ||= custom_field? ? source : source.split('.').last.to_sym
44
44
  end
45
45
 
46
46
  def custom_field?
@@ -66,13 +66,15 @@ module AjaxDatatablesRails
66
66
  TYPE_CAST_SQLSERVER = 'VARCHAR(4000)'
67
67
 
68
68
  DB_ADAPTER_TYPE_CAST = {
69
- mysql: TYPE_CAST_MYSQL,
70
- mysql2: TYPE_CAST_MYSQL,
71
- sqlite: TYPE_CAST_SQLITE,
72
- sqlite3: TYPE_CAST_SQLITE,
73
- oracle: TYPE_CAST_ORACLE,
74
- oracleenhanced: TYPE_CAST_ORACLE,
75
- sqlserver: TYPE_CAST_SQLSERVER,
69
+ mysql: TYPE_CAST_MYSQL,
70
+ mysql2: TYPE_CAST_MYSQL,
71
+ trilogy: TYPE_CAST_MYSQL,
72
+ sqlite: TYPE_CAST_SQLITE,
73
+ sqlite3: TYPE_CAST_SQLITE,
74
+ oracle: TYPE_CAST_ORACLE,
75
+ oracleenhanced: TYPE_CAST_ORACLE,
76
+ oracle_enhanced: TYPE_CAST_ORACLE,
77
+ sqlserver: TYPE_CAST_SQLSERVER,
76
78
  }.freeze
77
79
 
78
80
  private_constant :TYPE_CAST_DEFAULT
@@ -45,9 +45,9 @@ module AjaxDatatablesRails
45
45
  return unless sort_nulls_last?
46
46
 
47
47
  case @adapter
48
- when :pg, :postgresql, :postgres, :oracle
48
+ when :pg, :postgresql, :postgres, :oracle, :postgis
49
49
  'NULLS LAST'
50
- when :mysql, :mysql2, :sqlite, :sqlite3
50
+ when :mysql, :mysql2, :trilogy, :sqlite, :sqlite3
51
51
  'IS NULL'
52
52
  else
53
53
  raise "unsupported database adapter: #{@adapter}"
@@ -8,8 +8,8 @@ module AjaxDatatablesRails
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 1
11
- MINOR = 3
12
- TINY = 1
11
+ MINOR = 5
12
+ TINY = 0
13
13
  PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -181,6 +181,7 @@ RSpec.describe AjaxDatatablesRails::Base do
181
181
  data = datatable.as_json
182
182
  expect(data[:recordsTotal]).to eq 5
183
183
  expect(data[:recordsFiltered]).to eq 5
184
+ expect(data[:draw]).to eq 1
184
185
  expect(data[:data]).to be_a(Array)
185
186
  expect(data[:data].size).to eq 5
186
187
  end
@@ -192,6 +193,7 @@ RSpec.describe AjaxDatatablesRails::Base do
192
193
  data = datatable.as_json
193
194
  expect(data[:recordsTotal]).to eq 5
194
195
  expect(data[:recordsFiltered]).to eq 5
196
+ expect(data[:draw]).to eq 1
195
197
  expect(data[:data]).to be_a(Array)
196
198
  expect(data[:data].size).to eq 5
197
199
  expect(data[:foo]).to eq 'bar'
@@ -168,6 +168,11 @@ RSpec.describe AjaxDatatablesRails::Datatable::Column do
168
168
  expect(column.send(:type_cast)).to eq('VARCHAR')
169
169
  end
170
170
 
171
+ it 'returns VARCHAR if :db_adapter is :postgis' do
172
+ expect(datatable).to receive(:db_adapter) { :postgis }
173
+ expect(column.send(:type_cast)).to eq('VARCHAR')
174
+ end
175
+
171
176
  it 'returns VARCHAR2(4000) if :db_adapter is :oracle' do
172
177
  expect(datatable).to receive(:db_adapter) { :oracle }
173
178
  expect(column.send(:type_cast)).to eq('VARCHAR2(4000)')
@@ -183,6 +188,11 @@ RSpec.describe AjaxDatatablesRails::Datatable::Column do
183
188
  expect(column.send(:type_cast)).to eq('CHAR')
184
189
  end
185
190
 
191
+ it 'returns CHAR if :db_adapter is :trilogy' do
192
+ expect(datatable).to receive(:db_adapter) { :trilogy }
193
+ expect(column.send(:type_cast)).to eq('CHAR')
194
+ end
195
+
186
196
  it 'returns CHAR if :db_adapter is :mysql' do
187
197
  expect(datatable).to receive(:db_adapter) { :mysql }
188
198
  expect(column.send(:type_cast)).to eq('CHAR')
@@ -40,8 +40,8 @@ RSpec.describe AjaxDatatablesRails::Datatable::Datatable do
40
40
  end
41
41
 
42
42
  shared_examples 'columns methods' do
43
- it 'has 4 columns' do
44
- expect(datatable.columns.count).to eq(6)
43
+ it 'has 7 columns' do
44
+ expect(datatable.columns.count).to eq(7)
45
45
  end
46
46
 
47
47
  it 'child class' do
@@ -21,7 +21,7 @@ RSpec.describe AjaxDatatablesRails::Datatable::SimpleOrder do
21
21
  after { parent.nulls_last = false }
22
22
 
23
23
  it 'sql query' do
24
- skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
24
+ skip('unsupported database adapter') if RunningSpec.oracle?
25
25
 
26
26
  expect(simple_order.query('email')).to eq(
27
27
  "email DESC #{nulls_last_sql(parent)}"
@@ -42,6 +42,14 @@ RSpec.describe AjaxDatatablesRails::Datatable::SimpleOrder do
42
42
  end
43
43
  end
44
44
 
45
+ context 'with postgis database adapter' do
46
+ before { parent.db_adapter = :postgis }
47
+
48
+ it 'sql query' do
49
+ expect(nulls_last_order.query('email')).to eq('email DESC NULLS LAST')
50
+ end
51
+ end
52
+
45
53
  context 'with sqlite database adapter' do
46
54
  before { parent.db_adapter = :sqlite }
47
55
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
6
+
7
+ let(:datatable) { ComplexDatatable.new(sample_params) }
8
+ let(:records) { User.all }
9
+
10
+ describe '#records_total_count' do
11
+ context 'ungrouped results' do
12
+ it 'returns the count' do
13
+ expect(datatable.send(:records_total_count)).to eq records.count
14
+ end
15
+ end
16
+
17
+ context 'grouped results' do
18
+ let(:datatable) { GroupedDatatable.new(sample_params) }
19
+
20
+ it 'returns the count' do
21
+ expect(datatable.send(:records_total_count)).to eq records.count
22
+ end
23
+ end
24
+ end
25
+
26
+
27
+ describe '#records_filtered_count' do
28
+ context 'ungrouped results' do
29
+ it 'returns the count' do
30
+ expect(datatable.send(:records_filtered_count)).to eq records.count
31
+ end
32
+ end
33
+
34
+ context 'grouped results' do
35
+ let(:datatable) { GroupedDatatable.new(sample_params) }
36
+
37
+ it 'returns the count' do
38
+ expect(datatable.send(:records_filtered_count)).to eq records.count
39
+ end
40
+ end
41
+ end
42
+ end
@@ -168,7 +168,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
168
168
  expect(result).to be_a(Arel::Nodes::And)
169
169
  end
170
170
 
171
- if ENV['DB_ADAPTER'] == 'postgresql'
171
+ if RunningSpec.postgresql?
172
172
  context 'when db_adapter is postgresql' do
173
173
  it 'can call #to_sql on returned object' do
174
174
  result = datatable.build_conditions_for_selected_columns
@@ -180,7 +180,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
180
180
  end
181
181
  end
182
182
 
183
- if ENV['DB_ADAPTER'] == 'oracle_enhanced'
183
+ if RunningSpec.oracle?
184
184
  context 'when db_adapter is oracle' do
185
185
  it 'can call #to_sql on returned object' do
186
186
  result = datatable.build_conditions_for_selected_columns
@@ -192,7 +192,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
192
192
  end
193
193
  end
194
194
 
195
- if ENV['DB_ADAPTER'] == 'mysql2'
195
+ if RunningSpec.mysql?
196
196
  context 'when db_adapter is mysql2' do
197
197
  it 'can call #to_sql on returned object' do
198
198
  result = datatable.build_conditions_for_selected_columns
@@ -202,6 +202,16 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
202
202
  )
203
203
  end
204
204
  end
205
+
206
+ context 'when db_adapter is trilogy' do
207
+ it 'can call #to_sql on returned object' do
208
+ result = datatable.build_conditions_for_selected_columns
209
+ expect(result).to respond_to(:to_sql)
210
+ expect(result.to_sql).to eq(
211
+ "CAST(`users`.`username` AS CHAR) LIKE '%doe%' AND CAST(`users`.`email` AS CHAR) LIKE '%example%'"
212
+ )
213
+ end
214
+ end
205
215
  end
206
216
  end
207
217
 
@@ -236,7 +246,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
236
246
 
237
247
  context 'when range is empty' do
238
248
  it 'does not filter records' do
239
- datatable.params[:columns]['5'][:search][:value] = '-'
249
+ datatable.params[:columns]['6'][:search][:value] = '-'
240
250
  expect(datatable.data.size).to eq 2
241
251
  item = datatable.data.first
242
252
  expect(item[:last_name]).to eq 'Doe'
@@ -245,21 +255,21 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
245
255
 
246
256
  context 'when start date is filled' do
247
257
  it 'filters records created after this date' do
248
- datatable.params[:columns]['5'][:search][:value] = '31/12/1999-'
258
+ datatable.params[:columns]['6'][:search][:value] = '31/12/1999-'
249
259
  expect(datatable.data.size).to eq 2
250
260
  end
251
261
  end
252
262
 
253
263
  context 'when end date is filled' do
254
264
  it 'filters records created before this date' do
255
- datatable.params[:columns]['5'][:search][:value] = '-31/12/1999'
265
+ datatable.params[:columns]['6'][:search][:value] = '-31/12/1999'
256
266
  expect(datatable.data.size).to eq 0
257
267
  end
258
268
  end
259
269
 
260
270
  context 'when both date are filled' do
261
271
  it 'filters records created between the range' do
262
- datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
272
+ datatable.params[:columns]['6'][:search][:value] = '01/12/1999-15/01/2000'
263
273
  expect(datatable.data.size).to eq 1
264
274
  end
265
275
  end
@@ -268,7 +278,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
268
278
  context 'when range is empty' do
269
279
  it 'filters records' do
270
280
  datatable.params[:columns]['0'][:search][:value] = 'doe'
271
- datatable.params[:columns]['5'][:search][:value] = '-'
281
+ datatable.params[:columns]['6'][:search][:value] = '-'
272
282
  expect(datatable.data.size).to eq 1
273
283
  item = datatable.data.first
274
284
  expect(item[:last_name]).to eq 'Doe'
@@ -278,7 +288,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
278
288
  context 'when start date is filled' do
279
289
  it 'filters records' do
280
290
  datatable.params[:columns]['0'][:search][:value] = 'doe'
281
- datatable.params[:columns]['5'][:search][:value] = '01/12/1999-'
291
+ datatable.params[:columns]['6'][:search][:value] = '01/12/1999-'
282
292
  expect(datatable.data.size).to eq 1
283
293
  item = datatable.data.first
284
294
  expect(item[:last_name]).to eq 'Doe'
@@ -288,7 +298,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
288
298
  context 'when end date is filled' do
289
299
  it 'filters records' do
290
300
  datatable.params[:columns]['0'][:search][:value] = 'doe'
291
- datatable.params[:columns]['5'][:search][:value] = '-15/01/2000'
301
+ datatable.params[:columns]['6'][:search][:value] = '-15/01/2000'
292
302
  expect(datatable.data.size).to eq 1
293
303
  item = datatable.data.first
294
304
  expect(item[:last_name]).to eq 'Doe'
@@ -298,7 +308,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
298
308
  context 'when both date are filled' do
299
309
  it 'filters records' do
300
310
  datatable.params[:columns]['0'][:search][:value] = 'doe'
301
- datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
311
+ datatable.params[:columns]['6'][:search][:value] = '01/12/1999-15/01/2000'
302
312
  expect(datatable.data.size).to eq 1
303
313
  item = datatable.data.first
304
314
  expect(item[:last_name]).to eq 'Doe'
@@ -318,7 +328,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
318
328
  let(:datatable) { DatatableCondEq.new(sample_params) }
319
329
 
320
330
  it 'filters records matching' do
321
- datatable.params[:columns]['4'][:search][:value] = 1
331
+ datatable.params[:columns]['5'][:search][:value] = 1
322
332
  expect(datatable.data.size).to eq 1
323
333
  item = datatable.data.first
324
334
  expect(item[:first_name]).to eq 'john'
@@ -329,7 +339,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
329
339
  let(:datatable) { DatatableCondNotEq.new(sample_params) }
330
340
 
331
341
  it 'filters records matching' do
332
- datatable.params[:columns]['4'][:search][:value] = 1
342
+ datatable.params[:columns]['5'][:search][:value] = 1
333
343
  expect(datatable.data.size).to eq 1
334
344
  item = datatable.data.first
335
345
  expect(item[:first_name]).to eq 'mary'
@@ -340,7 +350,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
340
350
  let(:datatable) { DatatableCondLt.new(sample_params) }
341
351
 
342
352
  it 'filters records matching' do
343
- datatable.params[:columns]['4'][:search][:value] = 2
353
+ datatable.params[:columns]['5'][:search][:value] = 2
344
354
  expect(datatable.data.size).to eq 1
345
355
  item = datatable.data.first
346
356
  expect(item[:first_name]).to eq 'john'
@@ -351,7 +361,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
351
361
  let(:datatable) { DatatableCondGt.new(sample_params) }
352
362
 
353
363
  it 'filters records matching' do
354
- datatable.params[:columns]['4'][:search][:value] = 1
364
+ datatable.params[:columns]['5'][:search][:value] = 1
355
365
  expect(datatable.data.size).to eq 1
356
366
  item = datatable.data.first
357
367
  expect(item[:first_name]).to eq 'mary'
@@ -362,7 +372,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
362
372
  let(:datatable) { DatatableCondLteq.new(sample_params) }
363
373
 
364
374
  it 'filters records matching' do
365
- datatable.params[:columns]['4'][:search][:value] = 2
375
+ datatable.params[:columns]['5'][:search][:value] = 2
366
376
  expect(datatable.data.size).to eq 2
367
377
  end
368
378
  end
@@ -371,7 +381,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
371
381
  let(:datatable) { DatatableCondGteq.new(sample_params) }
372
382
 
373
383
  it 'filters records matching' do
374
- datatable.params[:columns]['4'][:search][:value] = 1
384
+ datatable.params[:columns]['5'][:search][:value] = 1
375
385
  expect(datatable.data.size).to eq 2
376
386
  end
377
387
  end
@@ -380,7 +390,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
380
390
  let(:datatable) { DatatableCondIn.new(sample_params) }
381
391
 
382
392
  it 'filters records matching' do
383
- datatable.params[:columns]['4'][:search][:value] = [1]
393
+ datatable.params[:columns]['5'][:search][:value] = [1]
384
394
  expect(datatable.data.size).to eq 1
385
395
  item = datatable.data.first
386
396
  expect(item[:first_name]).to eq 'john'
@@ -391,8 +401,8 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
391
401
  let(:datatable) { DatatableCondInWithRegex.new(sample_params) }
392
402
 
393
403
  it 'filters records matching' do
394
- datatable.params[:columns]['4'][:search][:value] = '1|2'
395
- datatable.params[:order]['0'] = { column: '4', dir: 'asc' }
404
+ datatable.params[:columns]['5'][:search][:value] = '1|2'
405
+ datatable.params[:order]['0'] = { column: '5', dir: 'asc' }
396
406
  expect(datatable.data.size).to eq 2
397
407
  item = datatable.data.first
398
408
  expect(item[:first_name]).to eq 'john'
@@ -410,18 +420,18 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
410
420
  create(:user, first_name: 'phil', post_id: largest_postgresql_integer_value)
411
421
  end
412
422
 
413
- it 'Returns an empty result if input value is too large' do
414
- datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value + 1
423
+ it 'returns an empty result if input value is too large' do
424
+ datatable.params[:columns]['5'][:search][:value] = largest_postgresql_integer_value + 1
415
425
  expect(datatable.data.size).to eq 0
416
426
  end
417
427
 
418
- it 'Returns an empty result if input value is too small' do
419
- datatable.params[:columns]['4'][:search][:value] = smallest_postgresql_integer_value - 1
428
+ it 'returns an empty result if input value is too small' do
429
+ datatable.params[:columns]['5'][:search][:value] = smallest_postgresql_integer_value - 1
420
430
  expect(datatable.data.size).to eq 0
421
431
  end
422
432
 
423
433
  it 'returns the matching user' do
424
- datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value
434
+ datatable.params[:columns]['5'][:search][:value] = largest_postgresql_integer_value
425
435
  expect(datatable.data.size).to eq 1
426
436
  end
427
437
  end
@@ -471,7 +481,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
471
481
  create(:user, last_name: 'MARY')
472
482
  end
473
483
 
474
- if ENV['DB_ADAPTER'] == 'oracle_enhanced'
484
+ if RunningSpec.oracle?
475
485
  context 'when db_adapter is oracleenhanced' do
476
486
  it 'filters records matching' do
477
487
  datatable.params[:columns]['3'][:search][:value] = 'RY'
@@ -597,6 +607,28 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
597
607
  }.to raise_error(AjaxDatatablesRails::Error::InvalidSearchCondition).with_message('foo')
598
608
  end
599
609
  end
610
+
611
+ context 'custom column' do
612
+ describe 'it can filter records with custom column' do
613
+ let(:datatable) { DatatableCustomColumn.new(sample_params) }
614
+
615
+ before do
616
+ create(:user, username: 'msmith', email: 'mary.smith@example.com', first_name: 'Mary', last_name: 'Smith')
617
+ create(:user, username: 'jsmith', email: 'john.smith@example.com', first_name: 'John', last_name: 'Smith')
618
+ create(:user, username: 'johndoe', email: 'johndoe@example.com', first_name: 'John', last_name: 'Doe')
619
+ end
620
+
621
+ it 'filters records' do
622
+ skip('unsupported database adapter') if RunningSpec.oracle? || RunningSpec.sqlite?
623
+
624
+ datatable.params[:columns]['4'][:search][:value] = 'John'
625
+ datatable.params[:order]['0'][:column] = '4'
626
+ expect(datatable.data.size).to eq 2
627
+ item = datatable.data.first
628
+ expect(item[:full_name]).to eq 'John Doe'
629
+ end
630
+ end
631
+ end
600
632
  end
601
633
 
602
634
  describe 'formatter option' do
@@ -18,7 +18,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
18
18
  end
19
19
 
20
20
  it 'paginates records properly' do
21
- if ENV['DB_ADAPTER'] == 'oracle_enhanced'
21
+ if RunningSpec.oracle?
22
22
  if Rails.version.in? %w[4.2.11]
23
23
  expect(datatable.paginate_records(records).to_sql).to include(
24
24
  'rownum <= 10'
@@ -36,7 +36,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
36
36
 
37
37
  datatable.params[:start] = '26'
38
38
  datatable.params[:length] = '25'
39
- if ENV['DB_ADAPTER'] == 'oracle_enhanced'
39
+ if RunningSpec.oracle?
40
40
  if Rails.version.in? %w[4.2.11]
41
41
  expect(datatable.paginate_records(records).to_sql).to include(
42
42
  'rownum <= 51'
@@ -51,7 +51,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
51
51
  after { datatable.nulls_last = false }
52
52
 
53
53
  it 'can handle multiple sorting columns' do
54
- skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
54
+ skip('unsupported database adapter') if RunningSpec.oracle?
55
55
 
56
56
  # set to order by Users username in ascending order, and
57
57
  # by Users email in descending order
@@ -65,7 +65,7 @@ RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
65
65
 
66
66
  describe '#sort_records with nulls last using column config' do
67
67
  it 'can handle multiple sorting columns' do
68
- skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
68
+ skip('unsupported database adapter') if RunningSpec.oracle?
69
69
 
70
70
  # set to order by Users username in ascending order, and
71
71
  # by Users email in descending order
File without changes
@@ -0,0 +1,25 @@
1
+ <% adapter = ENV.fetch('DB_ADAPTER', 'postgresql') %>
2
+ test:
3
+ adapter: <%= adapter %>
4
+ database: ajax_datatables_rails
5
+ encoding: utf8
6
+
7
+ <% if adapter == 'postgresql' || adapter == 'postgis' %>
8
+ host: '127.0.0.1'
9
+ port: 5432
10
+ username: 'postgres'
11
+ password: 'postgres'
12
+ <% elsif adapter == 'mysql2' || adapter == 'trilogy' %>
13
+ host: '127.0.0.1'
14
+ port: 3306
15
+ username: 'root'
16
+ password: 'root'
17
+ <% elsif adapter == 'oracle_enhanced' %>
18
+ host: '127.0.0.1/xe'
19
+ username: <%= ENV.fetch('USER') %>
20
+ password: <%= ENV.fetch('USER') %>
21
+ database: 'xe'
22
+ <% elsif adapter == 'sqlite3' %>
23
+ # database: ':memory:'
24
+ database: db/ajax_datatables_rails.sqlite3
25
+ <% end %>
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ # Add your own routes here, or remove this file if you don't have need for it.
5
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ service: Disk
3
+ root: /tmp/ajax-datatables-rails/tmp/storage
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  ActiveRecord::Schema.define do
4
- self.verbose = false
5
-
6
4
  create_table :users, force: true do |t|
7
5
  t.string :username
8
6
  t.string :email
@@ -12,5 +10,4 @@ ActiveRecord::Schema.define do
12
10
 
13
11
  t.timestamps null: false
14
12
  end
15
-
16
13
  end
@@ -0,0 +1 @@
1
+ *.log
File without changes