Skip to content

Commit 0fba76a

Browse files
committed
Add predicate tests for lteq, lt, gteq, and gt
A regression was introduced in Rails 4.2/master (or Arel), where lteq and lt predicates accept numeric input only and blow up with string input. Rails 3.x, 4.0 and 4.1 handled string input fine.
1 parent c31616b commit 0fba76a

File tree

1 file changed

+101
-3
lines changed

1 file changed

+101
-3
lines changed

spec/ransack/predicate_spec.rb

Lines changed: 101 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ module Ransack
2222
describe 'eq' do
2323
it 'generates an equality condition for boolean true' do
2424
@s.awesome_eq = true
25-
field = "#{quote_table_name("people")}.#{
26-
quote_column_name("awesome")}"
25+
field = "#{quote_table_name("people")}.#{quote_column_name("awesome")}"
2726
expect(@s.result.to_sql).to match /#{field} = #{
2827
ActiveRecord::Base.connection.quoted_true}/
2928
end
@@ -41,8 +40,107 @@ module Ransack
4140
end
4241
end
4342

44-
describe 'cont' do
43+
describe 'lteq' do
44+
it 'generates a <= condition with an integer column' do
45+
val = 1000
46+
@s.salary_lteq = val
47+
field = "#{quote_table_name("people")}.#{quote_column_name("salary")}"
48+
expect(@s.result.to_sql).to match /#{field} <= #{val}/
49+
end
50+
51+
if ::ActiveRecord::VERSION::STRING < '4.2'.freeze
52+
it 'generates a <= condition with a string column' do
53+
54+
@s.email_lteq = val
55+
field = "#{quote_table_name("people")}.#{quote_column_name("email")}"
56+
expect(@s.result.to_sql).to match /#{field} <= '#{val}'/
57+
end
58+
else
59+
# FIXME Rails 4.2 should be able to handle strings like Rails < 4.2 does.
60+
it 'raises an error with a string column' do
61+
@s.email_lteq = '[email protected]'
62+
expect { @s.result.to_sql }.to raise_error
63+
end
64+
end
65+
66+
it 'does not generate a condition for nil' do
67+
@s.salary_lteq = nil
68+
expect(@s.result.to_sql).not_to match /WHERE/
69+
end
70+
end
71+
72+
describe 'lt' do
73+
it 'generates a < condition with an integer column' do
74+
val = 2000
75+
@s.salary_lt = val
76+
field = "#{quote_table_name("people")}.#{quote_column_name("salary")}"
77+
expect(@s.result.to_sql).to match /#{field} < #{val}/
78+
end
79+
80+
if ::ActiveRecord::VERSION::STRING < '4.2'.freeze
81+
it 'generates a < condition with a string column' do
82+
83+
@s.email_lt = val
84+
field = "#{quote_table_name("people")}.#{quote_column_name("email")}"
85+
expect(@s.result.to_sql).to match /#{field} < '#{val}'/
86+
end
87+
else
88+
# FIXME Rails 4.2 should be able to handle strings like Rails < 4.2 does.
89+
it 'raises an error with a string column' do
90+
@s.email_lteq = '[email protected]'
91+
expect { @s.result.to_sql }.to raise_error
92+
end
93+
end
94+
95+
it 'does not generate a condition for nil' do
96+
@s.salary_lt = nil
97+
expect(@s.result.to_sql).not_to match /WHERE/
98+
end
99+
end
45100

101+
describe 'gteq' do
102+
it 'generates a >= condition with an integer column' do
103+
val = 300
104+
@s.salary_gteq = val
105+
field = "#{quote_table_name("people")}.#{quote_column_name("salary")}"
106+
expect(@s.result.to_sql).to match /#{field} >= #{val}/
107+
end
108+
109+
it 'generates a >= condition with a string column' do
110+
111+
@s.email_gteq = val
112+
field = "#{quote_table_name("people")}.#{quote_column_name("email")}"
113+
expect(@s.result.to_sql).to match /#{field} >= '#{val}'/
114+
end
115+
116+
it 'does not generate a condition for nil' do
117+
@s.salary_gteq = nil
118+
expect(@s.result.to_sql).not_to match /WHERE/
119+
end
120+
end
121+
122+
describe 'gt' do
123+
it 'generates a > condition with an integer column' do
124+
val = 400
125+
@s.salary_gt = val
126+
field = "#{quote_table_name("people")}.#{quote_column_name("salary")}"
127+
expect(@s.result.to_sql).to match /#{field} > #{val}/
128+
end
129+
130+
it 'generates a > condition with a string column' do
131+
132+
@s.email_gt = val
133+
field = "#{quote_table_name("people")}.#{quote_column_name("email")}"
134+
expect(@s.result.to_sql).to match /#{field} > '#{val}'/
135+
end
136+
137+
it 'does not generate a condition for nil' do
138+
@s.salary_gt = nil
139+
expect(@s.result.to_sql).not_to match /WHERE/
140+
end
141+
end
142+
143+
describe 'cont' do
46144
it_has_behavior 'wildcard escaping', :name_cont,
47145
(if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
48146
/"people"."name" ILIKE '%\\%\\._\\\\%'/

0 commit comments

Comments
 (0)