arel_extensions 1.4.0 → 2.0.0.rc3

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