ajax-datatables-rails 0.4.3 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +120 -0
- data/.rubocop.yml +17 -7
- data/Appraisals +15 -20
- data/CHANGELOG.md +54 -1
- data/Gemfile +0 -5
- data/Guardfile +16 -0
- data/README.md +238 -112
- data/Rakefile +1 -0
- data/ajax-datatables-rails.gemspec +24 -20
- data/bin/_guard-core +29 -0
- data/bin/appraisal +29 -0
- data/bin/bundle +114 -0
- data/bin/guard +29 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/doc/migrate.md +97 -0
- data/doc/webpack.md +7 -2
- data/gemfiles/{rails_5.2.0.gemfile → rails_5.2.4.gemfile} +3 -5
- data/gemfiles/{rails_5.0.7.gemfile → rails_6.0.3.gemfile} +4 -6
- data/gemfiles/{rails_5.1.6.gemfile → rails_6.1.0.gemfile} +4 -6
- data/lib/ajax-datatables-rails.rb +12 -1
- data/lib/ajax-datatables-rails/active_record.rb +7 -0
- data/lib/ajax-datatables-rails/base.rb +47 -46
- data/lib/ajax-datatables-rails/datatable.rb +6 -0
- data/lib/ajax-datatables-rails/datatable/column.rb +65 -20
- data/lib/ajax-datatables-rails/datatable/column/date_filter.rb +12 -21
- data/lib/ajax-datatables-rails/datatable/column/order.rb +1 -1
- data/lib/ajax-datatables-rails/datatable/column/search.rb +37 -22
- data/lib/ajax-datatables-rails/datatable/datatable.rb +16 -7
- data/lib/ajax-datatables-rails/datatable/simple_order.rb +23 -10
- data/lib/ajax-datatables-rails/datatable/simple_search.rb +2 -0
- data/lib/ajax-datatables-rails/error.rb +9 -0
- data/lib/ajax-datatables-rails/orm.rb +6 -0
- data/lib/ajax-datatables-rails/orm/active_record.rb +11 -12
- data/lib/ajax-datatables-rails/version.rb +13 -1
- data/lib/generators/rails/templates/datatable.rb +1 -1
- data/spec/ajax-datatables-rails/base_spec.rb +129 -93
- data/spec/ajax-datatables-rails/datatable/column_spec.rb +105 -37
- data/spec/ajax-datatables-rails/datatable/datatable_spec.rb +71 -31
- data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +36 -14
- data/spec/ajax-datatables-rails/datatable/simple_search_spec.rb +4 -2
- data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +315 -272
- data/spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb +9 -8
- data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +17 -14
- data/spec/factories/user.rb +3 -1
- data/spec/install_oracle.sh +9 -3
- data/spec/spec_helper.rb +33 -28
- data/spec/support/datatables/complex_datatable.rb +31 -0
- data/spec/support/datatables/complex_datatable_array.rb +16 -0
- data/spec/support/{datatable_cond_date.rb → datatables/datatable_cond_date.rb} +2 -0
- data/spec/support/{datatable_cond_numeric.rb → datatables/datatable_cond_numeric.rb} +3 -1
- data/spec/support/{datatable_cond_proc.rb → datatables/datatable_cond_proc.rb} +2 -0
- data/spec/support/{datatable_cond_string.rb → datatables/datatable_cond_string.rb} +9 -1
- data/spec/support/datatables/datatable_cond_unknown.rb +7 -0
- data/spec/support/{datatable_order_nulls_last.rb → datatables/datatable_order_nulls_last.rb} +2 -0
- data/spec/support/{test_helpers.rb → helpers/params.rb} +17 -42
- data/spec/support/{test_models.rb → models/user.rb} +2 -0
- data/spec/support/schema.rb +3 -1
- metadata +76 -75
- data/.travis.yml +0 -80
- data/gemfiles/rails_4.0.13.gemfile +0 -14
- data/gemfiles/rails_4.1.16.gemfile +0 -14
- data/gemfiles/rails_4.2.10.gemfile +0 -14
- data/lib/ajax-datatables-rails/config.rb +0 -31
- data/lib/ajax_datatables_rails.rb +0 -15
- data/lib/generators/datatable/config_generator.rb +0 -19
- data/lib/generators/datatable/templates/ajax_datatables_rails_config.rb +0 -12
- data/spec/ajax-datatables-rails/configuration_spec.rb +0 -43
- data/spec/ajax-datatables-rails/extended_spec.rb +0 -20
- data/spec/ajax-datatables-rails/orm/active_record_spec.rb +0 -25
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
|
-
describe AjaxDatatablesRails::Datatable::SimpleSearch do
|
5
|
+
RSpec.describe AjaxDatatablesRails::Datatable::SimpleSearch do
|
4
6
|
|
5
|
-
let(:options) { ActiveSupport::HashWithIndifferentAccess.new({'value' => 'search value', 'regex' => 'true'}) }
|
7
|
+
let(:options) { ActiveSupport::HashWithIndifferentAccess.new({ 'value' => 'search value', 'regex' => 'true' }) }
|
6
8
|
let(:simple_search) { AjaxDatatablesRails::Datatable::SimpleSearch.new(options) }
|
7
9
|
|
8
10
|
describe 'option methods' do
|
@@ -1,80 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
|
-
describe AjaxDatatablesRails::ORM::ActiveRecord do
|
5
|
+
RSpec.describe AjaxDatatablesRails::ORM::ActiveRecord do
|
4
6
|
|
5
|
-
let(:
|
6
|
-
let(:datatable) { ComplexDatatable.new(view) }
|
7
|
+
let(:datatable) { ComplexDatatable.new(sample_params) }
|
7
8
|
let(:records) { User.all }
|
8
9
|
|
9
10
|
describe '#filter_records' do
|
10
11
|
it 'requires a records collection as argument' do
|
11
|
-
expect { datatable.
|
12
|
+
expect { datatable.filter_records }.to raise_error(ArgumentError)
|
12
13
|
end
|
13
14
|
|
14
15
|
it 'performs a simple search first' do
|
15
16
|
datatable.params[:search] = { value: 'msmith' }
|
16
17
|
expect(datatable).to receive(:build_conditions_for_datatable)
|
17
|
-
datatable.
|
18
|
+
datatable.filter_records(records)
|
18
19
|
end
|
19
20
|
|
20
21
|
it 'performs a composite search second' do
|
21
22
|
datatable.params[:search] = { value: '' }
|
22
23
|
expect(datatable).to receive(:build_conditions_for_selected_columns)
|
23
|
-
datatable.
|
24
|
+
datatable.filter_records(records)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#build_conditions' do
|
29
|
+
before do
|
30
|
+
create(:user, username: 'johndoe', email: 'johndoe@example.com')
|
31
|
+
create(:user, username: 'msmith', email: 'mary.smith@example.com')
|
32
|
+
create(:user, username: 'hsmith', email: 'henry.smith@example.net')
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with column and global search' do
|
36
|
+
before do
|
37
|
+
datatable.params[:search] = { value: 'example.com', regex: 'false' }
|
38
|
+
datatable.params[:columns]['0'][:search][:value] = 'smith'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'return a filtered set of records' do
|
42
|
+
query = datatable.build_conditions
|
43
|
+
results = records.where(query).map(&:username)
|
44
|
+
expect(results).to include('msmith')
|
45
|
+
expect(results).not_to include('johndoe')
|
46
|
+
expect(results).not_to include('hsmith')
|
47
|
+
end
|
24
48
|
end
|
25
49
|
end
|
26
50
|
|
27
51
|
describe '#build_conditions_for_datatable' do
|
28
|
-
before
|
52
|
+
before do
|
29
53
|
create(:user, username: 'johndoe', email: 'johndoe@example.com')
|
30
54
|
create(:user, username: 'msmith', email: 'mary.smith@example.com')
|
31
55
|
end
|
32
56
|
|
33
57
|
it 'returns an Arel object' do
|
34
58
|
datatable.params[:search] = { value: 'msmith' }
|
35
|
-
result = datatable.
|
59
|
+
result = datatable.build_conditions_for_datatable
|
36
60
|
expect(result).to be_a(Arel::Nodes::Grouping)
|
37
61
|
end
|
38
62
|
|
39
63
|
context 'no search query' do
|
40
64
|
it 'returns empty query' do
|
41
65
|
datatable.params[:search] = { value: '' }
|
42
|
-
expect(datatable.
|
66
|
+
expect(datatable.build_conditions_for_datatable).to be_blank
|
43
67
|
end
|
44
68
|
end
|
45
69
|
|
46
70
|
context 'when none of columns are connected' do
|
47
|
-
before
|
71
|
+
before do
|
48
72
|
allow(datatable).to receive(:searchable_columns) { [] }
|
49
73
|
end
|
50
74
|
|
51
75
|
context 'when search value is a string' do
|
52
|
-
before
|
76
|
+
before do
|
53
77
|
datatable.params[:search] = { value: 'msmith' }
|
54
78
|
end
|
55
79
|
|
56
80
|
it 'returns empty query result' do
|
57
|
-
expect(datatable.
|
81
|
+
expect(datatable.build_conditions_for_datatable).to be_blank
|
58
82
|
end
|
59
83
|
|
60
84
|
it 'returns filtered results' do
|
61
|
-
query = datatable.
|
85
|
+
query = datatable.build_conditions_for_datatable
|
62
86
|
results = records.where(query).map(&:username)
|
63
87
|
expect(results).to eq ['johndoe', 'msmith']
|
64
88
|
end
|
65
89
|
end
|
66
90
|
|
67
91
|
context 'when search value is space-separated string' do
|
68
|
-
before
|
92
|
+
before do
|
69
93
|
datatable.params[:search] = { value: 'foo bar' }
|
70
94
|
end
|
71
95
|
|
72
96
|
it 'returns empty query result' do
|
73
|
-
expect(datatable.
|
97
|
+
expect(datatable.build_conditions_for_datatable).to be_blank
|
74
98
|
end
|
75
99
|
|
76
100
|
it 'returns filtered results' do
|
77
|
-
query = datatable.
|
101
|
+
query = datatable.build_conditions_for_datatable
|
78
102
|
results = records.where(query).map(&:username)
|
79
103
|
expect(results).to eq ['johndoe', 'msmith']
|
80
104
|
end
|
@@ -83,12 +107,12 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
83
107
|
|
84
108
|
context 'with search query' do
|
85
109
|
context 'when search value is a string' do
|
86
|
-
before
|
110
|
+
before do
|
87
111
|
datatable.params[:search] = { value: 'john', regex: 'false' }
|
88
112
|
end
|
89
113
|
|
90
114
|
it 'returns a filtering query' do
|
91
|
-
query = datatable.
|
115
|
+
query = datatable.build_conditions_for_datatable
|
92
116
|
results = records.where(query).map(&:username)
|
93
117
|
expect(results).to include('johndoe')
|
94
118
|
expect(results).not_to include('msmith')
|
@@ -96,22 +120,39 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
96
120
|
end
|
97
121
|
|
98
122
|
context 'when search value is space-separated string' do
|
99
|
-
before
|
123
|
+
before do
|
100
124
|
datatable.params[:search] = { value: 'john doe', regex: 'false' }
|
101
125
|
end
|
102
126
|
|
103
127
|
it 'returns a filtering query' do
|
104
|
-
query = datatable.
|
128
|
+
query = datatable.build_conditions_for_datatable
|
105
129
|
results = records.where(query).map(&:username)
|
106
130
|
expect(results).to eq ['johndoe']
|
107
131
|
expect(results).not_to include('msmith')
|
108
132
|
end
|
109
133
|
end
|
134
|
+
|
135
|
+
# TODO: improve (or delete?) this test
|
136
|
+
context 'when column.search_query returns nil' do
|
137
|
+
let(:datatable) { DatatableCondUnknown.new(sample_params) }
|
138
|
+
|
139
|
+
before do
|
140
|
+
datatable.params[:search] = { value: 'john doe', regex: 'false' }
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'does not raise error' do
|
144
|
+
allow_any_instance_of(AjaxDatatablesRails::Datatable::Column).to receive(:valid_search_condition?).and_return(true)
|
145
|
+
|
146
|
+
expect {
|
147
|
+
datatable.data.size
|
148
|
+
}.to_not raise_error
|
149
|
+
end
|
150
|
+
end
|
110
151
|
end
|
111
152
|
end
|
112
153
|
|
113
154
|
describe '#build_conditions_for_selected_columns' do
|
114
|
-
before
|
155
|
+
before do
|
115
156
|
create(:user, username: 'johndoe', email: 'johndoe@example.com')
|
116
157
|
create(:user, username: 'msmith', email: 'mary.smith@example.com')
|
117
158
|
end
|
@@ -123,14 +164,14 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
123
164
|
end
|
124
165
|
|
125
166
|
it 'returns an Arel object' do
|
126
|
-
result = datatable.
|
167
|
+
result = datatable.build_conditions_for_selected_columns
|
127
168
|
expect(result).to be_a(Arel::Nodes::And)
|
128
169
|
end
|
129
170
|
|
130
|
-
if
|
171
|
+
if ENV['DB_ADAPTER'] == 'postgresql'
|
131
172
|
context 'when db_adapter is postgresql' do
|
132
173
|
it 'can call #to_sql on returned object' do
|
133
|
-
result = datatable.
|
174
|
+
result = datatable.build_conditions_for_selected_columns
|
134
175
|
expect(result).to respond_to(:to_sql)
|
135
176
|
expect(result.to_sql).to eq(
|
136
177
|
"CAST(\"users\".\"username\" AS VARCHAR) ILIKE '%doe%' AND CAST(\"users\".\"email\" AS VARCHAR) ILIKE '%example%'"
|
@@ -139,10 +180,10 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
139
180
|
end
|
140
181
|
end
|
141
182
|
|
142
|
-
if
|
183
|
+
if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
143
184
|
context 'when db_adapter is oracle' do
|
144
185
|
it 'can call #to_sql on returned object' do
|
145
|
-
result = datatable.
|
186
|
+
result = datatable.build_conditions_for_selected_columns
|
146
187
|
expect(result).to respond_to(:to_sql)
|
147
188
|
expect(result.to_sql).to eq(
|
148
189
|
"CAST(\"USERS\".\"USERNAME\" AS VARCHAR2(4000)) LIKE '%doe%' AND CAST(\"USERS\".\"EMAIL\" AS VARCHAR2(4000)) LIKE '%example%'"
|
@@ -151,10 +192,10 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
151
192
|
end
|
152
193
|
end
|
153
194
|
|
154
|
-
if
|
195
|
+
if ENV['DB_ADAPTER'] == 'mysql2'
|
155
196
|
context 'when db_adapter is mysql2' do
|
156
197
|
it 'can call #to_sql on returned object' do
|
157
|
-
result = datatable.
|
198
|
+
result = datatable.build_conditions_for_selected_columns
|
158
199
|
expect(result).to respond_to(:to_sql)
|
159
200
|
expect(result.to_sql).to eq(
|
160
201
|
"CAST(`users`.`username` AS CHAR) LIKE '%doe%' AND CAST(`users`.`email` AS CHAR) LIKE '%example%'"
|
@@ -166,16 +207,16 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
166
207
|
|
167
208
|
it 'calls #build_conditions_for_selected_columns' do
|
168
209
|
expect(datatable).to receive(:build_conditions_for_selected_columns)
|
169
|
-
datatable.
|
210
|
+
datatable.build_conditions
|
170
211
|
end
|
171
212
|
|
172
213
|
context 'with search values in columns' do
|
173
|
-
before
|
214
|
+
before do
|
174
215
|
datatable.params[:columns]['0'][:search][:value] = 'doe'
|
175
216
|
end
|
176
217
|
|
177
218
|
it 'returns a filtered set of records' do
|
178
|
-
query = datatable.
|
219
|
+
query = datatable.build_conditions_for_selected_columns
|
179
220
|
results = records.where(query).map(&:username)
|
180
221
|
expect(results).to include('johndoe')
|
181
222
|
expect(results).not_to include('msmith')
|
@@ -183,68 +224,18 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
183
224
|
end
|
184
225
|
end
|
185
226
|
|
186
|
-
describe '#type_cast helper method' do
|
187
|
-
let(:view) { double('view', params: sample_params) }
|
188
|
-
let(:column) { ComplexDatatable.new(view).datatable.columns.first }
|
189
|
-
|
190
|
-
it 'returns VARCHAR if :db_adapter is :pg' do
|
191
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :pg }
|
192
|
-
expect(column.send(:type_cast)).to eq('VARCHAR')
|
193
|
-
end
|
194
|
-
|
195
|
-
it 'returns VARCHAR if :db_adapter is :postgre' do
|
196
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :postgre }
|
197
|
-
expect(column.send(:type_cast)).to eq('VARCHAR')
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'returns VARCHAR if :db_adapter is :postgresql' do
|
201
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :postgresql }
|
202
|
-
expect(column.send(:type_cast)).to eq('VARCHAR')
|
203
|
-
end
|
204
|
-
|
205
|
-
it 'returns VARCHAR if :db_adapter is :oracle' do
|
206
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :oracle }
|
207
|
-
expect(column.send(:type_cast)).to eq('VARCHAR2(4000)')
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'returns VARCHAR if :db_adapter is :oracleenhanced' do
|
211
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :oracleenhanced }
|
212
|
-
expect(column.send(:type_cast)).to eq('VARCHAR2(4000)')
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'returns CHAR if :db_adapter is :mysql2' do
|
216
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :mysql2 }
|
217
|
-
expect(column.send(:type_cast)).to eq('CHAR')
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'returns CHAR if :db_adapter is :mysql' do
|
221
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :mysql }
|
222
|
-
expect(column.send(:type_cast)).to eq('CHAR')
|
223
|
-
end
|
224
|
-
|
225
|
-
it 'returns TEXT if :db_adapter is :sqlite' do
|
226
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :sqlite }
|
227
|
-
expect(column.send(:type_cast)).to eq('TEXT')
|
228
|
-
end
|
229
|
-
|
230
|
-
it 'returns TEXT if :db_adapter is :sqlite3' do
|
231
|
-
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :sqlite3 }
|
232
|
-
expect(column.send(:type_cast)).to eq('TEXT')
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
227
|
describe 'filter conditions' do
|
237
|
-
|
228
|
+
context 'date condition' do
|
238
229
|
describe 'it can filter records with condition :date_range' do
|
239
|
-
let(:datatable) { DatatableCondDate.new(
|
230
|
+
let(:datatable) { DatatableCondDate.new(sample_params) }
|
240
231
|
|
241
|
-
before
|
232
|
+
before do
|
242
233
|
create(:user, username: 'johndoe', email: 'johndoe@example.com', last_name: 'Doe', created_at: '01/01/2000')
|
243
234
|
create(:user, username: 'msmith', email: 'mary.smith@example.com', last_name: 'Smith', created_at: '01/02/2000')
|
244
235
|
end
|
245
236
|
|
246
237
|
context 'when range is empty' do
|
247
|
-
it '
|
238
|
+
it 'does not filter records' do
|
248
239
|
datatable.params[:columns]['5'][:search][:value] = '-'
|
249
240
|
expect(datatable.data.size).to eq 2
|
250
241
|
item = datatable.data.first
|
@@ -253,21 +244,21 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
253
244
|
end
|
254
245
|
|
255
246
|
context 'when start date is filled' do
|
256
|
-
it '
|
247
|
+
it 'filters records created after this date' do
|
257
248
|
datatable.params[:columns]['5'][:search][:value] = '31/12/1999-'
|
258
249
|
expect(datatable.data.size).to eq 2
|
259
250
|
end
|
260
251
|
end
|
261
252
|
|
262
253
|
context 'when end date is filled' do
|
263
|
-
it '
|
254
|
+
it 'filters records created before this date' do
|
264
255
|
datatable.params[:columns]['5'][:search][:value] = '-31/12/1999'
|
265
256
|
expect(datatable.data.size).to eq 0
|
266
257
|
end
|
267
258
|
end
|
268
259
|
|
269
260
|
context 'when both date are filled' do
|
270
|
-
it '
|
261
|
+
it 'filters records created between the range' do
|
271
262
|
datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
|
272
263
|
expect(datatable.data.size).to eq 1
|
273
264
|
end
|
@@ -275,7 +266,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
275
266
|
|
276
267
|
context 'when another filter is active' do
|
277
268
|
context 'when range is empty' do
|
278
|
-
it '
|
269
|
+
it 'filters records' do
|
279
270
|
datatable.params[:columns]['0'][:search][:value] = 'doe'
|
280
271
|
datatable.params[:columns]['5'][:search][:value] = '-'
|
281
272
|
expect(datatable.data.size).to eq 1
|
@@ -285,7 +276,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
285
276
|
end
|
286
277
|
|
287
278
|
context 'when start date is filled' do
|
288
|
-
it '
|
279
|
+
it 'filters records' do
|
289
280
|
datatable.params[:columns]['0'][:search][:value] = 'doe'
|
290
281
|
datatable.params[:columns]['5'][:search][:value] = '01/12/1999-'
|
291
282
|
expect(datatable.data.size).to eq 1
|
@@ -295,7 +286,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
295
286
|
end
|
296
287
|
|
297
288
|
context 'when end date is filled' do
|
298
|
-
it '
|
289
|
+
it 'filters records' do
|
299
290
|
datatable.params[:columns]['0'][:search][:value] = 'doe'
|
300
291
|
datatable.params[:columns]['5'][:search][:value] = '-15/01/2000'
|
301
292
|
expect(datatable.data.size).to eq 1
|
@@ -305,7 +296,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
305
296
|
end
|
306
297
|
|
307
298
|
context 'when both date are filled' do
|
308
|
-
it '
|
299
|
+
it 'filters records' do
|
309
300
|
datatable.params[:columns]['0'][:search][:value] = 'doe'
|
310
301
|
datatable.params[:columns]['5'][:search][:value] = '01/12/1999-15/01/2000'
|
311
302
|
expect(datatable.data.size).to eq 1
|
@@ -317,258 +308,310 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
317
308
|
end
|
318
309
|
end
|
319
310
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
create(:user, first_name: 'John')
|
325
|
-
create(:user, first_name: 'Mary')
|
326
|
-
end
|
327
|
-
|
328
|
-
it 'should filter records matching' do
|
329
|
-
datatable.params[:columns]['2'][:search][:value] = 'Jo'
|
330
|
-
expect(datatable.data.size).to eq 1
|
331
|
-
item = datatable.data.first
|
332
|
-
expect(item[:first_name]).to eq 'John'
|
311
|
+
context 'numeric condition' do
|
312
|
+
before do
|
313
|
+
create(:user, first_name: 'john', post_id: 1)
|
314
|
+
create(:user, first_name: 'mary', post_id: 2)
|
333
315
|
end
|
334
|
-
end
|
335
316
|
|
336
|
-
|
337
|
-
|
317
|
+
describe 'it can filter records with condition :eq' do
|
318
|
+
let(:datatable) { DatatableCondEq.new(sample_params) }
|
338
319
|
|
339
|
-
|
340
|
-
|
341
|
-
create(:user, last_name: 'MARY')
|
342
|
-
end
|
343
|
-
|
344
|
-
if AjaxDatatablesRails.config.db_adapter == :oracleenhanced
|
345
|
-
context 'when db_adapter is oracleenhanced' do
|
346
|
-
it 'should filter records matching' do
|
347
|
-
datatable.params[:columns]['3'][:search][:value] = 'RY'
|
348
|
-
expect(datatable.data.size).to eq 1
|
349
|
-
item = datatable.data.first
|
350
|
-
expect(item[:last_name]).to eq 'MARY'
|
351
|
-
end
|
352
|
-
end
|
353
|
-
else
|
354
|
-
it 'should filter records matching' do
|
355
|
-
datatable.params[:columns]['3'][:search][:value] = 'ry'
|
320
|
+
it 'filters records matching' do
|
321
|
+
datatable.params[:columns]['4'][:search][:value] = 1
|
356
322
|
expect(datatable.data.size).to eq 1
|
357
323
|
item = datatable.data.first
|
358
|
-
expect(item[:
|
324
|
+
expect(item[:first_name]).to eq 'john'
|
359
325
|
end
|
360
326
|
end
|
361
|
-
end
|
362
327
|
|
363
|
-
|
364
|
-
|
328
|
+
describe 'it can filter records with condition :not_eq' do
|
329
|
+
let(:datatable) { DatatableCondNotEq.new(sample_params) }
|
365
330
|
|
366
|
-
|
367
|
-
|
368
|
-
|
331
|
+
it 'filters records matching' do
|
332
|
+
datatable.params[:columns]['4'][:search][:value] = 1
|
333
|
+
expect(datatable.data.size).to eq 1
|
334
|
+
item = datatable.data.first
|
335
|
+
expect(item[:first_name]).to eq 'mary'
|
336
|
+
end
|
369
337
|
end
|
370
338
|
|
371
|
-
|
372
|
-
datatable.
|
373
|
-
|
374
|
-
|
375
|
-
|
339
|
+
describe 'it can filter records with condition :lt' do
|
340
|
+
let(:datatable) { DatatableCondLt.new(sample_params) }
|
341
|
+
|
342
|
+
it 'filters records matching' do
|
343
|
+
datatable.params[:columns]['4'][:search][:value] = 2
|
344
|
+
expect(datatable.data.size).to eq 1
|
345
|
+
item = datatable.data.first
|
346
|
+
expect(item[:first_name]).to eq 'john'
|
347
|
+
end
|
376
348
|
end
|
377
|
-
end
|
378
349
|
|
379
|
-
|
380
|
-
|
350
|
+
describe 'it can filter records with condition :gt' do
|
351
|
+
let(:datatable) { DatatableCondGt.new(sample_params) }
|
381
352
|
|
382
|
-
|
383
|
-
|
384
|
-
|
353
|
+
it 'filters records matching' do
|
354
|
+
datatable.params[:columns]['4'][:search][:value] = 1
|
355
|
+
expect(datatable.data.size).to eq 1
|
356
|
+
item = datatable.data.first
|
357
|
+
expect(item[:first_name]).to eq 'mary'
|
358
|
+
end
|
385
359
|
end
|
386
360
|
|
387
|
-
|
388
|
-
datatable
|
389
|
-
|
390
|
-
|
391
|
-
|
361
|
+
describe 'it can filter records with condition :lteq' do
|
362
|
+
let(:datatable) { DatatableCondLteq.new(sample_params) }
|
363
|
+
|
364
|
+
it 'filters records matching' do
|
365
|
+
datatable.params[:columns]['4'][:search][:value] = 2
|
366
|
+
expect(datatable.data.size).to eq 2
|
367
|
+
end
|
392
368
|
end
|
393
|
-
end
|
394
369
|
|
395
|
-
|
396
|
-
|
370
|
+
describe 'it can filter records with condition :gteq' do
|
371
|
+
let(:datatable) { DatatableCondGteq.new(sample_params) }
|
397
372
|
|
398
|
-
|
399
|
-
|
400
|
-
|
373
|
+
it 'filters records matching' do
|
374
|
+
datatable.params[:columns]['4'][:search][:value] = 1
|
375
|
+
expect(datatable.data.size).to eq 2
|
376
|
+
end
|
401
377
|
end
|
402
378
|
|
403
|
-
|
404
|
-
|
405
|
-
|
379
|
+
describe 'it can filter records with condition :in' do
|
380
|
+
let(:datatable) { DatatableCondIn.new(sample_params) }
|
381
|
+
|
382
|
+
it 'filters records matching' do
|
383
|
+
datatable.params[:columns]['4'][:search][:value] = [1]
|
406
384
|
expect(datatable.data.size).to eq 1
|
407
385
|
item = datatable.data.first
|
408
|
-
expect(item[:first_name]).to eq '
|
386
|
+
expect(item[:first_name]).to eq 'john'
|
409
387
|
end
|
410
388
|
end
|
411
389
|
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
390
|
+
describe 'it can filter records with condition :in with regex' do
|
391
|
+
let(:datatable) { DatatableCondInWithRegex.new(sample_params) }
|
392
|
+
|
393
|
+
it 'filters records matching' do
|
394
|
+
datatable.params[:columns]['4'][:search][:value] = '1|2'
|
395
|
+
datatable.params[:order]['0'] = { column: '4', dir: 'asc' }
|
396
|
+
expect(datatable.data.size).to eq 2
|
416
397
|
item = datatable.data.first
|
417
398
|
expect(item[:first_name]).to eq 'john'
|
418
399
|
end
|
419
400
|
end
|
420
|
-
end
|
421
401
|
|
422
|
-
|
423
|
-
|
402
|
+
describe 'Integer overflows' do
|
403
|
+
let(:datatable) { DatatableCondEq.new(sample_params) }
|
404
|
+
let(:largest_postgresql_integer_value) { 2_147_483_647 }
|
405
|
+
let(:smallest_postgresql_integer_value) { -2_147_483_648 }
|
424
406
|
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
407
|
+
before do
|
408
|
+
create(:user, first_name: 'john', post_id: 1)
|
409
|
+
create(:user, first_name: 'mary', post_id: 2)
|
410
|
+
create(:user, first_name: 'phil', post_id: largest_postgresql_integer_value)
|
411
|
+
end
|
429
412
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
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
|
415
|
+
expect(datatable.data.size).to eq 0
|
416
|
+
end
|
417
|
+
|
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
|
420
|
+
expect(datatable.data.size).to eq 0
|
421
|
+
end
|
422
|
+
|
423
|
+
it 'returns the matching user' do
|
424
|
+
datatable.params[:columns]['4'][:search][:value] = largest_postgresql_integer_value
|
425
|
+
expect(datatable.data.size).to eq 1
|
426
|
+
end
|
435
427
|
end
|
436
428
|
end
|
437
429
|
|
438
|
-
|
439
|
-
|
430
|
+
context 'proc condition' do
|
431
|
+
describe 'it can filter records with lambda/proc condition' do
|
432
|
+
let(:datatable) { DatatableCondProc.new(sample_params) }
|
440
433
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
434
|
+
before do
|
435
|
+
create(:user, username: 'johndoe', email: 'johndoe@example.com')
|
436
|
+
create(:user, username: 'johndie', email: 'johndie@example.com')
|
437
|
+
create(:user, username: 'msmith', email: 'mary.smith@example.com')
|
438
|
+
end
|
445
439
|
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
440
|
+
it 'filters records matching' do
|
441
|
+
datatable.params[:columns]['0'][:search][:value] = 'john'
|
442
|
+
expect(datatable.data.size).to eq 2
|
443
|
+
item = datatable.data.first
|
444
|
+
expect(item[:username]).to eq 'johndie'
|
445
|
+
end
|
451
446
|
end
|
452
447
|
end
|
453
448
|
|
454
|
-
|
455
|
-
|
449
|
+
context 'string condition' do
|
450
|
+
describe 'it can filter records with condition :start_with' do
|
451
|
+
let(:datatable) { DatatableCondStartWith.new(sample_params) }
|
456
452
|
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
453
|
+
before do
|
454
|
+
create(:user, first_name: 'John')
|
455
|
+
create(:user, first_name: 'Mary')
|
456
|
+
end
|
461
457
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
458
|
+
it 'filters records matching' do
|
459
|
+
datatable.params[:columns]['2'][:search][:value] = 'Jo'
|
460
|
+
expect(datatable.data.size).to eq 1
|
461
|
+
item = datatable.data.first
|
462
|
+
expect(item[:first_name]).to eq 'John'
|
463
|
+
end
|
467
464
|
end
|
468
|
-
end
|
469
465
|
|
470
|
-
|
471
|
-
|
466
|
+
describe 'it can filter records with condition :end_with' do
|
467
|
+
let(:datatable) { DatatableCondEndWith.new(sample_params) }
|
472
468
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
469
|
+
before do
|
470
|
+
create(:user, last_name: 'JOHN')
|
471
|
+
create(:user, last_name: 'MARY')
|
472
|
+
end
|
477
473
|
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
474
|
+
if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
475
|
+
context 'when db_adapter is oracleenhanced' do
|
476
|
+
it 'filters records matching' do
|
477
|
+
datatable.params[:columns]['3'][:search][:value] = 'RY'
|
478
|
+
expect(datatable.data.size).to eq 1
|
479
|
+
item = datatable.data.first
|
480
|
+
expect(item[:last_name]).to eq 'MARY'
|
481
|
+
end
|
482
|
+
end
|
483
|
+
else
|
484
|
+
it 'filters records matching' do
|
485
|
+
datatable.params[:columns]['3'][:search][:value] = 'ry'
|
486
|
+
expect(datatable.data.size).to eq 1
|
487
|
+
item = datatable.data.first
|
488
|
+
expect(item[:last_name]).to eq 'MARY'
|
489
|
+
end
|
490
|
+
end
|
483
491
|
end
|
484
|
-
end
|
485
492
|
|
486
|
-
|
487
|
-
|
493
|
+
describe 'it can filter records with condition :like' do
|
494
|
+
let(:datatable) { DatatableCondLike.new(sample_params) }
|
488
495
|
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
496
|
+
before do
|
497
|
+
create(:user, email: 'john@foo.com')
|
498
|
+
create(:user, email: 'mary@bar.com')
|
499
|
+
end
|
493
500
|
|
494
|
-
|
495
|
-
|
496
|
-
|
501
|
+
it 'filters records matching' do
|
502
|
+
datatable.params[:columns]['1'][:search][:value] = 'foo'
|
503
|
+
expect(datatable.data.size).to eq 1
|
504
|
+
item = datatable.data.first
|
505
|
+
expect(item[:email]).to eq 'john@foo.com'
|
506
|
+
end
|
497
507
|
end
|
498
|
-
end
|
499
508
|
|
500
|
-
|
501
|
-
|
509
|
+
describe 'it can filter records with condition :string_eq' do
|
510
|
+
let(:datatable) { DatatableCondStringEq.new(sample_params) }
|
502
511
|
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
512
|
+
before do
|
513
|
+
create(:user, email: 'john@foo.com')
|
514
|
+
create(:user, email: 'mary@bar.com')
|
515
|
+
end
|
507
516
|
|
508
|
-
|
509
|
-
|
510
|
-
|
517
|
+
it 'filters records matching' do
|
518
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
|
519
|
+
expect(datatable.data.size).to eq 1
|
520
|
+
item = datatable.data.first
|
521
|
+
expect(item[:email]).to eq 'john@foo.com'
|
522
|
+
end
|
511
523
|
end
|
512
|
-
end
|
513
524
|
|
514
|
-
|
515
|
-
|
525
|
+
describe 'it can filter records with condition :string_in' do
|
526
|
+
let(:datatable) { DatatableCondStringIn.new(sample_params) }
|
516
527
|
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
528
|
+
before do
|
529
|
+
create(:user, email: 'john@foo.com')
|
530
|
+
create(:user, email: 'mary@bar.com')
|
531
|
+
create(:user, email: 'henry@baz.com')
|
532
|
+
end
|
521
533
|
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
end
|
534
|
+
it 'filters records matching' do
|
535
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
|
536
|
+
expect(datatable.data.size).to eq 1
|
537
|
+
item = datatable.data.first
|
538
|
+
expect(item[:email]).to eq 'john@foo.com'
|
539
|
+
end
|
529
540
|
|
530
|
-
|
531
|
-
|
541
|
+
it 'filters records matching with multiple' do
|
542
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry@baz.com'
|
543
|
+
expect(datatable.data.size).to eq 2
|
544
|
+
items = datatable.data.sort_by { |h| h[:email] }
|
545
|
+
item_first = items.first
|
546
|
+
item_last = items.last
|
547
|
+
expect(item_first[:email]).to eq 'henry@baz.com'
|
548
|
+
expect(item_last[:email]).to eq 'john@foo.com'
|
549
|
+
end
|
532
550
|
|
533
|
-
|
534
|
-
|
535
|
-
|
551
|
+
it 'filters records matching with multiple contains not found' do
|
552
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry_not@baz.com'
|
553
|
+
expect(datatable.data.size).to eq 1
|
554
|
+
item = datatable.data.first
|
555
|
+
expect(item[:email]).to eq 'john@foo.com'
|
556
|
+
end
|
536
557
|
end
|
537
558
|
|
538
|
-
|
539
|
-
datatable.
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
559
|
+
describe 'it can filter records with condition :null_value' do
|
560
|
+
let(:datatable) { DatatableCondNullValue.new(sample_params) }
|
561
|
+
|
562
|
+
before do
|
563
|
+
create(:user, first_name: 'john', email: 'foo@bar.com')
|
564
|
+
create(:user, first_name: 'mary', email: nil)
|
565
|
+
end
|
566
|
+
|
567
|
+
context 'when condition is NULL' do
|
568
|
+
it 'filters records matching' do
|
569
|
+
datatable.params[:columns]['1'][:search][:value] = 'NULL'
|
570
|
+
expect(datatable.data.size).to eq 1
|
571
|
+
item = datatable.data.first
|
572
|
+
expect(item[:first_name]).to eq 'mary'
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
context 'when condition is !NULL' do
|
577
|
+
it 'filters records matching' do
|
578
|
+
datatable.params[:columns]['1'][:search][:value] = '!NULL'
|
579
|
+
expect(datatable.data.size).to eq 1
|
580
|
+
item = datatable.data.first
|
581
|
+
expect(item[:first_name]).to eq 'john'
|
582
|
+
end
|
583
|
+
end
|
544
584
|
end
|
545
585
|
end
|
546
586
|
|
547
|
-
|
548
|
-
let(:datatable) {
|
549
|
-
let(:largest_postgresql_integer_value) { 2147483647 }
|
550
|
-
let(:smallest_postgresql_integer_value) { -2147483648 }
|
587
|
+
context 'unknown condition' do
|
588
|
+
let(:datatable) { DatatableCondUnknown.new(sample_params) }
|
551
589
|
|
552
|
-
before
|
553
|
-
|
554
|
-
create(:user, first_name: 'mary', post_id: 2)
|
555
|
-
create(:user, first_name: 'phil', post_id: largest_postgresql_integer_value)
|
590
|
+
before do
|
591
|
+
datatable.params[:search] = { value: 'john doe', regex: 'false' }
|
556
592
|
end
|
557
593
|
|
558
|
-
it '
|
559
|
-
|
560
|
-
|
594
|
+
it 'raises error' do
|
595
|
+
expect {
|
596
|
+
datatable.data.size
|
597
|
+
}.to raise_error(AjaxDatatablesRails::Error::InvalidSearchCondition).with_message('foo')
|
561
598
|
end
|
599
|
+
end
|
600
|
+
end
|
562
601
|
|
563
|
-
|
564
|
-
|
565
|
-
expect(datatable.data.size).to eq 0
|
566
|
-
end
|
602
|
+
describe 'formatter option' do
|
603
|
+
let(:datatable) { DatatableWithFormater.new(sample_params) }
|
567
604
|
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
605
|
+
before do
|
606
|
+
create(:user, username: 'johndoe', email: 'johndoe@example.com', last_name: 'DOE')
|
607
|
+
create(:user, username: 'msmith', email: 'mary.smith@example.com', last_name: 'SMITH')
|
608
|
+
datatable.params[:columns]['3'][:search][:value] = 'doe'
|
609
|
+
end
|
610
|
+
|
611
|
+
it 'can transform search value before asking the database' do
|
612
|
+
expect(datatable.data.size).to eq 1
|
613
|
+
item = datatable.data.first
|
614
|
+
expect(item[:last_name]).to eq 'DOE'
|
572
615
|
end
|
573
616
|
end
|
574
617
|
end
|