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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +5 -23
- data/.github/workflows/ci.yml +35 -17
- data/.gitignore +6 -3
- data/.rubocop.yml +1 -1
- data/Appraisals +18 -25
- data/CHANGELOG.md +22 -0
- data/Gemfile +3 -0
- data/README.md +2 -2
- data/ajax-datatables-rails.gemspec +5 -2
- data/appraisal.yml +131 -0
- data/bin/rackup +27 -0
- data/config.ru +7 -0
- data/gemfiles/rails_6.0.6.gemfile +37 -0
- data/gemfiles/rails_6.1.7.gemfile +37 -0
- data/gemfiles/rails_7.0.8.gemfile +37 -0
- data/gemfiles/rails_7.1.0.gemfile +32 -0
- data/lib/ajax-datatables-rails/base.rb +33 -4
- data/lib/ajax-datatables-rails/datatable/column/search.rb +2 -6
- data/lib/ajax-datatables-rails/datatable/column.rb +11 -9
- data/lib/ajax-datatables-rails/datatable/simple_order.rb +2 -2
- data/lib/ajax-datatables-rails/version.rb +2 -2
- data/spec/ajax-datatables-rails/base_spec.rb +2 -0
- data/spec/ajax-datatables-rails/datatable/column_spec.rb +10 -0
- data/spec/ajax-datatables-rails/datatable/datatable_spec.rb +2 -2
- data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +9 -1
- data/spec/ajax-datatables-rails/orm/active_record_count_records_spec.rb +42 -0
- data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +58 -26
- data/spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb +2 -2
- data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +2 -2
- data/spec/dummy/app/assets/config/manifest.js +0 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/routes.rb +5 -0
- data/spec/dummy/config/storage.yml +3 -0
- data/spec/{support → dummy/db}/schema.rb +0 -3
- data/spec/dummy/log/.gitignore +1 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/spec_helper.rb +20 -23
- data/spec/support/datatables/complex_datatable.rb +2 -0
- data/spec/support/datatables/datatable_custom_column.rb +17 -0
- data/spec/support/datatables/grouped_datatable_array.rb +8 -0
- data/spec/support/helpers/params.rb +9 -3
- data/spec/support/models/user.rb +3 -0
- metadata +66 -11
- data/gemfiles/rails_5.2.4.gemfile +0 -11
- data/gemfiles/rails_6.0.3.gemfile +0 -11
- data/gemfiles/rails_6.1.0.gemfile +0 -11
@@ -3,7 +3,27 @@
|
|
3
3
|
module AjaxDatatablesRails
|
4
4
|
class Base
|
5
5
|
|
6
|
-
|
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
|
-
|
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:
|
70
|
-
mysql2:
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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}"
|
@@ -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
|
44
|
-
expect(datatable.columns.count).to eq(
|
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
|
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
|
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
|
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
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
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]['
|
395
|
-
datatable.params[:order]['0'] = { column: '
|
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 '
|
414
|
-
datatable.params[:columns]['
|
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 '
|
419
|
-
datatable.params[:columns]['
|
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]['
|
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
|
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
|
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
|
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
|
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
|
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 %>
|
@@ -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
|