Skip to content

Commit fb9fd4d

Browse files
committed
Raise error on unknown view column 'cond:' params
1 parent 2bfe295 commit fb9fd4d

File tree

7 files changed

+56
-2
lines changed

7 files changed

+56
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* Improve specs
1111
* `AjaxDatatablesRails.config.db_adapter=` is removed and is configured per datatable class now. It defaults to Rails DB adapter. (fixes [#364](https://github.com/jbox-web/ajax-datatables-rails/issues/364))
1212
* Fix lib loading with JRuby (fixes [#371](https://github.com/jbox-web/ajax-datatables-rails/issues/371))
13+
* Raise an error when column's `cond:` setting is unknown
1314

1415
## 1.2.0 (2020-04-19)
1516

lib/ajax-datatables-rails/datatable/column.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def initialize(datatable, index, options)
1616
@index = index
1717
@options = options
1818
@view_column = datatable.view_columns[options[:data].to_sym]
19+
validate_settings!
1920
end
2021

2122
def data
@@ -85,6 +86,27 @@ def casted_column
8586
@casted_column ||= ::Arel::Nodes::NamedFunction.new('CAST', [table[field].as(type_cast)])
8687
end
8788

89+
def validate_settings!
90+
raise AjaxDatatablesRails::Error::InvalidSearchCondition, cond unless valid_search_condition?(cond)
91+
end
92+
93+
VALID_SEARCH_CONDITIONS = [
94+
# String condition
95+
:start_with, :end_with, :like, :string_eq, :string_in, :null_value,
96+
# Numeric condition
97+
:eq, :not_eq, :lt, :gt, :lteq, :gteq, :in,
98+
# Date condition
99+
:date_range
100+
]
101+
102+
private_constant :VALID_SEARCH_CONDITIONS
103+
104+
def valid_search_condition?(cond)
105+
return true if cond.is_a?(Proc)
106+
107+
VALID_SEARCH_CONDITIONS.include?(cond)
108+
end
109+
88110
end
89111
end
90112
end

lib/ajax-datatables-rails/datatable/column/search.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ def non_regex_search
6161
filter
6262
when :eq, :not_eq, :lt, :gt, :lteq, :gteq, :in
6363
searchable_integer? ? raw_search(cond) : empty_search
64-
when :null_value
65-
null_value_search
6664
when :start_with
6765
casted_column.matches("#{formatted_value}%")
6866
when :end_with
@@ -73,6 +71,8 @@ def non_regex_search
7371
raw_search(:eq)
7472
when :string_in
7573
raw_search(:in)
74+
when :null_value
75+
null_value_search
7676
when :date_range
7777
date_range_search
7878
end

lib/ajax-datatables-rails/error.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# frozen_string_literal: true
2+
3+
module AjaxDatatablesRails
4+
module Error
5+
class BaseError < StandardError; end
6+
class InvalidSearchCondition < BaseError; end
7+
end
8+
end

spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
end
108108
end
109109

110+
# TODO: improve (or delete?) this test
110111
context 'when column.search_query returns nil' do
111112
let(:datatable) { DatatableCondUnknown.new(sample_params) }
112113

@@ -115,6 +116,8 @@
115116
end
116117

117118
it 'does not raise error' do
119+
allow_any_instance_of(AjaxDatatablesRails::Datatable::Column).to receive(:valid_search_condition?).and_return(true)
120+
118121
expect {
119122
datatable.data.size
120123
}.to_not raise_error
@@ -590,5 +593,19 @@
590593
end
591594
end
592595
end
596+
597+
context 'unknown condition' do
598+
let(:datatable) { DatatableCondUnknown.new(sample_params) }
599+
600+
before(:each) do
601+
datatable.params[:search] = { value: 'john doe', regex: 'false' }
602+
end
603+
604+
it 'should raise error' do
605+
expect {
606+
datatable.data.size
607+
}.to raise_error(AjaxDatatablesRails::Error::InvalidSearchCondition).with_message('foo')
608+
end
609+
end
593610
end
594611
end

spec/spec_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,6 @@
7878
load File.dirname(__FILE__) + '/support/datatable_cond_numeric.rb'
7979
load File.dirname(__FILE__) + '/support/datatable_cond_proc.rb'
8080
load File.dirname(__FILE__) + '/support/datatable_cond_string.rb'
81+
load File.dirname(__FILE__) + '/support/datatable_cond_unknown.rb'
8182
load File.dirname(__FILE__) + '/support/datatable_order_nulls_last.rb'
8283
require File.dirname(__FILE__) + '/support/test_models.rb'
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class DatatableCondUnknown < ComplexDatatable
2+
def view_columns
3+
super.deep_merge(username: { cond: :foo })
4+
end
5+
end

0 commit comments

Comments
 (0)