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.
Files changed (141) 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 +25 -24
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -7
  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 -29
  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 -48
  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 +36 -82
  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 +192 -423
  83. data/lib/arel_extensions/visitors/mysql.rb +212 -354
  84. data/lib/arel_extensions/visitors/oracle.rb +178 -221
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -257
  87. data/lib/arel_extensions/visitors/sqlite.rb +126 -140
  88. data/lib/arel_extensions/visitors/to_sql.rb +237 -299
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +31 -226
  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 -721
  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 +37 -47
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -403
  111. data/CONTRIBUTING.md +0 -102
  112. data/NEWS.md +0 -109
  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 -34
  123. data/gemfiles/rails6_1.gemfile +0 -42
  124. data/gemfiles/rails7.gemfile +0 -42
  125. data/gemfiles/rails7_1.gemfile +0 -41
  126. data/gemfiles/rails7_2.gemfile +0 -41
  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/lib/arel_extensions/warning.rb +0 -42
  139. data/test/arelx_test_helper.rb +0 -92
  140. data/version_v1.rb +0 -3
  141. 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, other: '2'
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(',', order: @name.asc))
246
- assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: @name.desc))
247
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
248
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@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,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, 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
- 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
- # 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 ?
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, Arel.when(@name >= 'Mest').then(1).else(0))
313
- assert_equal 1, t(@neg, Arel.when(@name <= (@name + 'Z')).then(1).else(0))
314
- assert_equal 1, t(@neg, Arel.when(@name > 'Mest').then(1).else(0))
315
- 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))
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
- # @created_at == 2016-05-23
328
- assert_includes [true, 't', 1], t(@laure, Arel.when(@created_at >= '2014-01-01').then(1).else(0))
329
- assert_includes [false, 'f', 0], t(@laure, Arel.when(@created_at >= '2018-01-01').then(1).else(0))
330
- # @updated_at == 2014-03-03 12:42:00
331
- assert_includes [true, 't', 1], t(@laure, Arel.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
332
- assert_includes [false, 'f', 0], t(@laure, Arel.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
333
- # @duration == 12:42:21
334
- # puts @laure.select(Arel.when(@duration >= '10:10:10').then(1).else(0)).to_sql
335
- # puts @laure.select(Arel.when(@duration >= '14:10:10').then(1).else(0)).to_sql
336
- assert_includes [true, 't', 1], t(@laure, Arel.when(@duration >= '10:10:10').then(1).else(0))
337
- 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))
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 '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'
343
269
  assert_equal 1, User.where(@name =~ '^M').count
344
- assert_equal 8, User.where(@name !~ '^L').count
270
+ assert_equal 6, User.where(@name !~ '^L').count
345
271
  assert_equal 1, User.where(@name =~ /^M/).count
346
- assert_equal 8, User.where(@name !~ /^L/).count
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
- # puts User.where(@name.imatches('m%')).to_sql
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 8, User.where(@name.idoes_not_match('L%')).count
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 'LucaX', t(@lucas, @name.replace('s', 'X'))
365
- assert_equal 'replace', t(@lucas, @name.replace(@name, 'replace'))
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 'TODO'
377
- # skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
378
- 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))
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 'C540', t(@camille, @name.soundex)
385
- assert_equal 10, User.where(@name.soundex.eq(@name.soundex)).count
386
- 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
387
299
  end
388
300
 
389
301
  def test_change_case
390
- assert_equal 'myung', t(@myung, @name.downcase)
391
- assert_equal 'MYUNG', t(@myung, @name.upcase)
392
- 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)
393
305
  end
394
306
 
395
307
  def test_trim
396
- assert_equal 'Myung', t(@myung, @name.trim)
397
- assert_equal 'Myung', t(@myung, @name.trim.ltrim.rtrim)
398
- assert_equal 'Myun', t(@myung, @name.rtrim('g'))
399
- assert_equal 'yung', t(@myung, @name.ltrim('M'))
400
- assert_equal 'yung', t(@myung, (@name + 'M').trim('M'))
401
- skip 'Oracle does not accept multi char trim' if @env_db == 'oracle'
402
- 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))
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
- %i[format format_date].each do |method|
450
- assert_equal '2016-05-23', t(@lucas, @created_at.send(method, '%Y-%m-%d'))
451
- assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S'))
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, 'default') + ' concat')
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('Myung').coalesce('ignored'))
636
- 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"))
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 'Camille', t(@camille, @name.coalesce(nil, 'default'))
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) + 10)
649
- assert_equal 'Laure10', t(@laure, @comments.coalesce('Laure') + 10)
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 2, User.where(@age > 5).where(@age < 20).count
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 10, User.where(@created_at >= d).count
383
+ assert_equal 8, User.where(@created_at >= d).count
684
384
  end
685
385
 
686
386
  def test_date_duration
687
- # When user `nilly` is created, with an explicit `created_at: nil`,
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('2012')).count
698
- # Month
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 count_for_may, User.where(@created_at.month.eq('05')).count
701
- # Week
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 count_for_may, User.where(@created_at.month.eq('05')).count
704
- # Day
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
- # Make sure we get the correct count on the date we run the test.
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
- # skip "manage DATE" if @env_db == 'oracle'
710
- # Hour
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
- # Minute
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
- # Second
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 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
725
- 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)
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
- # puts (@created_at + durPos).cast(:date).to_sql
750
- assert_includes [date2, '2026-05-23'], t(@test, (@created_at + durPos).cast(:date))
751
- 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))
752
442
 
753
- # puts (@created_at + @created_at.day).cast(:date).to_sql
754
- assert_includes [date4, '2016-06-15'], t(@test, (@created_at + @created_at.day).cast(:date))
755
- # puts (@created_at - @created_at.day).cast(:date).to_sql
756
- 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))
757
447
 
758
- assert_includes [datetime1 + 42.seconds, '2014-03-03 12:42:42 UTC'], t(@lucas, (@updated_at + @updated_at.minute))
759
- 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))
760
450
 
761
451
  # (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
762
- assert_includes [datetime1 + (12 * 60 + 42).seconds, '2014-03-03 12:54:42 UTC'],
763
- 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))))
764
454
 
765
- assert_includes [datetime1 + (12 * 60 + 42).minutes, '2014-03-04 01:24:00 UTC'],
766
- 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))))
767
457
 
768
- assert_includes ['2024-03-03'], t(@lucas, (@updated_at + durPos).format('%Y-%m-%d'))
769
- assert_includes ['2024-03-03'], t(@lucas, (@updated_at + durPos).format_date('%Y-%m-%d'))
770
- # puts (@updated_at - durPos).to_sql
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
- # end
464
+ # end
777
465
  end
778
466
 
779
467
  # TODO; cast types
780
468
  def test_cast_types
781
- assert_equal '5', t(@lucas, @age.cast(:string))
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, Arel.when(@duration.cast(:time).cast(:string).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
785
- assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle'
786
- assert_equal '20.16', t(@laure, @score.cast(:string)).gsub(/0*\z/, '')
787
- assert_equal '20.161', t(@laure, @score.cast(:string) + 1).gsub(/0*1\z/, '1')
788
- assert_equal 21.16, t(@laure, @score.cast(:string).cast(:decimal) + 1)
789
- assert_equal 21, t(@laure, @score.cast(:string).cast(:int) + 1)
790
-
791
- assert_equal String, t(@lucas, @updated_at.cast(:string)).class
792
-
793
- assert_equal Date, t(@lucas, @updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
794
- assert_equal Time, t(@lucas, @updated_at.cast(:string).cast(:datetime)).class
795
- assert_equal Time, t(@lucas, @updated_at.cast(:time)).class
796
-
797
- # mysql adapter in rails7 adds some infos we just squeeze here
798
- assert_equal '2014-03-03 12:42:00', t(@lucas, @updated_at.cast(:string)).split('.').first unless @env_db == 'mssql' # locale dependent
799
- assert_equal Date.parse('2014-03-03'), t(@lucas, Arel.quoted('2014-03-03').cast(:date))
800
- assert_equal Date.parse('5014-03-03'), t(@lucas, (@age.cast(:string) + '014-03-03').cast(:date))
801
- assert_equal Time.parse('2014-03-03 12:42:00 UTC'), t(@lucas, @updated_at.cast(:string).cast(:datetime))
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
- # puts User.where(@age.is_null).select(@name).to_sql
833
- # puts @age.is_null
834
- # puts @age.is_null.inspect
835
- # puts @age.is_null.to_sql
836
- # puts @age=='34'
837
- 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
838
499
  end
839
500
 
840
501
  def test_math_plus
841
502
  d = Date.new(1997, 6, 15)
842
- # Concat String
843
- assert_equal 'SophiePhan', t(@sophie, @name + 'Phan')
844
- assert_equal 'Sophie2', t(@sophie, @name + 2)
845
- assert_equal 'Sophie1997-06-15', t(@sophie, @name + d)
846
- assert_equal 'Sophie15', t(@sophie, @name + @age)
847
- assert_equal 'SophieSophie', t(@sophie, @name + @name)
848
- assert_equal 'SophieSophieSophie', t(@sophie, @name + @name + @name)
849
- assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name.concat(@name)))
850
- assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name).concat(@name))
851
- # FIXME: should work as expected in Oracle
852
- assert_equal 'Sophie2016-05-23', t(@sophie, @name + @created_at) unless @env_db == 'oracle'
853
- # 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
854
515
  assert_equal 1, User.where((@age + 10).eq(33)).count
855
- assert_equal 1, User.where((@age + '1').eq(6)).count
516
+ assert_equal 1, User.where((@age + "1").eq(6)).count
856
517
  assert_equal 1, User.where((@age + @age).eq(10)).count
857
- # concat Date
858
- # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
859
- assert_equal '2016-05-24', t(@myung, @created_at + 1).to_date.to_s
860
- 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
861
522
  end
862
523
 
524
+
863
525
  def test_math_minus
864
526
  d = Date.new(2016, 5, 20)
865
- # Datediff
866
- assert_equal 10, User.where((@created_at - @created_at).eq(0)).count
867
- assert_equal 3, @laure.select((@created_at - d).as('res')).first.res.abs.to_i
868
- # 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
869
531
  assert_equal 0, User.where((@age - 10).eq(50)).count
870
- assert_equal 0, User.where((@age - '10').eq(50)).count
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 - '9.5').eq(50.5)).count
534
+ assert_equal 0, User.where((@age - "9.5").eq(50.5)).count
873
535
  end
874
536
 
875
537
  def test_wday
876
- # d = Date.new(2016, 6, 26)
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 4, User.where(@score.when(20.16).then(1).else(0).eq(1)).count
908
- assert_equal 2, t(@arthur, @score.when(65.62, 1).else(0) + 1)
909
- assert_equal 0, t(@arthur, @score.when(65.62, 1).else(0) - 1)
910
- assert_equal '11', t(@arthur, @score.when(65.62).then('1').else('0') + '1')
911
- assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score) + 1)
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
- # score of Arthur = 65.62
917
- skip ' Works with SQLite if the version used knows printf' if $sqlite
918
-
919
- assert_equal 'Wrong Format', t(@arthur, @score.format_number('$ %...234.6F €', 'fr_FR'))
920
- assert_equal 'AZERTY65,62', t(@arthur, @score.format_number('AZERTY%.2f', 'fr_FR'))
921
- assert_equal '65,62AZERTY', t(@arthur, @score.format_number('%.2fAZERTY', 'fr_FR'))
922
- assert_equal '$ 65.62 €', t(@arthur, @score.format_number('$ %.2f €', 'en_US'))
923
- assert_equal '$ 66 €', t(@arthur, @score.format_number('$ %.0f €', 'en_US'))
924
- assert_equal '$ 0065,62 €', t(@arthur, @score.format_number('$ %07.2f €', 'fr_FR'))
925
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-07.2f €', 'fr_FR'))
926
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-7.2f €', 'fr_FR'))
927
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ % 7.2f €', 'fr_FR'))
928
- assert_equal '$ 65,6 €', t(@arthur, @score.format_number('$ % 7.1f €', 'fr_FR'))
929
- assert_equal '$ +65,62 €', t(@arthur, @score.format_number('$ % +7.2f €', 'fr_FR'))
930
- assert_equal '$ +065,62 €', t(@arthur, @score.format_number('$ %0+7.2f €', 'fr_FR'))
931
- assert_includes ['$ 6,56e1 €', '$ 6,56e+01 €'], t(@arthur, @score.format_number('$ %.2e €', 'fr_FR'))
932
- assert_includes ['$ 6,56E1 €', '$ 6,56E+01 €'], t(@arthur, @score.format_number('$ %.2E €', 'fr_FR'))
933
- assert_includes ['$ 6,562E1 €', '$ 6,562E+01 €'], t(@arthur, @score.format_number('$ %.3E €', 'fr_FR'))
934
- 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)
935
- 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
936
- assert_equal '123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'en_US'))
937
- assert_equal ' 123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%16.1f', 'en_US'))
938
- assert_equal '$ 0,00 €', t(@arthur, @score.when(65.62).then(Arel.sql('null')).else(1).format_number('$ %.2f €', 'fr_FR'))
939
- 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"))
940
601
  end
941
602
 
942
603
  def test_accent_insensitive
943
- skip 'SQLite is natively Case Insensitive and Accent Sensitive' if $sqlite
944
- 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'
945
606
  # actual comments value: "arrêté"
946
- # AI & CI
607
+ #AI & CI
947
608
  if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
948
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrêté')).then('1').else('0'))
949
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrete')).then('1').else('0'))
950
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('àrrétè')).then('1').else('0'))
951
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_imatches('arretez')).then('1').else('0'))
952
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrete')).then('1').else('0'))
953
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrêté')).then('1').else('0'))
954
- # AI & CS
955
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrêté')).then('1').else('0'))
956
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrete')).then('1').else('0'))
957
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('àrrétè')).then('1').else('0'))
958
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('arretez')).then('1').else('0'))
959
- if !%w[oracle postgresql mysql].include?(@env_db) # AI => CI
960
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrete')).then('1').else('0'))
961
- 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"))
962
623
  end
963
624
  end
964
- # AS & CI
965
- 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"))
966
627
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
967
- assert_equal '0', t(@arthur, Arel.when(@comments.imatches('arrete')).then('1').else('0'))
968
- 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"))
969
630
  end
970
- 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"))
971
632
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
972
- 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"))
973
634
  end
974
- assert_equal '1', t(@arthur, Arel.when(@comments.imatches('Arrêté')).then('1').else('0'))
975
- # AS & CS
976
- assert_equal '1', t(@arthur, Arel.when(@comments.smatches('arrêté')).then('1').else('0'))
977
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arrete')).then('1').else('0'))
978
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('àrrétè')).then('1').else('0'))
979
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arretez')).then('1').else('0'))
980
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('Arrete')).then('1').else('0'))
981
- 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"))
982
643
  end
983
644
 
984
645
  def test_subquery_with_order
985
- skip if ['mssql'].include?(@env_db) && Arel::VERSION.to_i < 10
986
- assert_equal 10, User.where(name: User.select(:name).order(:name)).count
987
- assert_equal 10, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
988
- if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
989
- assert_equal 2, User.where(name: User.select(:name).order(:name).limit(2)).count
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
- assert_predicate @myung.where(@age.in(1)), :blank?
996
- assert_predicate @myung.where(@age.in(23)), :present?
997
- assert_predicate @myung.where(@age.in([1])), :blank?
998
- assert_predicate @myung.where(@age.in([1, 2])), :blank?
999
- assert_predicate @myung.where(@age.in([1, 23])), :present?
1000
- assert_predicate @myung.where(@age.in(nil)), :blank?
1001
- assert_predicate @myung.where(@age.in([nil])), :blank?
1002
- assert_predicate @myung.where(@age.in([nil, 1])), :blank?
1003
- assert_predicate @myung.where(@age.in([nil, 23])), :present?
1004
- assert_predicate @myung.where(@age.in([nil, 1, 2])), :blank?
1005
- assert_predicate @myung.where(@age.in([nil, 1, 23])), :present?
1006
- assert_predicate @test.where(@age.in(1)), :blank?
1007
- assert_predicate @test.where(@age.in([1])), :blank?
1008
- assert_predicate @test.where(@age.in([1, 2])), :blank?
1009
- assert_predicate @test.where(@age.in(nil)), :present?
1010
- assert_predicate @test.where(@age.in([nil])), :present?
1011
- assert_predicate @test.where(@age.in([nil, 1])), :present?
1012
- 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?
1013
673
  end
1014
674
 
1015
675
  def test_scope_with_in_plus_new
1016
676
  begin
1017
- @test.where(@age.in([1, 2])).new
1018
- @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
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
- assert_predicate @myung.where(@age.is_not_null), :present?
1027
- 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?
1028
688
  end
1029
689
 
1030
690
  def test_not_in_with_nil
1031
- assert_predicate @myung.where(@age.not_in(1)), :present?
1032
- assert_predicate @myung.where(@age.not_in(23)), :blank?
1033
- assert_predicate @myung.where(@age.not_in([1])), :present?
1034
- assert_predicate @myung.where(@age.not_in([1, 2])), :present?
1035
- assert_predicate @myung.where(@age.not_in([1, 23])), :blank?
1036
- assert_predicate @myung.where(@age.not_in(nil)), :present?
1037
- assert_predicate @myung.where(@age.not_in([nil])), :present?
1038
- assert_predicate @myung.where(@age.not_in([nil, 1])), :present?
1039
- assert_predicate @myung.where(@age.not_in([nil, 23])), :blank?
1040
- assert_predicate @myung.where(@age.not_in([nil, 1, 2])), :present?
1041
- assert_predicate @myung.where(@age.not_in([nil, 1, 23])), :blank?
1042
-
1043
- assert_predicate @myung.where(@age.not_in(1..2)), :present?
1044
-
1045
- # if the column is null, the entry will never be selected with not in (like every DBMS does)
1046
- # assert_predicate @test.where(@age.not_in(1)), :present?
1047
- # assert_predicate @test.where(@age.not_in([1])), :present?
1048
- # assert_predicate @test.where(@age.not_in([1,2])), :present?
1049
- # assert_predicate @test.where(@age.not_in(nil)), :blank?
1050
- # assert_predicate @test.where(@age.not_in([nil])), :blank?
1051
- # assert_predicate @test.where(@age.not_in([nil,1])), :blank?
1052
- # assert_predicate @test.where(@age.not_in([nil,1,2])), :blank?
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 %w[postgresql oracle].include?(@env_db)
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 %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
1069
- 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
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
- # puts t(User.where(nil), @score.average)
1076
- # puts t(User.where(nil), @score.variance(unbiased: true))
1077
- # puts t(User.where(nil), @score.variance(unbiased: false))
1078
- # puts t(User.where(nil), @score.std(unbiased: true))
1079
- # puts t(User.where(nil), @score.std(unbiased: false))
1080
-
1081
- assert ( 15.43222 - t(User.where(nil), @score.average)).abs < 0.01
1082
- assert (539.79804 - t(User.where(nil), @score.variance)).abs < 0.01
1083
- assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
1084
- assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
1085
- assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
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 'Not Yet Implemented' if $sqlite
1095
- assert_equal 0, t(@arthur, @name.levenshtein_distance('Arthur'))
1096
- assert_equal 2, t(@arthur, @name.levenshtein_distance('Artoor'))
1097
- 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"))
1098
746
  end
1099
747
 
1100
748
  def test_json
1101
749
  skip "Can't be tested on travis"
1102
- # creation
1103
- assert_equal 'Arthur', t(@arthur, Arel.json(@name))
1104
- assert_equal %w[Arthur Arthur], parse_json(t(@arthur, Arel.json(@name, @name)))
1105
- assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 'ArthurArthur'}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => @name + @name})))
1106
- assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 1}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => 1})))
1107
- 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}])))
1108
756
 
1109
757
  # aggregate
1110
- assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure'}),
1111
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name}).group(false)))
1112
- assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure', 'Laure' => 25, 'Lucas' => 5, 'Myung' => 23, 'Sophie' => 15}),
1113
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name, @name => @age}).group(false)))
1114
- assert_equal [{'5' => 'Lucas'}, {'15' => 'Sophie'}, {'23' => 'Myung'}, {'25' => 'Laure'}],
1115
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score), Arel.json({@age => @name}).group(true, [@age])))
1116
-
1117
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_sql
1118
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_a
1119
-
1120
- skip 'Not Yet Implemented' if $sqlite || %w[oracle mssql].include?(@env_db)
1121
- # get
1122
- h1 = Arel.json({@name => @name + @name, @name + '2' => 1})
1123
- assert_equal 'ArthurArthur', parse_json(t(@arthur, h1.get(@name)))
1124
- h2 = Arel.json([{age: @age}, {name: @name, score: @score}])
1125
- assert_equal ({'age' => 21}), parse_json(t(@arthur, h2.get(0)))
1126
- assert_equal 21, parse_json(t(@arthur, h2.get(0).get('age')))
1127
- assert_nil t(@arthur, h2.get('age'))
1128
- # set
1129
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1}), parse_json(t(@arthur, h1.set(@name, %w[toto tata])))
1130
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.set(@name + '3', 2)))
1131
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => nil}), parse_json(t(@arthur, h1.set(@name + '3', nil)))
1132
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => {'a' => 2}}), parse_json(t(@arthur, h1.set(@name + '3', {a: 2})))
1133
- # merge
1134
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata]}, {@name + '3' => 2})))
1135
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata], @name + '3' => 2})))
1136
- 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({})))
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['NaMe'] || name['name'] # because of Oracle
1142
- assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes['Na Me']
1143
- 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"]
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