arel_extensions 1.5.3 → 2.0.0.rc3
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 +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +90 -239
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -48
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +7 -5
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +43 -44
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +36 -82
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +192 -423
- data/lib/arel_extensions/visitors/mysql.rb +212 -354
- data/lib/arel_extensions/visitors/oracle.rb +178 -221
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -257
- data/lib/arel_extensions/visitors/sqlite.rb +126 -140
- data/lib/arel_extensions/visitors/to_sql.rb +237 -299
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -226
- data/test/database.yml +7 -15
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +117 -120
- data/test/support/fake_record.rb +3 -9
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +11 -11
- data/test/visitors/test_bulk_insert_sqlite.rb +13 -12
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +366 -721
- data/test/with_ar/insert_agnostic_test.rb +21 -27
- data/test/with_ar/test_bulk_sqlite.rb +16 -17
- data/test/with_ar/test_math_sqlite.rb +26 -26
- data/test/with_ar/test_string_mysql.rb +33 -31
- data/test/with_ar/test_string_sqlite.rb +34 -30
- metadata +37 -47
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -403
- data/CONTRIBUTING.md +0 -102
- data/NEWS.md +0 -109
- data/bin/build +0 -15
- data/bin/compose +0 -6
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -44
- data/dev/compose.yaml +0 -71
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails4_2.gemfile +0 -38
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/helpers.rb +0 -62
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -92
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'helper'
|
|
2
2
|
require 'date'
|
|
3
3
|
|
|
4
4
|
module ArelExtensions
|
|
5
|
-
module
|
|
5
|
+
module WthAr
|
|
6
|
+
|
|
6
7
|
class ListTest < Minitest::Test
|
|
8
|
+
require 'minitest/pride'
|
|
7
9
|
def connect_db
|
|
8
10
|
ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
|
|
9
|
-
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
|
10
|
-
@env_db = (RUBY_PLATFORM == 'java' ?
|
|
11
|
-
skip "Platform not supported
|
|
11
|
+
if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
|
|
12
|
+
@env_db = (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
|
|
13
|
+
skip "Platform not supported"
|
|
12
14
|
else
|
|
13
15
|
@env_db = ENV['DB']
|
|
14
16
|
end
|
|
15
17
|
ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
|
|
16
|
-
|
|
17
|
-
ActiveRecord.default_timezone = :utc
|
|
18
|
-
else
|
|
19
|
-
ActiveRecord::Base.default_timezone = :utc
|
|
20
|
-
end
|
|
18
|
+
ActiveRecord::Base.default_timezone = :utc
|
|
21
19
|
@cnx = ActiveRecord::Base.connection
|
|
22
20
|
$sqlite = @cnx.adapter_name =~ /sqlite/i
|
|
23
21
|
$load_extension_disabled ||= false
|
|
@@ -32,14 +30,14 @@ module ArelExtensions
|
|
|
32
30
|
t.column :name, :string
|
|
33
31
|
t.column :comments, :text
|
|
34
32
|
t.column :created_at, :date
|
|
35
|
-
t.column :updated_at, :datetime
|
|
33
|
+
t.column :updated_at, :datetime
|
|
36
34
|
t.column :duration, :time
|
|
37
35
|
t.column :other, :string
|
|
38
|
-
t.column :score, :decimal, precision
|
|
36
|
+
t.column :score, :decimal, :precision => 20, :scale => 10
|
|
39
37
|
end
|
|
40
38
|
@cnx.drop_table(:product_tests) rescue nil
|
|
41
39
|
@cnx.create_table :product_tests do |t|
|
|
42
|
-
t.column :price, :decimal, precision
|
|
40
|
+
t.column :price, :decimal, :precision => 20, :scale => 10
|
|
43
41
|
end
|
|
44
42
|
end
|
|
45
43
|
|
|
@@ -54,26 +52,23 @@ module ArelExtensions
|
|
|
54
52
|
d = Date.new(2016, 5, 23)
|
|
55
53
|
connect_db
|
|
56
54
|
setup_db
|
|
57
|
-
u = User.create age
|
|
58
|
-
@lucas = User.where(id
|
|
59
|
-
u = User.create age
|
|
60
|
-
@sophie = User.where(id
|
|
61
|
-
u = User.create age
|
|
62
|
-
@camille = User.where(id
|
|
63
|
-
u = User.create age
|
|
64
|
-
@arthur = User.where(id
|
|
65
|
-
u = User.create age
|
|
66
|
-
@myung = User.where(id
|
|
67
|
-
u = User.create age
|
|
68
|
-
@laure = User.where(id
|
|
69
|
-
u = User.create age
|
|
70
|
-
@test = User.where(id
|
|
71
|
-
u = User.create age
|
|
72
|
-
@neg = User.where(id
|
|
73
|
-
|
|
74
|
-
@justin = User.where(id: u.id)
|
|
75
|
-
u = User.create age: nil, name: 'nilly', created_at: nil, score: nil
|
|
76
|
-
@nilly = User.where(id: u.id)
|
|
55
|
+
u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16, :updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
|
|
56
|
+
@lucas = User.where(:id => u.id)
|
|
57
|
+
u = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
|
|
58
|
+
@sophie = User.where(:id => u.id)
|
|
59
|
+
u = User.create :age => 20, :name => "Camille", :created_at => d, :score => -20.16, :comments => ''
|
|
60
|
+
@camille = User.where(:id => u.id)
|
|
61
|
+
u = User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62, :comments => 'arrêté'
|
|
62
|
+
@arthur = User.where(:id => u.id)
|
|
63
|
+
u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16, :comments => ' '
|
|
64
|
+
@myung = User.where(:id => u.id)
|
|
65
|
+
u = User.create :age => 25, :name => "Laure", :created_at => d, :score => 20.16, :duration => Time.utc(2001, 1, 1, 12, 42, 21),:updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
|
|
66
|
+
@laure = User.where(:id => u.id)
|
|
67
|
+
u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62, :other => 'toto'
|
|
68
|
+
@test = User.where(:id => u.id)
|
|
69
|
+
u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
|
|
70
|
+
@neg = User.where(:id => u.id)
|
|
71
|
+
|
|
77
72
|
|
|
78
73
|
@age = User.arel_table[:age]
|
|
79
74
|
@name = User.arel_table[:name]
|
|
@@ -99,7 +94,7 @@ module ArelExtensions
|
|
|
99
94
|
scope.select(node.as('res')).to_a.first.res
|
|
100
95
|
end
|
|
101
96
|
|
|
102
|
-
#
|
|
97
|
+
#manage the difference between adapters that handle or not json type
|
|
103
98
|
def parse_json(h)
|
|
104
99
|
if @env_db != 'postgresql'
|
|
105
100
|
JSON.parse("{\"res\":#{h}}")['res']
|
|
@@ -108,14 +103,6 @@ module ArelExtensions
|
|
|
108
103
|
end
|
|
109
104
|
end
|
|
110
105
|
|
|
111
|
-
# Connection and column info
|
|
112
|
-
def test_column_of
|
|
113
|
-
assert_nil Arel.column_of('chupa', 'maflavla'), 'Non-existent table and column should return nil'
|
|
114
|
-
assert_nil Arel.column_of('chupa', 'updated_at'), 'Non-existent table but existent column should return nil'
|
|
115
|
-
assert_nil Arel.column_of('user_tests', 'maflavla'), 'Existent table but non-existent column should return nil'
|
|
116
|
-
assert_equal 'updated_at', Arel.column_of('user_tests', 'updated_at').name, 'An existing column name should be returned'
|
|
117
|
-
end
|
|
118
|
-
|
|
119
106
|
# Math Functions
|
|
120
107
|
def test_classical_arel
|
|
121
108
|
assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
|
|
@@ -129,28 +116,25 @@ module ArelExtensions
|
|
|
129
116
|
end
|
|
130
117
|
|
|
131
118
|
def test_ceil
|
|
132
|
-
|
|
119
|
+
# skip "Sqlite version can't load extension for ceil" if $sqlite && $load_extension_disabled
|
|
133
120
|
assert_equal 2, t(@test, @score.ceil) # 1.62
|
|
134
121
|
assert_equal(-20, t(@camille, @score.ceil)) # -20.16
|
|
135
122
|
assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
|
|
136
123
|
assert_equal 63, t(@arthur, @age.ceil + 42)
|
|
137
|
-
assert_equal 11, t(@justin, @score.ceil) # 11.0
|
|
138
124
|
end
|
|
139
125
|
|
|
140
126
|
def test_floor
|
|
141
|
-
|
|
127
|
+
# skip "Sqlite version can't load extension for floor" if $sqlite && $load_extension_disabled
|
|
142
128
|
assert_equal 0, t(@neg, @score.floor)
|
|
143
129
|
assert_equal 1, t(@test, @score.floor) # 1.62
|
|
144
130
|
assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
|
|
145
131
|
assert_equal 42, t(@arthur, @score.floor - 23)
|
|
146
|
-
assert_equal 11, t(@justin, @score.floor) # 11.0
|
|
147
|
-
assert_equal(-21, t(@camille, @score.floor)) # # -20.16
|
|
148
132
|
end
|
|
149
133
|
|
|
150
134
|
def test_rand
|
|
151
135
|
assert 42 != User.select(Arel.rand.as('res')).first.res
|
|
152
136
|
assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
|
|
153
|
-
assert_equal
|
|
137
|
+
assert_equal 8, User.order(Arel.rand).limit(50).count
|
|
154
138
|
end
|
|
155
139
|
|
|
156
140
|
def test_round
|
|
@@ -162,91 +146,35 @@ module ArelExtensions
|
|
|
162
146
|
|
|
163
147
|
def test_sum
|
|
164
148
|
if @env_db == 'mssql'
|
|
165
|
-
skip
|
|
166
|
-
assert_equal
|
|
167
|
-
assert_equal
|
|
168
|
-
assert_equal
|
|
169
|
-
assert_equal
|
|
149
|
+
skip "SQL Server forces order?" # TODO
|
|
150
|
+
assert_equal 68, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
|
|
151
|
+
assert_equal 134, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
|
|
152
|
+
assert_equal 201, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
|
|
153
|
+
assert_equal 4009, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
|
|
170
154
|
else
|
|
171
|
-
assert_equal
|
|
172
|
-
assert_equal
|
|
173
|
-
assert_equal
|
|
174
|
-
assert_equal
|
|
155
|
+
assert_equal 68, User.select((@age.sum + 1).as("res")).take(50).first.res
|
|
156
|
+
assert_equal 134, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
|
|
157
|
+
assert_equal 201, User.select(((@age * 3).sum).as("res")).take(50).first.res
|
|
158
|
+
assert_equal 4009, User.select(((@age * @age).sum).as("res")).take(50).first.res
|
|
175
159
|
end
|
|
176
160
|
end
|
|
177
161
|
|
|
178
|
-
def test_aggregation_with_ar_calculation
|
|
179
|
-
# Since Arel10 (Rails6.1), some unwanted behaviors on aggregated calculation were present.
|
|
180
|
-
# This should works no matter which version of rails is used
|
|
181
|
-
assert User.group(:score).average(:id).values.all?{|e| !e.nil?}
|
|
182
|
-
|
|
183
|
-
# Since Rails 7, a patch to calculations.rb has tirggered a double
|
|
184
|
-
# quoting of the alias name. See https://github.com/rails/rails/commit/7e6e9091e55c3357b0162d44b6ab955ed0c718d5
|
|
185
|
-
# Before the patch that fixed this the following error would occur:
|
|
186
|
-
# ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
|
|
187
|
-
assert User.group(:score).count(:id).values.all?{|e| !e.nil?}
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def test_rollup
|
|
191
|
-
skip "sqlite not supported" if $sqlite
|
|
192
|
-
at = User.arel_table
|
|
193
|
-
# single
|
|
194
|
-
q = User.select(at[:name], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:name]]))
|
|
195
|
-
assert q.to_a.length > 0
|
|
196
|
-
|
|
197
|
-
# multi
|
|
198
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:score], at[:name]]))
|
|
199
|
-
assert q.to_a.length > 0
|
|
200
|
-
|
|
201
|
-
# hybrid
|
|
202
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel::Nodes::RollUp.new([at[:name]]))
|
|
203
|
-
assert q.to_a.length > 0
|
|
204
|
-
|
|
205
|
-
## Using Arel.rollup which is less verbose than the original way
|
|
206
|
-
|
|
207
|
-
# simple
|
|
208
|
-
q = User.select(at[:name], at[:age].sum).group(Arel.rollup(at[:name]))
|
|
209
|
-
assert q.to_a.length > 0
|
|
210
|
-
|
|
211
|
-
# multi
|
|
212
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(Arel.rollup([at[:score], at[:name]]))
|
|
213
|
-
assert q.to_a.length > 0
|
|
214
|
-
|
|
215
|
-
# hybrid
|
|
216
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel.rollup([at[:name]]))
|
|
217
|
-
assert q.to_a.length > 0
|
|
218
|
-
|
|
219
|
-
## Using at[:col].rollup which is handy for single column rollups
|
|
220
|
-
|
|
221
|
-
# simple
|
|
222
|
-
q = User.select(at[:name], at[:age].sum).group(at[:name].rollup)
|
|
223
|
-
assert q.to_a.length > 0
|
|
224
|
-
|
|
225
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name].rollup, at[:score].rollup)
|
|
226
|
-
assert q.to_a.length > 0
|
|
227
|
-
|
|
228
|
-
# hybrid
|
|
229
|
-
q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name], at[:score].rollup)
|
|
230
|
-
assert q.to_a.length > 0
|
|
231
|
-
end
|
|
232
|
-
|
|
233
162
|
# String Functions
|
|
234
163
|
def test_concat
|
|
235
164
|
assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
|
|
236
165
|
assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
|
|
237
|
-
assert_equal 'Test Laure', t(@laure, Arel.
|
|
238
|
-
|
|
239
|
-
skip
|
|
240
|
-
assert_equal
|
|
241
|
-
assert_equal
|
|
242
|
-
assert_equal
|
|
243
|
-
|
|
244
|
-
skip
|
|
245
|
-
assert_equal
|
|
246
|
-
assert_equal
|
|
247
|
-
assert_equal
|
|
248
|
-
assert_equal
|
|
249
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
|
166
|
+
assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
|
|
167
|
+
|
|
168
|
+
skip "No group_concat in SqlServer before 2017" if @env_db == 'mssql'
|
|
169
|
+
assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
|
|
170
|
+
assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
|
|
171
|
+
assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
|
|
172
|
+
|
|
173
|
+
skip "No order in group_concat in SqlLite" if $sqlite
|
|
174
|
+
assert_equal "Arthur,Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.asc))
|
|
175
|
+
assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
|
|
176
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
|
|
177
|
+
assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
|
|
250
178
|
end
|
|
251
179
|
|
|
252
180
|
def test_length
|
|
@@ -257,15 +185,15 @@ module ArelExtensions
|
|
|
257
185
|
|
|
258
186
|
def test_md5
|
|
259
187
|
skip "Sqlite can't do md5" if $sqlite
|
|
260
|
-
assert_equal
|
|
261
|
-
assert_equal
|
|
188
|
+
assert_equal "e2cf99ca82a7e829d2a4ac85c48154d0", t(@camille, @name.md5)
|
|
189
|
+
assert_equal "c3d41bf5efb468a1bcce53bd53726c85", t(@lucas, @name.md5)
|
|
262
190
|
end
|
|
263
191
|
|
|
264
192
|
def test_locate
|
|
265
193
|
skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
|
266
|
-
assert_equal 1, t(@camille, @name.locate(
|
|
267
|
-
assert_equal 0, t(@lucas, @name.locate(
|
|
268
|
-
assert_equal 5, t(@lucas, @name.locate(
|
|
194
|
+
assert_equal 1, t(@camille, @name.locate("C"))
|
|
195
|
+
assert_equal 0, t(@lucas, @name.locate("z"))
|
|
196
|
+
assert_equal 5, t(@lucas, @name.locate("s"))
|
|
269
197
|
end
|
|
270
198
|
|
|
271
199
|
def test_substring
|
|
@@ -275,7 +203,7 @@ module ArelExtensions
|
|
|
275
203
|
else
|
|
276
204
|
assert_equal('', t(@lucas, @name.substring(42)))
|
|
277
205
|
end
|
|
278
|
-
assert_equal 'Lu', t(@lucas, @name.substring(1,
|
|
206
|
+
assert_equal 'Lu', t(@lucas, @name.substring(1,2))
|
|
279
207
|
|
|
280
208
|
assert_equal 'C', t(@camille, @name[0, 1])
|
|
281
209
|
assert_equal 'C', t(@camille, @name[0])
|
|
@@ -284,35 +212,32 @@ module ArelExtensions
|
|
|
284
212
|
else
|
|
285
213
|
assert_equal('', t(@lucas, @name[42]))
|
|
286
214
|
end
|
|
287
|
-
assert_equal 'Lu', t(@lucas, @name[0,
|
|
215
|
+
assert_equal 'Lu', t(@lucas, @name[0,2])
|
|
288
216
|
assert_equal 'Lu', t(@lucas, @name[0..1])
|
|
289
217
|
|
|
290
|
-
#
|
|
218
|
+
#substring should accept string function
|
|
291
219
|
assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
|
|
292
|
-
assert_equal 'Ce', t(@camille, @name.substring(1, 1)
|
|
220
|
+
assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
|
|
293
221
|
end
|
|
294
222
|
|
|
295
223
|
def test_find_in_set
|
|
296
224
|
skip "Sqlite version can't load extension for find_in_set" if $sqlite && $load_extension_disabled
|
|
297
|
-
skip
|
|
225
|
+
skip "SQL Server does not know about FIND_IN_SET" if @env_db == 'mssql'
|
|
298
226
|
assert_equal 5, t(@neg, @comments & 2)
|
|
299
227
|
assert_equal 0, t(@neg, @comments & 6) # not found
|
|
300
|
-
assert_equal 5, t(@neg, @comments & '2')
|
|
301
|
-
assert_equal 0, t(@neg, @comments & '6') # not found
|
|
302
|
-
assert_equal 5, t(@neg, @comments & @other)
|
|
303
228
|
end
|
|
304
229
|
|
|
305
230
|
def test_string_comparators
|
|
306
|
-
#
|
|
231
|
+
#skip "Oracle can't use math operators to compare strings" if @env_db == 'oracle' # use GREATEST ?
|
|
307
232
|
skip "SQL Server can't use math operators to compare strings" if @env_db == 'mssql' # use GREATEST ?
|
|
308
233
|
if @env_db == 'postgresql' # may return real boolean
|
|
309
234
|
assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
|
|
310
235
|
assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
|
|
311
236
|
elsif @env_db == 'oracle'
|
|
312
|
-
assert_equal 1, t(@neg,
|
|
313
|
-
assert_equal 1, t(@neg,
|
|
314
|
-
assert_equal 1, t(@neg,
|
|
315
|
-
assert_equal 1, t(@neg,
|
|
237
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
|
|
238
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name <= (@name + 'Z')).then(1).else(0))
|
|
239
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name > 'Mest').then(1).else(0))
|
|
240
|
+
assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name < (@name + 'Z')).then(1).else(0))
|
|
316
241
|
else
|
|
317
242
|
assert_equal 1, t(@neg, @name >= 'Mest')
|
|
318
243
|
assert_equal 1, t(@neg, @name <= (@name + 'Z'))
|
|
@@ -324,82 +249,69 @@ module ArelExtensions
|
|
|
324
249
|
def test_compare_on_date_time_types
|
|
325
250
|
skip "Sqlite can't compare time" if $sqlite
|
|
326
251
|
skip "Oracle can't compare time" if @env_db == 'oracle'
|
|
327
|
-
|
|
328
|
-
assert_includes [true,
|
|
329
|
-
assert_includes [false,
|
|
330
|
-
|
|
331
|
-
assert_includes [true,
|
|
332
|
-
assert_includes [false,
|
|
333
|
-
|
|
334
|
-
#
|
|
335
|
-
#
|
|
336
|
-
assert_includes [true,
|
|
337
|
-
assert_includes [false,
|
|
252
|
+
#@created_at == 2016-05-23
|
|
253
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
|
|
254
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
|
|
255
|
+
#@updated_at == 2014-03-03 12:42:00
|
|
256
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
|
|
257
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
|
|
258
|
+
#@duration == 12:42:21
|
|
259
|
+
#puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
|
|
260
|
+
#puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
|
|
261
|
+
assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
|
|
262
|
+
assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
|
|
338
263
|
end
|
|
339
264
|
|
|
265
|
+
|
|
340
266
|
def test_regexp_not_regexp
|
|
341
267
|
skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
|
|
342
|
-
skip
|
|
268
|
+
skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
|
|
343
269
|
assert_equal 1, User.where(@name =~ '^M').count
|
|
344
|
-
assert_equal
|
|
270
|
+
assert_equal 6, User.where(@name !~ '^L').count
|
|
345
271
|
assert_equal 1, User.where(@name =~ /^M/).count
|
|
346
|
-
assert_equal
|
|
347
|
-
end
|
|
348
|
-
|
|
349
|
-
def test_regex_matches
|
|
350
|
-
skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
|
|
351
|
-
skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
|
|
352
|
-
assert_equal 1, User.where(@name.regex_matches '^M').count
|
|
353
|
-
assert_equal 1, User.where(@name.regex_matches /^M/).count
|
|
272
|
+
assert_equal 6, User.where(@name !~ /^L/).count
|
|
354
273
|
end
|
|
355
274
|
|
|
356
275
|
def test_imatches
|
|
357
|
-
#
|
|
276
|
+
#puts User.where(@name.imatches('m%')).to_sql
|
|
358
277
|
assert_equal 1, User.where(@name.imatches('m%')).count
|
|
359
278
|
assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
|
|
360
|
-
assert_equal
|
|
279
|
+
assert_equal 6, User.where(@name.idoes_not_match('L%')).count
|
|
361
280
|
end
|
|
362
281
|
|
|
363
282
|
def test_replace
|
|
364
|
-
assert_equal
|
|
365
|
-
assert_equal
|
|
366
|
-
|
|
367
|
-
skip 'Sqlite does not seem to support regexp_replace' if $sqlite
|
|
368
|
-
skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
|
|
369
|
-
skip 'Travis mysql version does not support REGEXP_REPLACE' if @env_db == 'mysql'
|
|
370
|
-
assert_equal 'LXcXs', t(@lucas, @name.replace(/[ua]/, 'X'))
|
|
371
|
-
assert_equal 'LXcXs', t(@lucas, @name.regexp_replace(/[ua]/, 'X'))
|
|
372
|
-
assert_equal 'LXcXs', t(@lucas, @name.regexp_replace('[ua]', 'X'))
|
|
283
|
+
assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
|
|
284
|
+
assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
|
|
373
285
|
end
|
|
374
286
|
|
|
375
287
|
def test_replace_once
|
|
376
|
-
skip
|
|
377
|
-
#
|
|
378
|
-
assert_equal
|
|
288
|
+
skip "TODO"
|
|
289
|
+
#skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
|
|
290
|
+
assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
|
|
379
291
|
end
|
|
380
292
|
|
|
381
293
|
def test_soundex
|
|
382
294
|
skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
|
|
383
295
|
skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
|
|
384
|
-
assert_equal
|
|
385
|
-
assert_equal
|
|
386
|
-
assert_equal
|
|
296
|
+
assert_equal "C540", t(@camille, @name.soundex)
|
|
297
|
+
assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
|
|
298
|
+
assert_equal 8, User.where(@name.soundex == @name.soundex).count
|
|
387
299
|
end
|
|
388
300
|
|
|
389
301
|
def test_change_case
|
|
390
|
-
assert_equal
|
|
391
|
-
assert_equal
|
|
392
|
-
assert_equal
|
|
302
|
+
assert_equal "myung", t(@myung, @name.downcase)
|
|
303
|
+
assert_equal "MYUNG", t(@myung, @name.upcase)
|
|
304
|
+
assert_equal "myung", t(@myung, @name.upcase.downcase)
|
|
393
305
|
end
|
|
394
306
|
|
|
395
307
|
def test_trim
|
|
396
|
-
assert_equal
|
|
397
|
-
assert_equal
|
|
398
|
-
assert_equal
|
|
399
|
-
assert_equal
|
|
400
|
-
assert_equal
|
|
401
|
-
skip
|
|
402
|
-
assert_equal
|
|
308
|
+
assert_equal "Myung", t(@myung, @name.trim)
|
|
309
|
+
assert_equal "Myung", t(@myung, @name.trim.ltrim.rtrim)
|
|
310
|
+
assert_equal "Myun", t(@myung, @name.rtrim("g"))
|
|
311
|
+
assert_equal "yung", t(@myung, @name.ltrim("M"))
|
|
312
|
+
assert_equal "yung", t(@myung, (@name + "M").trim("M"))
|
|
313
|
+
skip "Oracle does not accept multi char trim" if @env_db == 'oracle'
|
|
314
|
+
assert_equal "", t(@myung, @name.rtrim(@name))
|
|
403
315
|
end
|
|
404
316
|
|
|
405
317
|
def test_blank
|
|
@@ -428,244 +340,32 @@ module ArelExtensions
|
|
|
428
340
|
assert_equal 'true', t(@neg, @comments.not_blank.then('true', 'false'))
|
|
429
341
|
end
|
|
430
342
|
|
|
431
|
-
# This test repeats a lot of `test_blank` cases.
|
|
432
|
-
def test_present
|
|
433
|
-
if @env_db == 'postgresql'
|
|
434
|
-
assert_includes [true, 't'], t(@myung, @name.present) # depends of adapter
|
|
435
|
-
assert_includes [false, 'f'], t(@myung, @comments.present)
|
|
436
|
-
end
|
|
437
|
-
assert_equal 1, @myung.where(@name.present).count
|
|
438
|
-
assert_equal 0, @myung.where(@comments.present).count
|
|
439
|
-
assert_equal 0, @sophie.where(@comments.present).count
|
|
440
|
-
assert_equal 0, @camille.where(@comments.present).count
|
|
441
|
-
|
|
442
|
-
assert_equal 1, @neg.where(@comments.present).count
|
|
443
|
-
assert_equal 'true', t(@myung, @name.present.then('true', 'false'))
|
|
444
|
-
assert_equal 'false', t(@myung, @comments.present.then('true', 'false'))
|
|
445
|
-
assert_equal 'true', t(@neg, @comments.present.then('true', 'false'))
|
|
446
|
-
end
|
|
447
|
-
|
|
448
343
|
def test_format
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
assert_equal '12:42%', t(@lucas, @updated_at.send(method, '%R%%'))
|
|
453
|
-
|
|
454
|
-
# The following tests will ensure proper conversion of timestamps to
|
|
455
|
-
# requested timezones.
|
|
456
|
-
#
|
|
457
|
-
# The names of the timezones is highly dependant on the underlying
|
|
458
|
-
# operating system, and this is why we need to handle each database
|
|
459
|
-
# separately: the images we're using to test these databases are
|
|
460
|
-
# different. So don't rely on the provided examples. Your setup is your
|
|
461
|
-
# reference.
|
|
462
|
-
#
|
|
463
|
-
# One could always have portable code if s/he uses standard
|
|
464
|
-
# abbreviations, like:
|
|
465
|
-
#
|
|
466
|
-
# 1. CET => Central European Time
|
|
467
|
-
# 2. CEST => Central European Summer Time
|
|
468
|
-
#
|
|
469
|
-
# Which implies that the caller should handle daylight saving detection.
|
|
470
|
-
# In fact, CET will handle daylight saving in MySQL but not Postgres.
|
|
471
|
-
#
|
|
472
|
-
# It looks like the posix convention is supported by mysql and
|
|
473
|
-
# postgresql, e.g.:
|
|
474
|
-
#
|
|
475
|
-
# posix/Europe/Paris
|
|
476
|
-
# posix/America/Nipigon
|
|
477
|
-
#
|
|
478
|
-
# so it looks like a more reliably portable way of specifying it.
|
|
479
|
-
time_zones = {
|
|
480
|
-
'mssql' => {
|
|
481
|
-
'utc' => 'UTC',
|
|
482
|
-
'sao_paulo' => 'Argentina Standard Time',
|
|
483
|
-
'tahiti' => 'Hawaiian Standard Time',
|
|
484
|
-
'paris' => 'Central European Standard Time'
|
|
485
|
-
},
|
|
486
|
-
'posix' => {
|
|
487
|
-
'utc' => 'UTC',
|
|
488
|
-
'sao_paulo' => 'America/Sao_Paulo',
|
|
489
|
-
'tahiti' => 'Pacific/Tahiti',
|
|
490
|
-
'paris' => 'Europe/Paris'
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
|
|
495
|
-
# TODO: Standarize timezone conversion across all databases.
|
|
496
|
-
# This test case will be refactored and should work the same across all vendors.
|
|
497
|
-
if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
|
|
498
|
-
skip "SQL Server < 2016 is not currently supported"
|
|
499
|
-
end
|
|
500
|
-
|
|
501
|
-
tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
|
|
502
|
-
|
|
503
|
-
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['utc']))
|
|
504
|
-
assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
|
|
505
|
-
assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
|
|
506
|
-
|
|
507
|
-
# Skipping conversion from UTC to the desired timezones fails in SQL
|
|
508
|
-
# Server and Postgres. This is mainly due to the fact that timezone
|
|
509
|
-
# information is not preserved in the column itself.
|
|
510
|
-
#
|
|
511
|
-
# MySQL is happy to consider that times by default are in UTC.
|
|
512
|
-
assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
513
|
-
refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['paris'])) if !%w[mysql postgresql].include?(ENV['DB'])
|
|
514
|
-
|
|
515
|
-
# Winter/Summer time
|
|
516
|
-
assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
517
|
-
if ENV['DB'] == 'mssql'
|
|
518
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
519
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
|
520
|
-
else
|
|
521
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
|
|
522
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
|
|
523
|
-
end
|
|
524
|
-
end
|
|
525
|
-
end
|
|
526
|
-
|
|
527
|
-
def test_format_iso_week
|
|
528
|
-
%i[format format_date].each do |method|
|
|
529
|
-
skip "Unsupported ISO week number for DB=#{ENV['DB']}" if ['sqlite'].include?(ENV['DB'])
|
|
530
|
-
assert_equal '10', t(@lucas, @updated_at.send(method, '%V'))
|
|
531
|
-
{
|
|
532
|
-
'2024-01-01 10:42:00' => '01', # Monday
|
|
533
|
-
'2030-01-01 10:42:00' => '01', # Tuesday
|
|
534
|
-
'2025-01-01 10:42:00' => '01', # Wednesday
|
|
535
|
-
'2026-01-01 10:42:00' => '01', # Thursday
|
|
536
|
-
'2027-01-01 10:42:00' => '53', # Friday
|
|
537
|
-
'2028-01-01 10:42:00' => '52', # Saturday
|
|
538
|
-
'2034-01-01 10:42:00' => '52', # Sunday
|
|
539
|
-
}.each do |date, exp|
|
|
540
|
-
assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%V'))
|
|
541
|
-
end
|
|
542
|
-
end
|
|
543
|
-
end
|
|
544
|
-
|
|
545
|
-
def test_format_iso_year_of_week
|
|
546
|
-
skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
|
|
547
|
-
%i[format format_date].each do |method|
|
|
548
|
-
assert_equal '2014', t(@lucas, @updated_at.send(method, '%G'))
|
|
549
|
-
|
|
550
|
-
{
|
|
551
|
-
'2024-01-01 10:42:00' => '2024', # Monday
|
|
552
|
-
'2030-01-01 10:42:00' => '2030', # Tuesday
|
|
553
|
-
'2025-01-01 10:42:00' => '2025', # Wednesday
|
|
554
|
-
'2026-01-01 10:42:00' => '2026', # Thursday
|
|
555
|
-
'2027-01-01 10:42:00' => '2026', # Friday
|
|
556
|
-
'2028-01-01 10:42:00' => '2027', # Saturday
|
|
557
|
-
'2034-01-01 10:42:00' => '2033', # Sunday
|
|
558
|
-
}.each do |date, exp|
|
|
559
|
-
assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%G'))
|
|
560
|
-
end
|
|
561
|
-
end
|
|
562
|
-
end
|
|
563
|
-
|
|
564
|
-
def test_format_date_with_names
|
|
565
|
-
skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
|
|
566
|
-
%i[format format_date].each do |method|
|
|
567
|
-
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
568
|
-
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
569
|
-
end
|
|
570
|
-
|
|
571
|
-
skip "#{ENV['DB']} does not support ALLCAPS month and day names" if ['mysql'].include?(ENV['DB'])
|
|
572
|
-
%i[format format_date].each do |method|
|
|
573
|
-
|
|
574
|
-
assert_equal 'Mon, 03 MAR 14', t(@lucas, @updated_at.send(method, '%a, %d %^b %y'))
|
|
575
|
-
assert_equal 'Monday, 03 MARCH 14', t(@lucas, @updated_at.send(method, '%A, %d %^B %y'))
|
|
576
|
-
end
|
|
577
|
-
end
|
|
578
|
-
|
|
579
|
-
def switch_to_lang(lang)
|
|
580
|
-
languages = {
|
|
581
|
-
'mssql' => {en: 'English', fr: 'French'},
|
|
582
|
-
'mysql' => {en: 'en_US', fr: 'fr_FR'},
|
|
583
|
-
'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
sql = {
|
|
587
|
-
'mssql' => ->(l) { "SET LANGUAGE #{l};" },
|
|
588
|
-
'mysql' => ->(l) { "SET lc_time_names = '#{l}';" },
|
|
589
|
-
'postgresql' => ->(l) { "SET lc_time to '#{l}';" }
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
User.connection.execute(sql[ENV['DB']][languages[ENV['DB']][lang]])
|
|
593
|
-
end
|
|
594
|
-
|
|
595
|
-
def test_format_date_with_names_and_lang_switch
|
|
596
|
-
skip "#{ENV['DB']} does not support word-based formatting for month and day names" if ['sqlite'].include?(ENV['DB'])
|
|
597
|
-
|
|
598
|
-
# the begin-rescue block is here to make sure we set the db back to en_US
|
|
599
|
-
# if we fail, so that other tests don't get contaminated.
|
|
600
|
-
#
|
|
601
|
-
# Tests should assert one single thing in principle, but until we
|
|
602
|
-
# refactor this whole thing, we'll have to do tricks of this sort.
|
|
603
|
-
%i[format format_date].each do |method|
|
|
604
|
-
begin
|
|
605
|
-
switch_to_lang(:en)
|
|
606
|
-
case ENV['DB']
|
|
607
|
-
when 'mysql', 'postgresql'
|
|
608
|
-
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
609
|
-
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
610
|
-
when 'mssql'
|
|
611
|
-
assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
612
|
-
end
|
|
613
|
-
switch_to_lang(:fr)
|
|
614
|
-
case ENV['DB']
|
|
615
|
-
when 'mysql'
|
|
616
|
-
assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
617
|
-
assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
618
|
-
when 'postgresql'
|
|
619
|
-
assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
|
|
620
|
-
assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
621
|
-
when 'mssql'
|
|
622
|
-
assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
|
|
623
|
-
end
|
|
624
|
-
ensure
|
|
625
|
-
switch_to_lang(:en)
|
|
626
|
-
end
|
|
627
|
-
end
|
|
344
|
+
assert_equal '2016-05-23', t(@lucas, @created_at.format('%Y-%m-%d'))
|
|
345
|
+
skip "SQL Server does not accept any format" if @env_db == 'mssql'
|
|
346
|
+
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S'))
|
|
628
347
|
end
|
|
629
348
|
|
|
630
349
|
def test_coalesce
|
|
631
|
-
assert_equal 'Camille concat', t(@camille, @name.coalesce(nil,
|
|
350
|
+
assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
|
|
632
351
|
|
|
633
|
-
assert_equal 'toto', t(@test, @other.coalesce(
|
|
352
|
+
assert_equal 'toto', t(@test, @other.coalesce(""))
|
|
634
353
|
|
|
635
|
-
assert_equal ' ', t(@myung, @comments.coalesce(
|
|
636
|
-
assert_equal 'Laure', t(@laure, @comments.coalesce(
|
|
354
|
+
assert_equal ' ', t(@myung, @comments.coalesce("Myung").coalesce('ignored'))
|
|
355
|
+
assert_equal 'Laure', t(@laure, @comments.coalesce("Laure"))
|
|
637
356
|
if @env_db == 'oracle'
|
|
638
|
-
assert_nil t(@laure, @comments.coalesce(
|
|
639
|
-
assert_nil t(@camille, @other.coalesce(
|
|
357
|
+
assert_nil t(@laure, @comments.coalesce(""))
|
|
358
|
+
assert_nil t(@camille, @other.coalesce(""))
|
|
640
359
|
else
|
|
641
|
-
assert_equal('', t(@laure, @comments.coalesce(
|
|
642
|
-
assert_equal '', t(@camille, @other.coalesce(
|
|
360
|
+
assert_equal('', t(@laure, @comments.coalesce("")))
|
|
361
|
+
assert_equal '', t(@camille, @other.coalesce(""))
|
|
643
362
|
end
|
|
644
363
|
assert_equal 100, t(@test, @age.coalesce(100))
|
|
645
|
-
assert_equal
|
|
364
|
+
assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
|
|
646
365
|
assert_equal 20, t(@test, @age.coalesce(nil, 20))
|
|
647
366
|
|
|
648
|
-
assert_equal 20, t(@test, @age.coalesce(10)
|
|
649
|
-
assert_equal 'Laure10', t(@laure, @comments.coalesce(
|
|
650
|
-
end
|
|
651
|
-
|
|
652
|
-
def test_coalesce_blank
|
|
653
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('Myung').coalesce_blank('ignored'))
|
|
654
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ').coalesce_blank('Myung'))
|
|
655
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ', 'Myung'))
|
|
656
|
-
assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format('%Y-%m-%d'))
|
|
657
|
-
assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format_date('%Y-%m-%d'))
|
|
658
|
-
assert_equal 'Laure', t(@laure, @comments.coalesce_blank('Laure'))
|
|
659
|
-
assert_equal 100, t(@test, @age.coalesce_blank(100))
|
|
660
|
-
assert_equal 20, t(@test, @age.coalesce_blank(20))
|
|
661
|
-
assert_equal 20, t(@test, @age.coalesce_blank(10) + 10)
|
|
662
|
-
assert_equal 'Laure10', t(@laure, @comments.coalesce_blank('Laure') + 10)
|
|
663
|
-
|
|
664
|
-
skip 'mssql does not support null in case results' if @env_db == 'mssql'
|
|
665
|
-
|
|
666
|
-
assert_equal 'Camille concat', t(@camille, @name.coalesce_blank(Arel.null, 'default') + ' concat')
|
|
667
|
-
assert_equal 'Myung', t(@myung, @comments.coalesce_blank(Arel.null, 'Myung'))
|
|
668
|
-
assert_equal 'Camille', t(@camille, @name.coalesce_blank(Arel.null, 'default'))
|
|
367
|
+
assert_equal 20, t(@test, @age.coalesce(10)+10)
|
|
368
|
+
assert_equal 'Laure10', t(@laure, @comments.coalesce("Laure") + 10)
|
|
669
369
|
end
|
|
670
370
|
|
|
671
371
|
# Comparators
|
|
@@ -674,46 +374,37 @@ module ArelExtensions
|
|
|
674
374
|
assert_equal 2, User.where(@age <= 10).count
|
|
675
375
|
assert_equal 3, User.where(@age > 20).count
|
|
676
376
|
assert_equal 4, User.where(@age >= 20).count
|
|
677
|
-
assert_equal
|
|
377
|
+
assert_equal 1, User.where(@age > 5).where(@age < 20).count
|
|
678
378
|
end
|
|
679
379
|
|
|
680
380
|
def test_date_comparator
|
|
681
381
|
d = Date.new(2016, 5, 23)
|
|
682
382
|
assert_equal 0, User.where(@created_at < d).count
|
|
683
|
-
assert_equal
|
|
383
|
+
assert_equal 8, User.where(@created_at >= d).count
|
|
684
384
|
end
|
|
685
385
|
|
|
686
386
|
def test_date_duration
|
|
687
|
-
#
|
|
688
|
-
# activerecord will give it the current date.
|
|
689
|
-
#
|
|
690
|
-
# So depending on the month when we run this test, we will get different
|
|
691
|
-
# results for `User.where(@created_at.month.eq('05'))`.
|
|
692
|
-
count_for_may = Date.today.month == 5 ? 10 : 9
|
|
693
|
-
count_for_day = Date.today.day == 5 ? 1 : 0
|
|
694
|
-
|
|
695
|
-
# Year
|
|
387
|
+
#Year
|
|
696
388
|
assert_equal 2016, t(@lucas, @created_at.year).to_i
|
|
697
|
-
assert_equal 0, User.where(@created_at.year.eq(
|
|
698
|
-
#
|
|
389
|
+
assert_equal 0, User.where(@created_at.year.eq("2012")).count
|
|
390
|
+
#Month
|
|
699
391
|
assert_equal 5, t(@camille, @created_at.month).to_i
|
|
700
|
-
assert_equal
|
|
701
|
-
#
|
|
392
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
|
393
|
+
#Week
|
|
702
394
|
assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
|
|
703
|
-
assert_equal
|
|
704
|
-
#
|
|
395
|
+
assert_equal 8, User.where(@created_at.month.eq("05")).count
|
|
396
|
+
#Day
|
|
705
397
|
assert_equal 23, t(@laure, @created_at.day).to_i
|
|
706
|
-
|
|
707
|
-
assert_equal count_for_day, User.where(@created_at.day.eq('05')).count
|
|
398
|
+
assert_equal 0, User.where(@created_at.day.eq("05")).count
|
|
708
399
|
|
|
709
|
-
#
|
|
710
|
-
#
|
|
400
|
+
#skip "manage DATE" if @env_db == 'oracle'
|
|
401
|
+
#Hour
|
|
711
402
|
assert_equal 0, t(@laure, @created_at.hour).to_i
|
|
712
403
|
assert_equal 12, t(@lucas, @updated_at.hour).to_i
|
|
713
|
-
#
|
|
404
|
+
#Minute
|
|
714
405
|
assert_equal 0, t(@laure, @created_at.minute).to_i
|
|
715
406
|
assert_equal 42, t(@lucas, @updated_at.minute).to_i
|
|
716
|
-
#
|
|
407
|
+
#Second
|
|
717
408
|
assert_equal 0, t(@laure, @created_at.second).to_i
|
|
718
409
|
assert_equal 0, t(@lucas, @updated_at.second).to_i
|
|
719
410
|
end
|
|
@@ -721,8 +412,8 @@ module ArelExtensions
|
|
|
721
412
|
def test_datetime_diff
|
|
722
413
|
assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
|
|
723
414
|
if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
|
|
724
|
-
assert_equal 42 *
|
|
725
|
-
assert_equal(-3600 *
|
|
415
|
+
assert_equal 42 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
|
416
|
+
assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
|
726
417
|
else
|
|
727
418
|
assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
|
728
419
|
assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
|
@@ -733,8 +424,7 @@ module ArelExtensions
|
|
|
733
424
|
end
|
|
734
425
|
end
|
|
735
426
|
|
|
736
|
-
|
|
737
|
-
skip 'not yet implemented' if $sqlite
|
|
427
|
+
skip "not yet implemented" if $sqlite
|
|
738
428
|
|
|
739
429
|
date1 = Date.new(2016, 5, 23)
|
|
740
430
|
durPos = 10.years
|
|
@@ -746,134 +436,106 @@ module ArelExtensions
|
|
|
746
436
|
|
|
747
437
|
datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
|
|
748
438
|
# Pull Request #5 tests
|
|
749
|
-
#
|
|
750
|
-
assert_includes [date2,
|
|
751
|
-
assert_includes [date3,
|
|
439
|
+
#puts (@created_at + durPos).cast(:date).to_sql
|
|
440
|
+
assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos).cast(:date))
|
|
441
|
+
assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg).cast(:date))
|
|
752
442
|
|
|
753
|
-
#
|
|
754
|
-
assert_includes [date4,
|
|
755
|
-
#
|
|
756
|
-
assert_includes [date5,
|
|
443
|
+
#puts (@created_at + @created_at.day).cast(:date).to_sql
|
|
444
|
+
assert_includes [date4,"2016-06-15"], t(@test,(@created_at + @created_at.day).cast(:date))
|
|
445
|
+
#puts (@created_at - @created_at.day).cast(:date).to_sql
|
|
446
|
+
assert_includes [date5,"2016-04-30"], t(@test,(@created_at - @created_at.day).cast(:date))
|
|
757
447
|
|
|
758
|
-
assert_includes [datetime1 + 42.seconds,
|
|
759
|
-
assert_includes [datetime1 - 42.seconds,
|
|
448
|
+
assert_includes [datetime1 + 42.seconds,"2014-03-03 12:42:42 UTC"], t(@lucas,(@updated_at + @updated_at.minute))
|
|
449
|
+
assert_includes [datetime1 - 42.seconds,"2014-03-03 12:41:18 UTC"], t(@lucas,(@updated_at - @updated_at.minute))
|
|
760
450
|
|
|
761
451
|
# (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
|
|
762
|
-
assert_includes [datetime1 + (12
|
|
763
|
-
|
|
452
|
+
assert_includes [datetime1 + (12*60+42).seconds,"2014-03-03 12:54:42 UTC"],
|
|
453
|
+
t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
|
|
764
454
|
|
|
765
|
-
assert_includes [datetime1 + (12
|
|
766
|
-
|
|
455
|
+
assert_includes [datetime1 + (12*60+42).minutes,"2014-03-04 01:24:00 UTC"],
|
|
456
|
+
t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
|
|
767
457
|
|
|
768
|
-
assert_includes [
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format('%Y-%m-%d'))
|
|
772
|
-
assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format_date('%Y-%m-%d'))
|
|
458
|
+
assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
|
|
459
|
+
#puts (@updated_at - durPos).to_sql
|
|
460
|
+
assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
|
|
773
461
|
|
|
774
462
|
|
|
775
463
|
# we test with the ruby object or the string because some adapters don't return an object Date
|
|
776
|
-
|
|
464
|
+
# end
|
|
777
465
|
end
|
|
778
466
|
|
|
779
467
|
# TODO; cast types
|
|
780
468
|
def test_cast_types
|
|
781
|
-
assert_equal
|
|
782
|
-
skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM.match?(/java/i)
|
|
469
|
+
assert_equal "5", t(@lucas, @age.cast(:string))
|
|
783
470
|
if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
|
|
784
|
-
assert_equal 1, t(@laure,
|
|
785
|
-
assert_equal 1, t(@laure,
|
|
786
|
-
assert_equal
|
|
787
|
-
assert_equal
|
|
788
|
-
assert_equal 21.16, t(@laure
|
|
789
|
-
assert_equal 21, t(@laure
|
|
790
|
-
|
|
791
|
-
assert_equal String, t(@lucas
|
|
792
|
-
|
|
793
|
-
assert_equal
|
|
794
|
-
assert_equal Time, t(@lucas
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
assert_equal
|
|
799
|
-
assert_equal
|
|
800
|
-
assert_equal Date.parse(
|
|
801
|
-
assert_equal
|
|
802
|
-
assert_equal Date.parse('2014-03-03'), t(@lucas, @updated_at.cast(:date))
|
|
803
|
-
assert_equal '12:42:00', t(@lucas, @updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
|
|
804
|
-
end
|
|
805
|
-
end
|
|
806
|
-
|
|
807
|
-
def test_if_present
|
|
808
|
-
assert_nil t(@myung, @comments.if_present)
|
|
809
|
-
assert_equal 0, t(@myung, @comments.if_present.count)
|
|
810
|
-
assert_equal 20.16, t(@myung, @score.if_present)
|
|
811
|
-
assert_equal '2016-05-23', t(@myung, @created_at.if_present.format('%Y-%m-%d'))
|
|
812
|
-
assert_equal '2016-05-23', t(@myung, @created_at.if_present.format_date('%Y-%m-%d'))
|
|
813
|
-
assert_nil t(@laure, @comments.if_present)
|
|
814
|
-
|
|
815
|
-
assert_nil t(@nilly, @duration.if_present.format('%Y-%m-%d'))
|
|
816
|
-
assert_nil t(@nilly, @duration.if_present.format_date('%Y-%m-%d'))
|
|
817
|
-
|
|
818
|
-
# NOTE: here we're testing the capacity to format a nil value,
|
|
819
|
-
# however, @comments is a text field, and not a date/datetime field,
|
|
820
|
-
# so Postgres will rightfully complain when we format the text:
|
|
821
|
-
# we need to cast it first.
|
|
822
|
-
if @env_db == 'postgresql'
|
|
823
|
-
assert_nil t(@laure, @comments.cast(:date).if_present.format('%Y-%m-%d'))
|
|
824
|
-
assert_nil t(@laure, @comments.cast(:date).if_present.format_date('%Y-%m-%d'))
|
|
825
|
-
else
|
|
826
|
-
assert_nil t(@laure, @comments.if_present.format('%Y-%m-%d'))
|
|
827
|
-
assert_nil t(@laure, @comments.if_present.format_date('%Y-%m-%d'))
|
|
471
|
+
assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
|
|
472
|
+
assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
|
|
473
|
+
assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
|
|
474
|
+
assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
|
|
475
|
+
assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
|
|
476
|
+
assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
|
|
477
|
+
|
|
478
|
+
assert_equal String, t(@lucas,@updated_at.cast(:string)).class
|
|
479
|
+
assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
|
|
480
|
+
assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
|
|
481
|
+
assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
|
|
482
|
+
|
|
483
|
+
assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
|
|
484
|
+
assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
|
|
485
|
+
assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
|
|
486
|
+
assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
|
|
487
|
+
assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
|
|
488
|
+
assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #DateTime
|
|
828
489
|
end
|
|
829
490
|
end
|
|
830
491
|
|
|
831
492
|
def test_is_null
|
|
832
|
-
#
|
|
833
|
-
#
|
|
834
|
-
#
|
|
835
|
-
#
|
|
836
|
-
#
|
|
837
|
-
assert_equal
|
|
493
|
+
#puts User.where(@age.is_null).select(@name).to_sql
|
|
494
|
+
#puts @age.is_null
|
|
495
|
+
#puts @age.is_null.inspect
|
|
496
|
+
#puts @age.is_null.to_sql
|
|
497
|
+
#puts @age=='34'
|
|
498
|
+
assert_equal "Test", User.select(@name).where(@age.is_null.to_sql).first.name
|
|
838
499
|
end
|
|
839
500
|
|
|
840
501
|
def test_math_plus
|
|
841
502
|
d = Date.new(1997, 6, 15)
|
|
842
|
-
#
|
|
843
|
-
assert_equal
|
|
844
|
-
assert_equal
|
|
845
|
-
assert_equal
|
|
846
|
-
assert_equal
|
|
847
|
-
assert_equal
|
|
848
|
-
assert_equal
|
|
849
|
-
assert_equal
|
|
850
|
-
assert_equal
|
|
851
|
-
#
|
|
852
|
-
assert_equal
|
|
853
|
-
#
|
|
503
|
+
#Concat String
|
|
504
|
+
assert_equal "SophiePhan", t(@sophie, @name + "Phan")
|
|
505
|
+
assert_equal "Sophie2", t(@sophie, @name + 2)
|
|
506
|
+
assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
|
|
507
|
+
assert_equal "Sophie15", t(@sophie, @name + @age)
|
|
508
|
+
assert_equal "SophieSophie", t(@sophie, @name + @name)
|
|
509
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name + @name + @name)
|
|
510
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name.concat(@name)))
|
|
511
|
+
assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name).concat(@name))
|
|
512
|
+
#FIXME: should work as expected in Oracle
|
|
513
|
+
assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
|
|
514
|
+
#concat Integer
|
|
854
515
|
assert_equal 1, User.where((@age + 10).eq(33)).count
|
|
855
|
-
assert_equal 1, User.where((@age +
|
|
516
|
+
assert_equal 1, User.where((@age + "1").eq(6)).count
|
|
856
517
|
assert_equal 1, User.where((@age + @age).eq(10)).count
|
|
857
|
-
#
|
|
858
|
-
#
|
|
859
|
-
assert_equal
|
|
860
|
-
assert_equal
|
|
518
|
+
#concat Date
|
|
519
|
+
#puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
|
|
520
|
+
assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
|
|
521
|
+
assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
|
|
861
522
|
end
|
|
862
523
|
|
|
524
|
+
|
|
863
525
|
def test_math_minus
|
|
864
526
|
d = Date.new(2016, 5, 20)
|
|
865
|
-
#
|
|
866
|
-
assert_equal
|
|
867
|
-
assert_equal 3, @laure.select((@created_at - d).as(
|
|
868
|
-
#
|
|
527
|
+
#Datediff
|
|
528
|
+
assert_equal 8, User.where((@created_at - @created_at).eq(0)).count
|
|
529
|
+
assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
|
|
530
|
+
#Substraction
|
|
869
531
|
assert_equal 0, User.where((@age - 10).eq(50)).count
|
|
870
|
-
assert_equal 0, User.where((@age -
|
|
532
|
+
assert_equal 0, User.where((@age - "10").eq(50)).count
|
|
871
533
|
# assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
|
|
872
|
-
assert_equal 0, User.where((@age -
|
|
534
|
+
assert_equal 0, User.where((@age - "9.5").eq(50.5)).count
|
|
873
535
|
end
|
|
874
536
|
|
|
875
537
|
def test_wday
|
|
876
|
-
#
|
|
538
|
+
#d = Date.new(2016, 6, 26)
|
|
877
539
|
assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
|
|
878
540
|
end
|
|
879
541
|
|
|
@@ -892,8 +554,8 @@ module ArelExtensions
|
|
|
892
554
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(23)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
|
893
555
|
assert_equal 2, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
|
894
556
|
|
|
895
|
-
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0))).to_sql).length
|
|
896
|
-
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21))).to_sql).length
|
|
557
|
+
assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).to_sql).length
|
|
558
|
+
assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).to_sql).length
|
|
897
559
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).as('my_union')).length
|
|
898
560
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(23))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
|
899
561
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
|
@@ -904,118 +566,116 @@ module ArelExtensions
|
|
|
904
566
|
# Case clause
|
|
905
567
|
def test_case
|
|
906
568
|
assert_equal 4, User.find_by_sql(@ut.project(@score.when(20.16).then(1).else(0).as('score_bin')).to_sql).sum(&:score_bin)
|
|
907
|
-
assert_equal
|
|
908
|
-
assert_equal
|
|
909
|
-
assert_equal
|
|
910
|
-
assert_equal
|
|
911
|
-
assert_equal
|
|
912
|
-
assert_equal '65.621', t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string)) + 1).tr('0', '') # tr is here because of precision on cast for some DBMS
|
|
569
|
+
assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
|
|
570
|
+
assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
|
|
571
|
+
assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
|
|
572
|
+
assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
|
|
573
|
+
assert_equal "65.621", t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string))+1).tr('0','') #tr is here because of precision on cast for some DBMS
|
|
913
574
|
end
|
|
914
575
|
|
|
915
576
|
def test_format_numbers
|
|
916
|
-
#
|
|
917
|
-
skip
|
|
918
|
-
|
|
919
|
-
assert_equal
|
|
920
|
-
assert_equal
|
|
921
|
-
assert_equal
|
|
922
|
-
assert_equal
|
|
923
|
-
assert_equal
|
|
924
|
-
assert_equal
|
|
925
|
-
assert_equal
|
|
926
|
-
assert_equal
|
|
927
|
-
assert_equal
|
|
928
|
-
assert_equal
|
|
929
|
-
assert_equal
|
|
930
|
-
assert_equal
|
|
931
|
-
assert_includes [
|
|
932
|
-
assert_includes [
|
|
933
|
-
assert_includes [
|
|
934
|
-
assert_equal
|
|
935
|
-
assert_equal
|
|
936
|
-
assert_equal
|
|
937
|
-
assert_equal
|
|
938
|
-
assert_equal
|
|
939
|
-
assert_equal
|
|
577
|
+
#score of Arthur = 65.62
|
|
578
|
+
skip " Works with SQLite if the version used knows printf" if $sqlite
|
|
579
|
+
|
|
580
|
+
assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
|
|
581
|
+
assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
|
|
582
|
+
assert_equal "65,62AZERTY" , t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
|
|
583
|
+
assert_equal "$ 65.62 €" , t(@arthur, @score.format_number("$ %.2f €","en_US"))
|
|
584
|
+
assert_equal "$ 66 €" , t(@arthur, @score.format_number("$ %.0f €","en_US"))
|
|
585
|
+
assert_equal "$ 0065,62 €" , t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
|
|
586
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
|
|
587
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
|
|
588
|
+
assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
|
|
589
|
+
assert_equal "$ 65,6 €" , t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
|
|
590
|
+
assert_equal "$ +65,62 €" , t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
|
|
591
|
+
assert_equal "$ +065,62 €" , t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
|
|
592
|
+
assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
|
|
593
|
+
assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
|
|
594
|
+
assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
|
|
595
|
+
assert_equal "123 456 765,6" , t(@arthur, (@score+123456700).format_number("%.1f","sv_SE")).gsub("\u00A0"," ") #some DBMS put no-break space here (it makes sense thus)
|
|
596
|
+
assert_equal "123456765,6" , t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") #because SqlServer does it like no one else
|
|
597
|
+
assert_equal "123,456,765.6" , t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
|
|
598
|
+
assert_equal " 123,456,765.6" , t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
|
|
599
|
+
assert_equal "$ 0,00 €" , t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
|
|
600
|
+
assert_equal "$ 0,00 €" , t(@arthur, (@score-65.62).format_number("$ %.2f €","fr_FR"))
|
|
940
601
|
end
|
|
941
602
|
|
|
942
603
|
def test_accent_insensitive
|
|
943
|
-
skip
|
|
944
|
-
skip
|
|
604
|
+
skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
|
|
605
|
+
skip "Not finished" if @env_db == 'mysql'
|
|
945
606
|
# actual comments value: "arrêté"
|
|
946
|
-
#
|
|
607
|
+
#AI & CI
|
|
947
608
|
if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
|
|
948
|
-
assert_equal
|
|
949
|
-
assert_equal
|
|
950
|
-
assert_equal
|
|
951
|
-
assert_equal
|
|
952
|
-
assert_equal
|
|
953
|
-
assert_equal
|
|
954
|
-
#
|
|
955
|
-
assert_equal
|
|
956
|
-
assert_equal
|
|
957
|
-
assert_equal
|
|
958
|
-
assert_equal
|
|
959
|
-
if
|
|
960
|
-
assert_equal
|
|
961
|
-
assert_equal
|
|
609
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
|
|
610
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
|
|
611
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("àrrétè")).then("1").else("0"))
|
|
612
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
|
|
613
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
|
|
614
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
|
|
615
|
+
#AI & CS
|
|
616
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
|
|
617
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
|
|
618
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
|
|
619
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arretez")).then("1").else("0"))
|
|
620
|
+
if !['oracle','postgresql','mysql'].include?(@env_db) # AI => CI
|
|
621
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrete")).then("1").else("0"))
|
|
622
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
|
|
962
623
|
end
|
|
963
624
|
end
|
|
964
|
-
#
|
|
965
|
-
assert_equal
|
|
625
|
+
#AS & CI
|
|
626
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
|
|
966
627
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
|
967
|
-
assert_equal
|
|
968
|
-
assert_equal
|
|
628
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
|
|
629
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("àrrétè")).then("1").else("0"))
|
|
969
630
|
end
|
|
970
|
-
assert_equal
|
|
631
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arretez")).then("1").else("0"))
|
|
971
632
|
if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
|
|
972
|
-
assert_equal
|
|
633
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
|
|
973
634
|
end
|
|
974
|
-
assert_equal
|
|
975
|
-
#
|
|
976
|
-
assert_equal
|
|
977
|
-
assert_equal
|
|
978
|
-
assert_equal
|
|
979
|
-
assert_equal
|
|
980
|
-
assert_equal
|
|
981
|
-
assert_equal
|
|
635
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
|
|
636
|
+
#AS & CS
|
|
637
|
+
assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
|
|
638
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
|
|
639
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
|
|
640
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arretez")).then("1").else("0"))
|
|
641
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrete")).then("1").else("0"))
|
|
642
|
+
assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrêté")).then("1").else("0"))
|
|
982
643
|
end
|
|
983
644
|
|
|
984
645
|
def test_subquery_with_order
|
|
985
|
-
|
|
986
|
-
assert_equal
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
assert_equal
|
|
990
|
-
# assert_equal 6, User.where(name: User.select(:name).order(:name).offset(2)).count
|
|
646
|
+
assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
|
|
647
|
+
assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
|
|
648
|
+
if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
|
|
649
|
+
assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
|
|
650
|
+
#assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
|
|
991
651
|
end
|
|
992
652
|
end
|
|
993
653
|
|
|
994
654
|
def test_in_with_nil
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
655
|
+
assert_equal true , @myung.where(@age.in(1)).blank?
|
|
656
|
+
assert_equal false , @myung.where(@age.in(23)).blank?
|
|
657
|
+
assert_equal true , @myung.where(@age.in([1])).blank?
|
|
658
|
+
assert_equal true , @myung.where(@age.in([1,2])).blank?
|
|
659
|
+
assert_equal false , @myung.where(@age.in([1,23])).blank?
|
|
660
|
+
assert_equal true , @myung.where(@age.in(nil)).blank?
|
|
661
|
+
assert_equal true , @myung.where(@age.in([nil])).blank?
|
|
662
|
+
assert_equal true , @myung.where(@age.in([nil,1])).blank?
|
|
663
|
+
assert_equal false , @myung.where(@age.in([nil,23])).blank?
|
|
664
|
+
assert_equal true , @myung.where(@age.in([nil,1,2])).blank?
|
|
665
|
+
assert_equal false , @myung.where(@age.in([nil,1,23])).blank?
|
|
666
|
+
assert_equal true , @test.where(@age.in(1)).blank?
|
|
667
|
+
assert_equal true , @test.where(@age.in([1])).blank?
|
|
668
|
+
assert_equal true , @test.where(@age.in([1,2])).blank?
|
|
669
|
+
assert_equal false , @test.where(@age.in(nil)).blank?
|
|
670
|
+
assert_equal false , @test.where(@age.in([nil])).blank?
|
|
671
|
+
assert_equal false , @test.where(@age.in([nil,1])).blank?
|
|
672
|
+
assert_equal false , @test.where(@age.in([nil,1,2])).blank?
|
|
1013
673
|
end
|
|
1014
674
|
|
|
1015
675
|
def test_scope_with_in_plus_new
|
|
1016
676
|
begin
|
|
1017
|
-
@test.where(@age.in([1,
|
|
1018
|
-
@test.where(@age.not_in([1,
|
|
677
|
+
@test.where(@age.in([1,2])).new
|
|
678
|
+
@test.where(@age.not_in([1,2])).new
|
|
1019
679
|
assert true
|
|
1020
680
|
rescue
|
|
1021
681
|
assert false
|
|
@@ -1023,129 +683,114 @@ module ArelExtensions
|
|
|
1023
683
|
end
|
|
1024
684
|
|
|
1025
685
|
def test_is_not_null
|
|
1026
|
-
|
|
1027
|
-
|
|
686
|
+
assert_equal false , @myung.where(@age.is_not_null).blank?
|
|
687
|
+
assert_equal true , @test.where(@age.is_not_null).blank?
|
|
1028
688
|
end
|
|
1029
689
|
|
|
1030
690
|
def test_not_in_with_nil
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
#
|
|
1046
|
-
#
|
|
1047
|
-
#
|
|
1048
|
-
#
|
|
1049
|
-
#
|
|
1050
|
-
#
|
|
1051
|
-
#
|
|
1052
|
-
#
|
|
1053
|
-
end
|
|
1054
|
-
|
|
1055
|
-
def test_in_on_grouping
|
|
1056
|
-
skip 'We should modify the visitor of IN to make it work' if $sqlite || @env_db == 'mssql'
|
|
1057
|
-
assert_equal 2, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23), Arel.tuple('Arthur', 21))).count
|
|
1058
|
-
assert_equal 1, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23))).count
|
|
1059
|
-
assert_equal 0, User.where(Arel.tuple(@name, @age).in([])).count
|
|
691
|
+
assert_equal false , @myung.where(@age.not_in(1)).blank?
|
|
692
|
+
assert_equal true , @myung.where(@age.not_in(23)).blank?
|
|
693
|
+
assert_equal false , @myung.where(@age.not_in([1])).blank?
|
|
694
|
+
assert_equal false , @myung.where(@age.not_in([1,2])).blank?
|
|
695
|
+
assert_equal true , @myung.where(@age.not_in([1,23])).blank?
|
|
696
|
+
assert_equal false , @myung.where(@age.not_in(nil)).blank?
|
|
697
|
+
assert_equal false , @myung.where(@age.not_in([nil])).blank?
|
|
698
|
+
assert_equal false , @myung.where(@age.not_in([nil,1])).blank?
|
|
699
|
+
assert_equal true , @myung.where(@age.not_in([nil,23])).blank?
|
|
700
|
+
assert_equal false , @myung.where(@age.not_in([nil,1,2])).blank?
|
|
701
|
+
assert_equal true , @myung.where(@age.not_in([nil,1,23])).blank?
|
|
702
|
+
|
|
703
|
+
assert_equal false , @myung.where(@age.not_in(1..2)).blank?
|
|
704
|
+
|
|
705
|
+
#if the column is null, the entry will never be selected with not in (like every DBMS does)
|
|
706
|
+
#assert_equal false , @test.where(@age.not_in(1)).blank?
|
|
707
|
+
#assert_equal false , @test.where(@age.not_in([1])).blank?
|
|
708
|
+
#assert_equal false , @test.where(@age.not_in([1,2])).blank?
|
|
709
|
+
#assert_equal true , @test.where(@age.not_in(nil)).blank?
|
|
710
|
+
#assert_equal true , @test.where(@age.not_in([nil])).blank?
|
|
711
|
+
#assert_equal true , @test.where(@age.not_in([nil,1])).blank?
|
|
712
|
+
#assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
|
|
1060
713
|
end
|
|
1061
714
|
|
|
1062
715
|
def test_alias_shortened
|
|
1063
|
-
if
|
|
716
|
+
if ['postgresql','oracle'].include?(@env_db)
|
|
1064
717
|
new_alias = Arel.shorten('azerty' * 15)
|
|
1065
718
|
at = User.arel_table.alias('azerty' * 15)
|
|
1066
719
|
assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
|
|
1067
720
|
assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
|
|
1068
|
-
assert_equal
|
|
1069
|
-
|
|
721
|
+
assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
|
|
722
|
+
User.select(at[:id]).from(at).to_sql.downcase
|
|
1070
723
|
end
|
|
1071
724
|
end
|
|
1072
725
|
|
|
1073
726
|
def test_stat_functions
|
|
1074
727
|
skip "SQLite doesn't work for most on this functions" if $sqlite
|
|
1075
|
-
#
|
|
1076
|
-
#
|
|
1077
|
-
#
|
|
1078
|
-
#
|
|
1079
|
-
#
|
|
1080
|
-
|
|
1081
|
-
assert ( 15.
|
|
1082
|
-
assert (
|
|
1083
|
-
assert (
|
|
1084
|
-
assert (
|
|
1085
|
-
assert (
|
|
1086
|
-
skip 'Not Yet Implemented' # if !['postgresql'].include?(@env_db)
|
|
1087
|
-
assert_equal 2, User.select(@score.std(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
1088
|
-
assert_equal 2, User.select(@score.variance(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
1089
|
-
assert_equal 2, User.select(@score.sum(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
1090
|
-
assert_equal 2, User.select(@comments.group_concat(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
|
|
728
|
+
#puts t(User.where(nil), @score.average)
|
|
729
|
+
#puts t(User.where(nil), @score.variance(true))
|
|
730
|
+
#puts t(User.where(nil), @score.variance(false))
|
|
731
|
+
#puts t(User.where(nil), @score.std(true))
|
|
732
|
+
#puts t(User.where(nil), @score.std(false))
|
|
733
|
+
|
|
734
|
+
assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
|
|
735
|
+
assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
|
|
736
|
+
assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
|
|
737
|
+
assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
|
|
738
|
+
assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
|
|
1091
739
|
end
|
|
1092
740
|
|
|
1093
741
|
def test_levenshtein_distance
|
|
1094
|
-
skip
|
|
1095
|
-
assert_equal 0, t(@arthur
|
|
1096
|
-
assert_equal 2, t(@arthur
|
|
1097
|
-
assert_equal 1, t(@arthur
|
|
742
|
+
skip "Not Yet Implemented" if $sqlite
|
|
743
|
+
assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
|
|
744
|
+
assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
|
|
745
|
+
assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
|
|
1098
746
|
end
|
|
1099
747
|
|
|
1100
748
|
def test_json
|
|
1101
749
|
skip "Can't be tested on travis"
|
|
1102
|
-
#
|
|
1103
|
-
assert_equal 'Arthur', t(@arthur,
|
|
1104
|
-
assert_equal
|
|
1105
|
-
assert_equal ({
|
|
1106
|
-
assert_equal ({
|
|
1107
|
-
assert_equal [{
|
|
750
|
+
#creation
|
|
751
|
+
assert_equal 'Arthur', t(@arthur,Arel.json(@name))
|
|
752
|
+
assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,Arel.json(@name,@name)))
|
|
753
|
+
assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => @name+@name})))
|
|
754
|
+
assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => 1})))
|
|
755
|
+
assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,Arel.json([{age: @age},{name: @name,score: @score}])))
|
|
1108
756
|
|
|
1109
757
|
# aggregate
|
|
1110
|
-
assert_equal ({
|
|
1111
|
-
|
|
1112
|
-
assert_equal ({
|
|
1113
|
-
|
|
1114
|
-
assert_equal [{
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
#
|
|
1118
|
-
#
|
|
1119
|
-
|
|
1120
|
-
skip
|
|
1121
|
-
#
|
|
1122
|
-
h1 = Arel.json({@name => @name
|
|
1123
|
-
assert_equal
|
|
1124
|
-
h2 = Arel.json([{age: @age},
|
|
1125
|
-
assert_equal ({
|
|
1126
|
-
assert_equal 21, parse_json(t(@arthur,
|
|
1127
|
-
assert_nil t(@arthur,
|
|
1128
|
-
#
|
|
1129
|
-
assert_equal ({
|
|
1130
|
-
assert_equal ({
|
|
1131
|
-
assert_equal ({
|
|
1132
|
-
assert_equal ({
|
|
1133
|
-
#
|
|
1134
|
-
assert_equal ({
|
|
1135
|
-
assert_equal ({
|
|
1136
|
-
assert_equal ({
|
|
758
|
+
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure"}),
|
|
759
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
|
|
760
|
+
assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure", "Laure"=>25, "Lucas"=>5, "Myung"=>23, "Sophie"=>15}),
|
|
761
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
|
|
762
|
+
assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
|
|
763
|
+
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score),Arel.json({@age => @name}).group(true,[@age])))
|
|
764
|
+
|
|
765
|
+
#puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_sql
|
|
766
|
+
#puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_a
|
|
767
|
+
|
|
768
|
+
skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
|
|
769
|
+
#get
|
|
770
|
+
h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
|
|
771
|
+
assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
|
|
772
|
+
h2 = Arel.json([{age: @age},{name: @name,score: @score}])
|
|
773
|
+
assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
|
|
774
|
+
assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
|
|
775
|
+
assert_nil t(@arthur,h2.get('age'))
|
|
776
|
+
#set
|
|
777
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1}), parse_json(t(@arthur,h1.set(@name, ['toto','tata'])))
|
|
778
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.set(@name+"3",2)))
|
|
779
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => nil}), parse_json(t(@arthur,h1.set(@name+"3",nil)))
|
|
780
|
+
assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => {"a" => 2}}), parse_json(t(@arthur,h1.set(@name+"3",{a: 2})))
|
|
781
|
+
#merge
|
|
782
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata']},{@name+"3" => 2})))
|
|
783
|
+
assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata'], @name+"3" => 2})))
|
|
784
|
+
assert_equal ({"Arthur" => "ArthurArthur","Arthur2" => 1}), parse_json(t(@arthur,h1.merge({})))
|
|
1137
785
|
end
|
|
1138
786
|
|
|
1139
787
|
def test_as_on_everything
|
|
1140
788
|
name = @arthur.select(@name.as('NaMe')).first.attributes
|
|
1141
|
-
assert_equal 'Arthur', name[
|
|
1142
|
-
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes[
|
|
1143
|
-
assert_equal 'ArthurArthur', @arthur.select((@name
|
|
789
|
+
assert_equal 'Arthur', name["NaMe"] || name["name"] #because of Oracle
|
|
790
|
+
assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
|
|
791
|
+
assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
|
|
1144
792
|
end
|
|
1145
793
|
|
|
1146
|
-
def test_exists_in_subquery
|
|
1147
|
-
assert User.where(User.where(nil).arel.exists).first
|
|
1148
|
-
end
|
|
1149
794
|
end
|
|
1150
795
|
end
|
|
1151
796
|
end
|