ajax-datatables-rails 0.4.3 → 1.3.1
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/.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
|