arel_extensions 2.1.2 → 2.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -2
  3. data/.github/workflows/ruby.yml +43 -91
  4. data/.gitignore +7 -6
  5. data/.rubocop.yml +62 -1
  6. data/Gemfile +11 -11
  7. data/README.md +1 -1
  8. data/Rakefile +4 -4
  9. data/TODO +0 -1
  10. data/appveyor.yml +73 -0
  11. data/arel_extensions.gemspec +11 -11
  12. data/gemfiles/rails3.gemfile +10 -10
  13. data/gemfiles/rails4.gemfile +14 -14
  14. data/gemfiles/rails5_0.gemfile +13 -13
  15. data/gemfiles/rails5_1_4.gemfile +13 -13
  16. data/gemfiles/rails5_2.gemfile +15 -14
  17. data/gemfiles/rails6.gemfile +13 -12
  18. data/gemfiles/rails6_1.gemfile +13 -12
  19. data/gemfiles/rails7.gemfile +9 -8
  20. data/gemspecs/arel_extensions-v1.gemspec +12 -12
  21. data/gemspecs/arel_extensions-v2.gemspec +11 -11
  22. data/init/mssql.sql +0 -0
  23. data/init/mysql.sql +0 -0
  24. data/init/oracle.sql +0 -0
  25. data/init/postgresql.sql +0 -0
  26. data/init/sqlite.sql +0 -0
  27. data/lib/arel_extensions/attributes.rb +2 -2
  28. data/lib/arel_extensions/boolean_functions.rb +2 -4
  29. data/lib/arel_extensions/common_sql_functions.rb +12 -12
  30. data/lib/arel_extensions/comparators.rb +14 -14
  31. data/lib/arel_extensions/date_duration.rb +7 -7
  32. data/lib/arel_extensions/helpers.rb +19 -16
  33. data/lib/arel_extensions/insert_manager.rb +1 -1
  34. data/lib/arel_extensions/math.rb +44 -31
  35. data/lib/arel_extensions/math_functions.rb +18 -18
  36. data/lib/arel_extensions/nodes/abs.rb +0 -0
  37. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
  38. data/lib/arel_extensions/nodes/blank.rb +1 -1
  39. data/lib/arel_extensions/nodes/case.rb +4 -6
  40. data/lib/arel_extensions/nodes/cast.rb +5 -5
  41. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  42. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  43. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  44. data/lib/arel_extensions/nodes/collate.rb +9 -9
  45. data/lib/arel_extensions/nodes/concat.rb +2 -2
  46. data/lib/arel_extensions/nodes/date_diff.rb +10 -10
  47. data/lib/arel_extensions/nodes/duration.rb +0 -0
  48. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  49. data/lib/arel_extensions/nodes/floor.rb +0 -0
  50. data/lib/arel_extensions/nodes/format.rb +0 -0
  51. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  52. data/lib/arel_extensions/nodes/function.rb +21 -21
  53. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  54. data/lib/arel_extensions/nodes/json.rb +7 -7
  55. data/lib/arel_extensions/nodes/length.rb +0 -0
  56. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  57. data/lib/arel_extensions/nodes/locate.rb +1 -1
  58. data/lib/arel_extensions/nodes/log10.rb +0 -0
  59. data/lib/arel_extensions/nodes/matches.rb +1 -1
  60. data/lib/arel_extensions/nodes/md5.rb +0 -0
  61. data/lib/arel_extensions/nodes/power.rb +0 -0
  62. data/lib/arel_extensions/nodes/rand.rb +0 -0
  63. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  64. data/lib/arel_extensions/nodes/replace.rb +2 -2
  65. data/lib/arel_extensions/nodes/round.rb +0 -0
  66. data/lib/arel_extensions/nodes/soundex.rb +2 -2
  67. data/lib/arel_extensions/nodes/std.rb +0 -0
  68. data/lib/arel_extensions/nodes/substring.rb +1 -1
  69. data/lib/arel_extensions/nodes/sum.rb +0 -0
  70. data/lib/arel_extensions/nodes/then.rb +1 -1
  71. data/lib/arel_extensions/nodes/trim.rb +2 -2
  72. data/lib/arel_extensions/nodes/union.rb +4 -4
  73. data/lib/arel_extensions/nodes/union_all.rb +3 -3
  74. data/lib/arel_extensions/nodes/wday.rb +0 -0
  75. data/lib/arel_extensions/nodes.rb +0 -0
  76. data/lib/arel_extensions/null_functions.rb +0 -0
  77. data/lib/arel_extensions/predications.rb +10 -10
  78. data/lib/arel_extensions/railtie.rb +1 -1
  79. data/lib/arel_extensions/set_functions.rb +3 -3
  80. data/lib/arel_extensions/string_functions.rb +8 -8
  81. data/lib/arel_extensions/tasks.rb +2 -2
  82. data/lib/arel_extensions/version.rb +1 -1
  83. data/lib/arel_extensions/visitors/convert_format.rb +0 -0
  84. data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
  85. data/lib/arel_extensions/visitors/mssql.rb +150 -130
  86. data/lib/arel_extensions/visitors/mysql.rb +147 -149
  87. data/lib/arel_extensions/visitors/oracle.rb +141 -135
  88. data/lib/arel_extensions/visitors/oracle12.rb +16 -16
  89. data/lib/arel_extensions/visitors/postgresql.rb +147 -139
  90. data/lib/arel_extensions/visitors/sqlite.rb +85 -87
  91. data/lib/arel_extensions/visitors/to_sql.rb +146 -148
  92. data/lib/arel_extensions/visitors.rb +7 -7
  93. data/lib/arel_extensions.rb +56 -32
  94. data/test/arelx_test_helper.rb +14 -13
  95. data/test/database.yml +5 -5
  96. data/test/real_db_test.rb +81 -81
  97. data/test/support/fake_record.rb +2 -2
  98. data/test/test_comparators.rb +5 -5
  99. data/test/visitors/test_bulk_insert_oracle.rb +5 -5
  100. data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
  101. data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
  102. data/test/visitors/test_oracle.rb +14 -14
  103. data/test/visitors/test_to_sql.rb +87 -87
  104. data/test/with_ar/all_agnostic_test.rb +411 -306
  105. data/test/with_ar/insert_agnostic_test.rb +19 -16
  106. data/test/with_ar/test_bulk_sqlite.rb +5 -5
  107. data/test/with_ar/test_math_sqlite.rb +12 -12
  108. data/test/with_ar/test_string_mysql.rb +20 -20
  109. data/test/with_ar/test_string_sqlite.rb +20 -20
  110. data/version_v1.rb +1 -1
  111. data/version_v2.rb +1 -1
  112. metadata +3 -9
  113. data/.travis/oracle/download.js +0 -152
  114. data/.travis/oracle/download.sh +0 -30
  115. data/.travis/oracle/download_ojdbc.js +0 -116
  116. data/.travis/oracle/install.sh +0 -34
  117. data/.travis/setup_accounts.sh +0 -9
  118. data/.travis/sqlite3/extension-functions.sh +0 -6
  119. data/.travis.yml +0 -193
@@ -7,9 +7,9 @@ module ArelExtensions
7
7
  require 'minitest/pride'
8
8
  def connect_db
9
9
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
10
- if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
11
- @env_db = (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
12
- skip "Platform not supported"
10
+ if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
11
+ @env_db = (RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
12
+ skip "Platform not supported (DB: #{ENV['DB']}, RUBY_ENGINE: #{RUBY_ENGINE}, RUBY_PLATFORM: #{RUBY_PLATFORM})"
13
13
  else
14
14
  @env_db = ENV['DB']
15
15
  end
@@ -36,11 +36,11 @@ module ArelExtensions
36
36
  t.column :updated_at, :datetime, precision: nil
37
37
  t.column :duration, :time
38
38
  t.column :other, :string
39
- t.column :score, :decimal, :precision => 20, :scale => 10
39
+ t.column :score, :decimal, precision: 20, scale: 10
40
40
  end
41
41
  @cnx.drop_table(:product_tests) rescue nil
42
42
  @cnx.create_table :product_tests do |t|
43
- t.column :price, :decimal, :precision => 20, :scale => 10
43
+ t.column :price, :decimal, precision: 20, scale: 10
44
44
  end
45
45
  end
46
46
 
@@ -55,24 +55,24 @@ module ArelExtensions
55
55
  d = Date.new(2016, 5, 23)
56
56
  connect_db
57
57
  setup_db
58
- u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16, :updated_at => Time.utc(2014, 3, 3, 12, 42, 0)
59
- @lucas = User.where(:id => u.id)
60
- u = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
61
- @sophie = User.where(:id => u.id)
62
- u = User.create :age => 20, :name => "Camille", :created_at => d, :score => -20.16, :comments => ''
63
- @camille = User.where(:id => u.id)
64
- u = User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62, :comments => 'arrêté'
65
- @arthur = User.where(:id => u.id)
66
- u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16, :comments => ' '
67
- @myung = User.where(:id => u.id)
68
- 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)
69
- @laure = User.where(:id => u.id)
70
- u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62, :other => 'toto'
71
- @test = User.where(:id => u.id)
72
- u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
73
- @neg = User.where(:id => u.id)
74
- u = User.create :age => 15, :name => "Justin", :created_at => d, :score => 11.0
75
- @justin = User.where(:id => u.id)
58
+ u = User.create age: 5, name: 'Lucas', created_at: d, score: 20.16, updated_at: Time.utc(2014, 3, 3, 12, 42, 0)
59
+ @lucas = User.where(id: u.id)
60
+ u = User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
61
+ @sophie = User.where(id: u.id)
62
+ u = User.create age: 20, name: 'Camille', created_at: d, score: -20.16, comments: ''
63
+ @camille = User.where(id: u.id)
64
+ u = User.create age: 21, name: 'Arthur', created_at: d, score: 65.62, comments: 'arrêté'
65
+ @arthur = User.where(id: u.id)
66
+ u = User.create age: 23, name: 'Myung', created_at: d, score: 20.16, comments: ' '
67
+ @myung = User.where(id: u.id)
68
+ 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)
69
+ @laure = User.where(id: u.id)
70
+ u = User.create age: nil, name: 'Test', created_at: d, score: 1.62, other: 'toto'
71
+ @test = User.where(id: u.id)
72
+ u = User.create age: -42, name: 'Negatif', comments: '1,22,3,42,2', created_at: d, updated_at: d.to_time, score: 0.17
73
+ @neg = User.where(id: u.id)
74
+ u = User.create age: 15, name: 'Justin', created_at: d, score: 11.0
75
+ @justin = User.where(id: u.id)
76
76
 
77
77
  @age = User.arel_table[:age]
78
78
  @name = User.arel_table[:name]
@@ -107,6 +107,14 @@ module ArelExtensions
107
107
  end
108
108
  end
109
109
 
110
+ # Connection and column info
111
+ def test_column_of
112
+ assert_nil Arel.column_of('chupa', 'maflavla'), 'Non-existent table and column should return nil'
113
+ assert_nil Arel.column_of('chupa', 'updated_at'), 'Non-existent table but existent column should return nil'
114
+ assert_nil Arel.column_of('user_tests', 'maflavla'), 'Existent table but non-existent column should return nil'
115
+ assert_equal 'updated_at', Arel.column_of('user_tests', 'updated_at').name, 'An existing column name should be returned'
116
+ end
117
+
110
118
  # Math Functions
111
119
  def test_classical_arel
112
120
  assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
@@ -153,16 +161,16 @@ module ArelExtensions
153
161
 
154
162
  def test_sum
155
163
  if @env_db == 'mssql'
156
- skip "SQL Server forces order?" # TODO
157
- assert_equal 83, User.select((@age.sum + 1).as("res"), User.arel_table[:id].sum).take(50).reorder(@age).first.res
158
- assert_equal 164, User.reorder(nil).select((@age.sum + @age.sum).as("res"), User.arel_table[:id].sum).take(50).first.res
159
- assert_equal 246, User.reorder(nil).select(((@age * 3).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
160
- assert_equal 4234, User.reorder(nil).select(((@age * @age).sum).as("res"), User.arel_table[:id].sum).take(50).first.res
164
+ skip 'SQL Server forces order?' # TODO
165
+ assert_equal 83, User.select((@age.sum + 1).as('res'), User.arel_table[:id].sum).take(50).reorder(@age).first.res
166
+ assert_equal 164, User.reorder(nil).select((@age.sum + @age.sum).as('res'), User.arel_table[:id].sum).take(50).first.res
167
+ assert_equal 246, User.reorder(nil).select(((@age * 3).sum).as('res'), User.arel_table[:id].sum).take(50).first.res
168
+ assert_equal 4234, User.reorder(nil).select(((@age * @age).sum).as('res'), User.arel_table[:id].sum).take(50).first.res
161
169
  else
162
- assert_equal 83, User.select((@age.sum + 1).as("res")).take(50).first.res
163
- assert_equal 164, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
164
- assert_equal 246, User.select((@age * 3).sum.as("res")).take(50).first.res
165
- assert_equal 4234, User.select(((@age * @age).sum).as("res")).take(50).first.res
170
+ assert_equal 83, User.select((@age.sum + 1).as('res')).take(50).first.res
171
+ assert_equal 164, User.select((@age.sum + @age.sum).as('res')).take(50).first.res
172
+ assert_equal 246, User.select((@age * 3).sum.as('res')).take(50).first.res
173
+ assert_equal 4234, User.select(((@age * @age).sum).as('res')).take(50).first.res
166
174
  end
167
175
  end
168
176
 
@@ -182,19 +190,19 @@ module ArelExtensions
182
190
  def test_concat
183
191
  assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
184
192
  assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
185
- assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
193
+ assert_equal 'Test Laure', t(@laure, Arel.quoted('Test ') + @name)
186
194
 
187
- skip "No group_concat in SqlServer before 2017" if @env_db == 'mssql'
188
- assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
189
- assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
190
- assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
195
+ skip 'No group_concat in SqlServer before 2017' if @env_db == 'mssql'
196
+ assert_equal 'Lucas Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(' '))
197
+ assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(','))
198
+ assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat)
191
199
 
192
- skip "No order in group_concat in SqlLite" if $sqlite
193
- assert_equal "Arthur,Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.asc))
194
- assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
195
- assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
196
- assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
197
- assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',order: [@score.asc,@name.asc]))
200
+ skip 'No order in group_concat in SqlLite' if $sqlite
201
+ assert_equal 'Arthur,Lucas,Sophie', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.asc))
202
+ assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.desc))
203
+ assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', [@score.asc, @name.asc]))
204
+ assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @score.asc, @name.asc))
205
+ assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
198
206
  end
199
207
 
200
208
  def test_length
@@ -205,15 +213,15 @@ module ArelExtensions
205
213
 
206
214
  def test_md5
207
215
  skip "Sqlite can't do md5" if $sqlite
208
- assert_equal "e2cf99ca82a7e829d2a4ac85c48154d0", t(@camille, @name.md5)
209
- assert_equal "c3d41bf5efb468a1bcce53bd53726c85", t(@lucas, @name.md5)
216
+ assert_equal 'e2cf99ca82a7e829d2a4ac85c48154d0', t(@camille, @name.md5)
217
+ assert_equal 'c3d41bf5efb468a1bcce53bd53726c85', t(@lucas, @name.md5)
210
218
  end
211
219
 
212
220
  def test_locate
213
221
  skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
214
- assert_equal 1, t(@camille, @name.locate("C"))
215
- assert_equal 0, t(@lucas, @name.locate("z"))
216
- assert_equal 5, t(@lucas, @name.locate("s"))
222
+ assert_equal 1, t(@camille, @name.locate('C'))
223
+ assert_equal 0, t(@lucas, @name.locate('z'))
224
+ assert_equal 5, t(@lucas, @name.locate('s'))
217
225
  end
218
226
 
219
227
  def test_substring
@@ -223,7 +231,7 @@ module ArelExtensions
223
231
  else
224
232
  assert_equal('', t(@lucas, @name.substring(42)))
225
233
  end
226
- assert_equal 'Lu', t(@lucas, @name.substring(1,2))
234
+ assert_equal 'Lu', t(@lucas, @name.substring(1, 2))
227
235
 
228
236
  assert_equal 'C', t(@camille, @name[0, 1])
229
237
  assert_equal 'C', t(@camille, @name[0])
@@ -232,17 +240,17 @@ module ArelExtensions
232
240
  else
233
241
  assert_equal('', t(@lucas, @name[42]))
234
242
  end
235
- assert_equal 'Lu', t(@lucas, @name[0,2])
243
+ assert_equal 'Lu', t(@lucas, @name[0, 2])
236
244
  assert_equal 'Lu', t(@lucas, @name[0..1])
237
245
 
238
246
  # substring should accept string function
239
247
  assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
240
- assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
248
+ assert_equal 'Ce', t(@camille, @name.substring(1, 1) + 'e')
241
249
  end
242
250
 
243
251
  def test_find_in_set
244
252
  skip "Sqlite version can't load extension for find_in_set" if $sqlite && $load_extension_disabled
245
- skip "SQL Server does not know about FIND_IN_SET" if @env_db == 'mssql'
253
+ skip 'SQL Server does not know about FIND_IN_SET' if @env_db == 'mssql'
246
254
  assert_equal 5, t(@neg, @comments & 2)
247
255
  assert_equal 0, t(@neg, @comments & 6) # not found
248
256
  end
@@ -254,10 +262,10 @@ module ArelExtensions
254
262
  assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
255
263
  assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
256
264
  elsif @env_db == 'oracle'
257
- assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
258
- assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name <= (@name + 'Z')).then(1).else(0))
259
- assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name > 'Mest').then(1).else(0))
260
- assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name < (@name + 'Z')).then(1).else(0))
265
+ assert_equal 1, t(@neg, Arel.when(@name >= 'Mest').then(1).else(0))
266
+ assert_equal 1, t(@neg, Arel.when(@name <= (@name + 'Z')).then(1).else(0))
267
+ assert_equal 1, t(@neg, Arel.when(@name > 'Mest').then(1).else(0))
268
+ assert_equal 1, t(@neg, Arel.when(@name < (@name + 'Z')).then(1).else(0))
261
269
  else
262
270
  assert_equal 1, t(@neg, @name >= 'Mest')
263
271
  assert_equal 1, t(@neg, @name <= (@name + 'Z'))
@@ -270,21 +278,21 @@ module ArelExtensions
270
278
  skip "Sqlite can't compare time" if $sqlite
271
279
  skip "Oracle can't compare time" if @env_db == 'oracle'
272
280
  # @created_at == 2016-05-23
273
- assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
274
- assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
281
+ assert_includes [true, 't', 1], t(@laure, Arel.when(@created_at >= '2014-01-01').then(1).else(0))
282
+ assert_includes [false, 'f', 0], t(@laure, Arel.when(@created_at >= '2018-01-01').then(1).else(0))
275
283
  # @updated_at == 2014-03-03 12:42:00
276
- assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
277
- assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
284
+ assert_includes [true, 't', 1], t(@laure, Arel.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
285
+ assert_includes [false, 'f', 0], t(@laure, Arel.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
278
286
  # @duration == 12:42:21
279
- # puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
280
- # puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
281
- assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
282
- assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
287
+ # puts @laure.select(Arel.when(@duration >= '10:10:10').then(1).else(0)).to_sql
288
+ # puts @laure.select(Arel.when(@duration >= '14:10:10').then(1).else(0)).to_sql
289
+ assert_includes [true, 't', 1], t(@laure, Arel.when(@duration >= '10:10:10').then(1).else(0))
290
+ assert_includes [false, 'f', 0], t(@laure, Arel.when(@duration >= '14:10:10').then(1).else(0))
283
291
  end
284
292
 
285
293
  def test_regexp_not_regexp
286
294
  skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
287
- skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
295
+ skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
288
296
  assert_equal 1, User.where(@name =~ '^M').count
289
297
  assert_equal 7, User.where(@name !~ '^L').count
290
298
  assert_equal 1, User.where(@name =~ /^M/).count
@@ -299,45 +307,45 @@ module ArelExtensions
299
307
  end
300
308
 
301
309
  def test_replace
302
- assert_equal "LucaX", t(@lucas, @name.replace("s", "X"))
303
- assert_equal "replace", t(@lucas, @name.replace(@name, "replace"))
310
+ assert_equal 'LucaX', t(@lucas, @name.replace('s', 'X'))
311
+ assert_equal 'replace', t(@lucas, @name.replace(@name, 'replace'))
304
312
 
305
- skip "Sqlite does not seem to support regexp_replace" if $sqlite
306
- skip "SQL Server does not know about REGEXP without extensions" if @env_db == 'mssql'
307
- skip "Travis mysql version does not support REGEXP_REPLACE" if @env_db == 'mysql'
308
- assert_equal "LXcXs", t(@lucas, @name.replace(/[ua]/, "X"))
309
- assert_equal "LXcXs", t(@lucas, @name.regexp_replace(/[ua]/, "X"))
310
- assert_equal "LXcXs", t(@lucas, @name.regexp_replace('[ua]', "X"))
313
+ skip 'Sqlite does not seem to support regexp_replace' if $sqlite
314
+ skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
315
+ skip 'Travis mysql version does not support REGEXP_REPLACE' if @env_db == 'mysql'
316
+ assert_equal 'LXcXs', t(@lucas, @name.replace(/[ua]/, 'X'))
317
+ assert_equal 'LXcXs', t(@lucas, @name.regexp_replace(/[ua]/, 'X'))
318
+ assert_equal 'LXcXs', t(@lucas, @name.regexp_replace('[ua]', 'X'))
311
319
  end
312
320
 
313
321
  def test_replace_once
314
- skip "TODO"
322
+ skip 'TODO'
315
323
  # skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
316
- assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
324
+ assert_equal 'LuCas', t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
317
325
  end
318
326
 
319
327
  def test_soundex
320
328
  skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
321
329
  skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
322
- assert_equal "C540", t(@camille, @name.soundex)
330
+ assert_equal 'C540', t(@camille, @name.soundex)
323
331
  assert_equal 9, User.where(@name.soundex.eq(@name.soundex)).count
324
332
  assert_equal 9, User.where(@name.soundex == @name.soundex).count
325
333
  end
326
334
 
327
335
  def test_change_case
328
- assert_equal "myung", t(@myung, @name.downcase)
329
- assert_equal "MYUNG", t(@myung, @name.upcase)
330
- assert_equal "myung", t(@myung, @name.upcase.downcase)
336
+ assert_equal 'myung', t(@myung, @name.downcase)
337
+ assert_equal 'MYUNG', t(@myung, @name.upcase)
338
+ assert_equal 'myung', t(@myung, @name.upcase.downcase)
331
339
  end
332
340
 
333
341
  def test_trim
334
- assert_equal "Myung", t(@myung, @name.trim)
335
- assert_equal "Myung", t(@myung, @name.trim.ltrim.rtrim)
336
- assert_equal "Myun", t(@myung, @name.rtrim("g"))
337
- assert_equal "yung", t(@myung, @name.ltrim("M"))
338
- assert_equal "yung", t(@myung, (@name + "M").trim("M"))
339
- skip "Oracle does not accept multi char trim" if @env_db == 'oracle'
340
- assert_equal "", t(@myung, @name.rtrim(@name))
342
+ assert_equal 'Myung', t(@myung, @name.trim)
343
+ assert_equal 'Myung', t(@myung, @name.trim.ltrim.rtrim)
344
+ assert_equal 'Myun', t(@myung, @name.rtrim('g'))
345
+ assert_equal 'yung', t(@myung, @name.ltrim('M'))
346
+ assert_equal 'yung', t(@myung, (@name + 'M').trim('M'))
347
+ skip 'Oracle does not accept multi char trim' if @env_db == 'oracle'
348
+ assert_equal '', t(@myung, @name.rtrim(@name))
341
349
  end
342
350
 
343
351
  def test_blank
@@ -411,53 +419,150 @@ module ArelExtensions
411
419
  }
412
420
  }
413
421
 
414
- skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !['mssql', 'mysql', 'oracle', 'postgresql'].include?(ENV['DB'])
422
+ skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
423
+ # TODO: Standarize timezone conversion across all databases.
424
+ # This test case will be refactored and should work the same across all vendors.
425
+ if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
426
+ skip "SQL Server < 2016 is not currently supported"
427
+ end
415
428
 
416
429
  tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
417
430
 
418
431
  assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', tz['utc']))
419
- assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', { tz['utc'] => tz['sao_paulo'] }))
420
- assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', { tz['utc'] => tz['tahiti'] }))
432
+ assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
433
+ assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
421
434
 
422
435
  # Skipping conversion from UTC to the desired timezones fails in SQL
423
436
  # Server and Postgres. This is mainly due to the fact that timezone
424
437
  # information is not preserved in the column itself.
425
438
  #
426
439
  # MySQL is happy to consider that times by default are in UTC.
427
- assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', { tz['utc'] => tz['paris'] }))
440
+ assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
428
441
  refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', tz['paris'])) if !['mysql'].include?(ENV['DB'])
429
442
 
430
443
  # Winter/Summer time
431
- assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).format('%Y/%m/%d %H:%M:%S', { tz['utc'] => tz['paris'] }))
444
+ assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
432
445
  if ENV['DB'] == 'mssql'
433
- assert_equal '2022/02/01 11:42:00', t(@lucas, Arel::Nodes.build_quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', { tz['utc'] => tz['paris'] }))
434
- assert_equal '2022/08/01 12:42:00', t(@lucas, Arel::Nodes.build_quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', { tz['utc'] => tz['paris'] }))
446
+ assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
447
+ assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
435
448
  else
436
- assert_equal '2022/02/01 11:42:00', t(@lucas, Arel::Nodes.build_quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
437
- assert_equal '2022/08/01 12:42:00', t(@lucas, Arel::Nodes.build_quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
449
+ assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
450
+ assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
451
+ end
452
+ end
453
+
454
+ def test_format_iso_week
455
+ skip "Unsupported ISO week number for DB=#{ENV['DB']}" if ['sqlite'].include?(ENV['DB'])
456
+ assert_equal '10', t(@lucas, @updated_at.format('%V'))
457
+ {
458
+ '2024-01-01 10:42:00' => '01', # Monday
459
+ '2030-01-01 10:42:00' => '01', # Tuesday
460
+ '2025-01-01 10:42:00' => '01', # Wednesday
461
+ '2026-01-01 10:42:00' => '01', # Thursday
462
+ '2027-01-01 10:42:00' => '53', # Friday
463
+ '2028-01-01 10:42:00' => '52', # Saturday
464
+ '2034-01-01 10:42:00' => '52', # Sunday
465
+ }.each do |date, exp|
466
+ assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).format('%V'))
467
+ end
468
+ end
469
+
470
+ def test_format_iso_year_of_week
471
+ skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
472
+ assert_equal '2014', t(@lucas, @updated_at.format('%G'))
473
+
474
+ {
475
+ '2024-01-01 10:42:00' => '2024', # Monday
476
+ '2030-01-01 10:42:00' => '2030', # Tuesday
477
+ '2025-01-01 10:42:00' => '2025', # Wednesday
478
+ '2026-01-01 10:42:00' => '2026', # Thursday
479
+ '2027-01-01 10:42:00' => '2026', # Friday
480
+ '2028-01-01 10:42:00' => '2027', # Saturday
481
+ '2034-01-01 10:42:00' => '2033', # Sunday
482
+ }.each do |date, exp|
483
+ assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).format('%G'))
484
+ end
485
+ end
486
+
487
+ def test_format_date_with_names
488
+ skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
489
+ assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
490
+ assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
491
+
492
+ skip "#{ENV['DB']} does not support ALLCAPS month and day names" if ['mysql'].include?(ENV['DB'])
493
+ assert_equal 'Mon, 03 MAR 14', t(@lucas, @updated_at.format('%a, %d %^b %y'))
494
+ assert_equal 'Monday, 03 MARCH 14', t(@lucas, @updated_at.format('%A, %d %^B %y'))
495
+ end
496
+
497
+ def switch_to_lang(lang)
498
+ languages = {
499
+ 'mssql' => {en: 'English', fr: 'French'},
500
+ 'mysql' => {en: 'en_US', fr: 'fr_FR'},
501
+ 'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
502
+ }
503
+
504
+ sql = {
505
+ 'mssql' => ->(l) { "SET LANGUAGE #{l};" },
506
+ 'mysql' => ->(l) { "SET lc_time_names = '#{l}';" },
507
+ 'postgresql' => ->(l) { "SET lc_time to '#{l}';" }
508
+ }
509
+
510
+ User.connection.execute(sql[ENV['DB']][languages[ENV['DB']][lang]])
511
+ end
512
+
513
+ def test_format_date_with_names_and_lang_switch
514
+ skip "#{ENV['DB']} does not support word-based formatting for month and day names" if ['sqlite'].include?(ENV['DB'])
515
+
516
+ # the begin-rescue block is here to make sure we set the db back to en_US
517
+ # if we fail, so that other tests don't get contaminated.
518
+ #
519
+ # Tests should assert one single thing in principle, but until we
520
+ # refactor this whole thing, we'll have to do tricks of this sort.
521
+ begin
522
+ switch_to_lang(:en)
523
+ case ENV['DB']
524
+ when 'mysql', 'postgresql'
525
+ assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
526
+ assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
527
+ when 'mssql'
528
+ assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.format('%A, %d %B %y'))
529
+ end
530
+ switch_to_lang(:fr)
531
+ case ENV['DB']
532
+ when 'mysql'
533
+ assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
534
+ assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
535
+ when 'postgresql'
536
+ assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
537
+ assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
538
+ when 'mssql'
539
+ assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.format('%A, %d %B %y'))
540
+ end
541
+ ensure
542
+ switch_to_lang(:en)
438
543
  end
439
544
  end
440
545
 
441
546
  def test_coalesce
442
- assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
547
+ assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, 'default') + ' concat')
443
548
 
444
- assert_equal 'toto', t(@test, @other.coalesce(""))
549
+ assert_equal 'toto', t(@test, @other.coalesce(''))
445
550
 
446
- assert_equal ' ', t(@myung, @comments.coalesce("Myung").coalesce('ignored'))
447
- assert_equal 'Laure', t(@laure, @comments.coalesce("Laure"))
551
+ assert_equal ' ', t(@myung, @comments.coalesce('Myung').coalesce('ignored'))
552
+ assert_equal 'Laure', t(@laure, @comments.coalesce('Laure'))
448
553
  if @env_db == 'oracle'
449
- assert_nil t(@laure, @comments.coalesce(""))
450
- assert_nil t(@camille, @other.coalesce(""))
554
+ assert_nil t(@laure, @comments.coalesce(''))
555
+ assert_nil t(@camille, @other.coalesce(''))
451
556
  else
452
- assert_equal('', t(@laure, @comments.coalesce("")))
453
- assert_equal '', t(@camille, @other.coalesce(""))
557
+ assert_equal('', t(@laure, @comments.coalesce('')))
558
+ assert_equal '', t(@camille, @other.coalesce(''))
454
559
  end
455
560
  assert_equal 100, t(@test, @age.coalesce(100))
456
- assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
561
+ assert_equal 'Camille', t(@camille, @name.coalesce(nil, 'default'))
457
562
  assert_equal 20, t(@test, @age.coalesce(nil, 20))
458
563
 
459
- assert_equal 20, t(@test, @age.coalesce(10)+10)
460
- assert_equal 'Laure10', t(@laure, @comments.coalesce("Laure") + 10)
564
+ assert_equal 20, t(@test, @age.coalesce(10) + 10)
565
+ assert_equal 'Laure10', t(@laure, @comments.coalesce('Laure') + 10)
461
566
  end
462
567
 
463
568
  # Comparators
@@ -478,16 +583,16 @@ module ArelExtensions
478
583
  def test_date_duration
479
584
  # Year
480
585
  assert_equal 2016, t(@lucas, @created_at.year).to_i
481
- assert_equal 0, User.where(@created_at.year.eq("2012")).count
586
+ assert_equal 0, User.where(@created_at.year.eq('2012')).count
482
587
  # Month
483
588
  assert_equal 5, t(@camille, @created_at.month).to_i
484
- assert_equal 9, User.where(@created_at.month.eq("05")).count
589
+ assert_equal 9, User.where(@created_at.month.eq('05')).count
485
590
  # Week
486
591
  assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
487
- assert_equal 9, User.where(@created_at.month.eq("05")).count
592
+ assert_equal 9, User.where(@created_at.month.eq('05')).count
488
593
  # Day
489
594
  assert_equal 23, t(@laure, @created_at.day).to_i
490
- assert_equal 0, User.where(@created_at.day.eq("05")).count
595
+ assert_equal 0, User.where(@created_at.day.eq('05')).count
491
596
 
492
597
  # skip "manage DATE" if @env_db == 'oracle'
493
598
  # Hour
@@ -504,8 +609,8 @@ module ArelExtensions
504
609
  def test_datetime_diff
505
610
  assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
506
611
  if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
507
- assert_equal 42 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
508
- assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
612
+ assert_equal 42 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
613
+ assert_equal(-3600 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
509
614
  else
510
615
  assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
511
616
  assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
@@ -517,7 +622,7 @@ module ArelExtensions
517
622
  end
518
623
 
519
624
 
520
- skip "not yet implemented" if $sqlite
625
+ skip 'not yet implemented' if $sqlite
521
626
 
522
627
  date1 = Date.new(2016, 5, 23)
523
628
  durPos = 10.years
@@ -530,27 +635,27 @@ module ArelExtensions
530
635
  datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
531
636
  # Pull Request #5 tests
532
637
  # puts (@created_at + durPos).cast(:date).to_sql
533
- assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos).cast(:date))
534
- assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg).cast(:date))
638
+ assert_includes [date2, '2026-05-23'], t(@test, (@created_at + durPos).cast(:date))
639
+ assert_includes [date3, '2006-05-23'], t(@test, (@created_at + durNeg).cast(:date))
535
640
 
536
641
  # puts (@created_at + @created_at.day).cast(:date).to_sql
537
- assert_includes [date4,"2016-06-15"], t(@test,(@created_at + @created_at.day).cast(:date))
642
+ assert_includes [date4, '2016-06-15'], t(@test, (@created_at + @created_at.day).cast(:date))
538
643
  # puts (@created_at - @created_at.day).cast(:date).to_sql
539
- assert_includes [date5,"2016-04-30"], t(@test,(@created_at - @created_at.day).cast(:date))
644
+ assert_includes [date5, '2016-04-30'], t(@test, (@created_at - @created_at.day).cast(:date))
540
645
 
541
- assert_includes [datetime1 + 42.seconds,"2014-03-03 12:42:42 UTC"], t(@lucas,(@updated_at + @updated_at.minute))
542
- assert_includes [datetime1 - 42.seconds,"2014-03-03 12:41:18 UTC"], t(@lucas,(@updated_at - @updated_at.minute))
646
+ assert_includes [datetime1 + 42.seconds, '2014-03-03 12:42:42 UTC'], t(@lucas, (@updated_at + @updated_at.minute))
647
+ assert_includes [datetime1 - 42.seconds, '2014-03-03 12:41:18 UTC'], t(@lucas, (@updated_at - @updated_at.minute))
543
648
 
544
649
  # (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
545
- assert_includes [datetime1 + (12*60+42).seconds,"2014-03-03 12:54:42 UTC"],
546
- t(@lucas,(@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))))
650
+ assert_includes [datetime1 + (12 * 60 + 42).seconds, '2014-03-03 12:54:42 UTC'],
651
+ t(@lucas, (@updated_at + Arel.duration('s', (@updated_at.hour * 60 + @updated_at.minute))))
547
652
 
548
- assert_includes [datetime1 + (12*60+42).minutes,"2014-03-04 01:24:00 UTC"],
549
- t(@lucas,(@updated_at + Arel.duration('mn',(@updated_at.hour*60 + @updated_at.minute))))
653
+ assert_includes [datetime1 + (12 * 60 + 42).minutes, '2014-03-04 01:24:00 UTC'],
654
+ t(@lucas, (@updated_at + Arel.duration('mn', (@updated_at.hour * 60 + @updated_at.minute))))
550
655
 
551
- assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
656
+ assert_includes ['2024-03-03'], t(@lucas, (@updated_at + durPos).format('%Y-%m-%d'))
552
657
  # puts (@updated_at - durPos).to_sql
553
- assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
658
+ assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format('%Y-%m-%d'))
554
659
 
555
660
 
556
661
  # we test with the ruby object or the string because some adapters don't return an object Date
@@ -559,29 +664,29 @@ module ArelExtensions
559
664
 
560
665
  # TODO; cast types
561
666
  def test_cast_types
562
- assert_equal "5", t(@lucas, @age.cast(:string))
563
- skip "jdbc adapters does not work properly here (v52 works fine)" if RUBY_PLATFORM =~ /java/i
667
+ assert_equal '5', t(@lucas, @age.cast(:string))
668
+ skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM.match?(/java/i)
564
669
  if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
565
- 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'
566
- assert_equal 1, t(@laure,Arel.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
567
- assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
568
- assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
569
- assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
570
- assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
670
+ 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'
671
+ assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle'
672
+ assert_equal '20.16', t(@laure, @score.cast(:string)).gsub(/0*\z/, '')
673
+ assert_equal '20.161', t(@laure, @score.cast(:string) + 1).gsub(/0*1\z/, '1')
674
+ assert_equal 21.16, t(@laure, @score.cast(:string).cast(:decimal) + 1)
675
+ assert_equal 21, t(@laure, @score.cast(:string).cast(:int) + 1)
571
676
 
572
- assert_equal String, t(@lucas,@updated_at.cast(:string)).class
677
+ assert_equal String, t(@lucas, @updated_at.cast(:string)).class
573
678
 
574
- assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
575
- assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
576
- assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
679
+ assert_equal Date, t(@lucas, @updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
680
+ assert_equal Time, t(@lucas, @updated_at.cast(:string).cast(:datetime)).class
681
+ assert_equal Time, t(@lucas, @updated_at.cast(:time)).class
577
682
 
578
683
  # mysql adapter in rails7 adds some infos we just squeeze here
579
- assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)).split('.').first unless @env_db == 'mssql' # locale dependent
580
- assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
581
- assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
582
- assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
583
- assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
584
- assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
684
+ assert_equal '2014-03-03 12:42:00', t(@lucas, @updated_at.cast(:string)).split('.').first unless @env_db == 'mssql' # locale dependent
685
+ assert_equal Date.parse('2014-03-03'), t(@lucas, Arel.quoted('2014-03-03').cast(:date))
686
+ assert_equal Date.parse('5014-03-03'), t(@lucas, (@age.cast(:string) + '014-03-03').cast(:date))
687
+ assert_equal Time.parse('2014-03-03 12:42:00 UTC'), t(@lucas, @updated_at.cast(:string).cast(:datetime))
688
+ assert_equal Date.parse('2014-03-03'), t(@lucas, @updated_at.cast(:date))
689
+ assert_equal '12:42:00', t(@lucas, @updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
585
690
  end
586
691
  end
587
692
 
@@ -591,42 +696,42 @@ module ArelExtensions
591
696
  # puts @age.is_null.inspect
592
697
  # puts @age.is_null.to_sql
593
698
  # puts @age=='34'
594
- assert_equal "Test", User.select(@name).where(@age.is_null).first.name
699
+ assert_equal 'Test', User.select(@name).where(@age.is_null).first.name
595
700
  end
596
701
 
597
702
  def test_math_plus
598
703
  d = Date.new(1997, 6, 15)
599
704
  # Concat String
600
- assert_equal "SophiePhan", t(@sophie, @name + "Phan")
601
- assert_equal "Sophie2", t(@sophie, @name + 2)
602
- assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
603
- assert_equal "Sophie15", t(@sophie, @name + @age)
604
- assert_equal "SophieSophie", t(@sophie, @name + @name)
605
- assert_equal "SophieSophieSophie", t(@sophie, @name + @name + @name)
606
- assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name.concat(@name)))
607
- assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name).concat(@name))
705
+ assert_equal 'SophiePhan', t(@sophie, @name + 'Phan')
706
+ assert_equal 'Sophie2', t(@sophie, @name + 2)
707
+ assert_equal 'Sophie1997-06-15', t(@sophie, @name + d)
708
+ assert_equal 'Sophie15', t(@sophie, @name + @age)
709
+ assert_equal 'SophieSophie', t(@sophie, @name + @name)
710
+ assert_equal 'SophieSophieSophie', t(@sophie, @name + @name + @name)
711
+ assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name.concat(@name)))
712
+ assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name).concat(@name))
608
713
  # FIXME: should work as expected in Oracle
609
- assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
714
+ assert_equal 'Sophie2016-05-23', t(@sophie, @name + @created_at) unless @env_db == 'oracle'
610
715
  # concat Integer
611
716
  assert_equal 1, User.where((@age + 10).eq(33)).count
612
- assert_equal 1, User.where((@age + "1").eq(6)).count
717
+ assert_equal 1, User.where((@age + '1').eq(6)).count
613
718
  assert_equal 1, User.where((@age + @age).eq(10)).count
614
719
  # concat Date
615
720
  # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
616
- assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
617
- assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
721
+ assert_equal '2016-05-24', t(@myung, @created_at + 1).to_date.to_s
722
+ assert_equal '2016-05-25', t(@myung, @created_at + 2.day).to_date.to_s
618
723
  end
619
724
 
620
725
  def test_math_minus
621
726
  d = Date.new(2016, 5, 20)
622
727
  # Datediff
623
728
  assert_equal 9, User.where((@created_at - @created_at).eq(0)).count
624
- assert_equal 3, @laure.select((@created_at - d).as("res")).first.res.abs.to_i
729
+ assert_equal 3, @laure.select((@created_at - d).as('res')).first.res.abs.to_i
625
730
  # Substraction
626
731
  assert_equal 0, User.where((@age - 10).eq(50)).count
627
- assert_equal 0, User.where((@age - "10").eq(50)).count
732
+ assert_equal 0, User.where((@age - '10').eq(50)).count
628
733
  # assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
629
- assert_equal 0, User.where((@age - "9.5").eq(50.5)).count
734
+ assert_equal 0, User.where((@age - '9.5').eq(50.5)).count
630
735
  end
631
736
 
632
737
  def test_wday
@@ -649,8 +754,8 @@ module ArelExtensions
649
754
  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
650
755
  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
651
756
 
652
- 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
653
- 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
757
+ 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
758
+ 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
654
759
  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
655
760
  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
656
761
  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
@@ -662,117 +767,117 @@ module ArelExtensions
662
767
  def test_case
663
768
  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)
664
769
  assert_equal 4, User.where(@score.when(20.16).then(1).else(0).eq(1)).count
665
- assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
666
- assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
667
- assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
668
- assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
669
- 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
770
+ assert_equal 2, t(@arthur, @score.when(65.62, 1).else(0) + 1)
771
+ assert_equal 0, t(@arthur, @score.when(65.62, 1).else(0) - 1)
772
+ assert_equal '11', t(@arthur, @score.when(65.62).then('1').else('0') + '1')
773
+ assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score) + 1)
774
+ 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
670
775
  end
671
776
 
672
777
  def test_format_numbers
673
778
  # score of Arthur = 65.62
674
- skip " Works with SQLite if the version used knows printf" if $sqlite
675
-
676
- assert_equal "Wrong Format", t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
677
- assert_equal "AZERTY65,62", t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
678
- assert_equal "65,62AZERTY", t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
679
- assert_equal "$ 65.62 €", t(@arthur, @score.format_number("$ %.2f €","en_US"))
680
- assert_equal "$ 66 €", t(@arthur, @score.format_number("$ %.0f €","en_US"))
681
- assert_equal "$ 0065,62 €", t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
682
- assert_equal "$ 65,62 €", t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
683
- assert_equal "$ 65,62 €", t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
684
- assert_equal "$ 65,62 €", t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
685
- assert_equal "$ 65,6 €", t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
686
- assert_equal "$ +65,62 €", t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
687
- assert_equal "$ +065,62 €", t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
688
- assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
689
- assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
690
- assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
691
- 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)
692
- assert_equal "123456765,6", t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") # because SqlServer does it like no one else
693
- assert_equal "123,456,765.6", t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
694
- assert_equal " 123,456,765.6", t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
695
- assert_equal "$ 0,00 €", t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
696
- assert_equal "$ 0,00 €", t(@arthur, (@score-65.62).format_number("$ %.2f €","fr_FR"))
779
+ skip ' Works with SQLite if the version used knows printf' if $sqlite
780
+
781
+ assert_equal 'Wrong Format', t(@arthur, @score.format_number('$ %...234.6F €', 'fr_FR'))
782
+ assert_equal 'AZERTY65,62', t(@arthur, @score.format_number('AZERTY%.2f', 'fr_FR'))
783
+ assert_equal '65,62AZERTY', t(@arthur, @score.format_number('%.2fAZERTY', 'fr_FR'))
784
+ assert_equal '$ 65.62 €', t(@arthur, @score.format_number('$ %.2f €', 'en_US'))
785
+ assert_equal '$ 66 €', t(@arthur, @score.format_number('$ %.0f €', 'en_US'))
786
+ assert_equal '$ 0065,62 €', t(@arthur, @score.format_number('$ %07.2f €', 'fr_FR'))
787
+ assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-07.2f €', 'fr_FR'))
788
+ assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-7.2f €', 'fr_FR'))
789
+ assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ % 7.2f €', 'fr_FR'))
790
+ assert_equal '$ 65,6 €', t(@arthur, @score.format_number('$ % 7.1f €', 'fr_FR'))
791
+ assert_equal '$ +65,62 €', t(@arthur, @score.format_number('$ % +7.2f €', 'fr_FR'))
792
+ assert_equal '$ +065,62 €', t(@arthur, @score.format_number('$ %0+7.2f €', 'fr_FR'))
793
+ assert_includes ['$ 6,56e1 €', '$ 6,56e+01 €'], t(@arthur, @score.format_number('$ %.2e €', 'fr_FR'))
794
+ assert_includes ['$ 6,56E1 €', '$ 6,56E+01 €'], t(@arthur, @score.format_number('$ %.2E €', 'fr_FR'))
795
+ assert_includes ['$ 6,562E1 €', '$ 6,562E+01 €'], t(@arthur, @score.format_number('$ %.3E €', 'fr_FR'))
796
+ 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)
797
+ 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
798
+ assert_equal '123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'en_US'))
799
+ assert_equal ' 123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%16.1f', 'en_US'))
800
+ assert_equal '$ 0,00 €', t(@arthur, @score.when(65.62).then(Arel.sql('null')).else(1).format_number('$ %.2f €', 'fr_FR'))
801
+ assert_equal '$ 0,00 €', t(@arthur, (@score - 65.62).format_number('$ %.2f €', 'fr_FR'))
697
802
  end
698
803
 
699
804
  def test_accent_insensitive
700
- skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
701
- skip "Not finished" if @env_db == 'mysql'
805
+ skip 'SQLite is natively Case Insensitive and Accent Sensitive' if $sqlite
806
+ skip 'Not finished' if @env_db == 'mysql'
702
807
  # actual comments value: "arrêté"
703
808
  # AI & CI
704
809
  if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
705
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
706
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
707
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("àrrétè")).then("1").else("0"))
708
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
709
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
710
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
810
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrêté')).then('1').else('0'))
811
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrete')).then('1').else('0'))
812
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('àrrétè')).then('1').else('0'))
813
+ assert_equal '0', t(@arthur, Arel.when(@comments.ai_imatches('arretez')).then('1').else('0'))
814
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrete')).then('1').else('0'))
815
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrêté')).then('1').else('0'))
711
816
  # AI & CS
712
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
713
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
714
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
715
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arretez")).then("1").else("0"))
716
- if !['oracle','postgresql','mysql'].include?(@env_db) # AI => CI
717
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrete")).then("1").else("0"))
718
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
817
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrêté')).then('1').else('0'))
818
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrete')).then('1').else('0'))
819
+ assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('àrrétè')).then('1').else('0'))
820
+ assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('arretez')).then('1').else('0'))
821
+ if !%w[oracle postgresql mysql].include?(@env_db) # AI => CI
822
+ assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrete')).then('1').else('0'))
823
+ assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrêté')).then('1').else('0'))
719
824
  end
720
825
  end
721
826
  # AS & CI
722
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
827
+ assert_equal '1', t(@arthur, Arel.when(@comments.imatches('arrêté')).then('1').else('0'))
723
828
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
724
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
725
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("àrrétè")).then("1").else("0"))
829
+ assert_equal '0', t(@arthur, Arel.when(@comments.imatches('arrete')).then('1').else('0'))
830
+ assert_equal '0', t(@arthur, Arel.when(@comments.imatches('àrrétè')).then('1').else('0'))
726
831
  end
727
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arretez")).then("1").else("0"))
832
+ assert_equal '0', t(@arthur, Arel.when(@comments.imatches('arretez')).then('1').else('0'))
728
833
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
729
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
834
+ assert_equal '0', t(@arthur, Arel.when(@comments.imatches('Arrete')).then('1').else('0'))
730
835
  end
731
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
836
+ assert_equal '1', t(@arthur, Arel.when(@comments.imatches('Arrêté')).then('1').else('0'))
732
837
  # AS & CS
733
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
734
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
735
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
736
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arretez")).then("1").else("0"))
737
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrete")).then("1").else("0"))
738
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrêté")).then("1").else("0"))
838
+ assert_equal '1', t(@arthur, Arel.when(@comments.smatches('arrêté')).then('1').else('0'))
839
+ assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arrete')).then('1').else('0'))
840
+ assert_equal '0', t(@arthur, Arel.when(@comments.smatches('àrrétè')).then('1').else('0'))
841
+ assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arretez')).then('1').else('0'))
842
+ assert_equal '0', t(@arthur, Arel.when(@comments.smatches('Arrete')).then('1').else('0'))
843
+ assert_equal '0', t(@arthur, Arel.when(@comments.smatches('Arrêté')).then('1').else('0'))
739
844
  end
740
845
 
741
846
  def test_subquery_with_order
742
847
  skip if ['mssql'].include?(@env_db) && Arel::VERSION.to_i < 10
743
- assert_equal 9, User.where(:name => User.select(:name).order(:name)).count
848
+ assert_equal 9, User.where(name: User.select(:name).order(:name)).count
744
849
  assert_equal 9, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
745
- if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
746
- assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
747
- # assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
850
+ if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
851
+ assert_equal 2, User.where(name: User.select(:name).order(:name).limit(2)).count
852
+ # assert_equal 6, User.where(name: User.select(:name).order(:name).offset(2)).count
748
853
  end
749
854
  end
750
855
 
751
856
  def test_in_with_nil
752
- assert_equal true, @myung.where(@age.in(1)).blank?
753
- assert_equal false, @myung.where(@age.in(23)).blank?
754
- assert_equal true, @myung.where(@age.in([1])).blank?
755
- assert_equal true, @myung.where(@age.in([1,2])).blank?
756
- assert_equal false, @myung.where(@age.in([1,23])).blank?
757
- assert_equal true, @myung.where(@age.in(nil)).blank?
758
- assert_equal true, @myung.where(@age.in([nil])).blank?
759
- assert_equal true, @myung.where(@age.in([nil,1])).blank?
760
- assert_equal false, @myung.where(@age.in([nil,23])).blank?
761
- assert_equal true, @myung.where(@age.in([nil,1,2])).blank?
762
- assert_equal false, @myung.where(@age.in([nil,1,23])).blank?
763
- assert_equal true, @test.where(@age.in(1)).blank?
764
- assert_equal true, @test.where(@age.in([1])).blank?
765
- assert_equal true, @test.where(@age.in([1,2])).blank?
766
- assert_equal false, @test.where(@age.in(nil)).blank?
767
- assert_equal false, @test.where(@age.in([nil])).blank?
768
- assert_equal false, @test.where(@age.in([nil,1])).blank?
769
- assert_equal false, @test.where(@age.in([nil,1,2])).blank?
857
+ assert_predicate @myung.where(@age.in(1)), :blank?
858
+ assert_predicate @myung.where(@age.in(23)), :present?
859
+ assert_predicate @myung.where(@age.in([1])), :blank?
860
+ assert_predicate @myung.where(@age.in([1, 2])), :blank?
861
+ assert_predicate @myung.where(@age.in([1, 23])), :present?
862
+ assert_predicate @myung.where(@age.in(nil)), :blank?
863
+ assert_predicate @myung.where(@age.in([nil])), :blank?
864
+ assert_predicate @myung.where(@age.in([nil, 1])), :blank?
865
+ assert_predicate @myung.where(@age.in([nil, 23])), :present?
866
+ assert_predicate @myung.where(@age.in([nil, 1, 2])), :blank?
867
+ assert_predicate @myung.where(@age.in([nil, 1, 23])), :present?
868
+ assert_predicate @test.where(@age.in(1)), :blank?
869
+ assert_predicate @test.where(@age.in([1])), :blank?
870
+ assert_predicate @test.where(@age.in([1, 2])), :blank?
871
+ assert_predicate @test.where(@age.in(nil)), :present?
872
+ assert_predicate @test.where(@age.in([nil])), :present?
873
+ assert_predicate @test.where(@age.in([nil, 1])), :present?
874
+ assert_predicate @test.where(@age.in([nil, 1, 2])), :present?
770
875
  end
771
876
 
772
877
  def test_scope_with_in_plus_new
773
878
  begin
774
- @test.where(@age.in([1,2])).new
775
- @test.where(@age.not_in([1,2])).new
879
+ @test.where(@age.in([1, 2])).new
880
+ @test.where(@age.not_in([1, 2])).new
776
881
  assert true
777
882
  rescue
778
883
  assert false
@@ -780,44 +885,44 @@ module ArelExtensions
780
885
  end
781
886
 
782
887
  def test_is_not_null
783
- assert_equal false, @myung.where(@age.is_not_null).blank?
784
- assert_equal true, @test.where(@age.is_not_null).blank?
888
+ assert_predicate @myung.where(@age.is_not_null), :present?
889
+ assert_predicate @test.where(@age.is_not_null), :blank?
785
890
  end
786
891
 
787
892
  def test_not_in_with_nil
788
- assert_equal false, @myung.where(@age.not_in(1)).blank?
789
- assert_equal true, @myung.where(@age.not_in(23)).blank?
790
- assert_equal false, @myung.where(@age.not_in([1])).blank?
791
- assert_equal false, @myung.where(@age.not_in([1,2])).blank?
792
- assert_equal true, @myung.where(@age.not_in([1,23])).blank?
793
- assert_equal false, @myung.where(@age.not_in(nil)).blank?
794
- assert_equal false, @myung.where(@age.not_in([nil])).blank?
795
- assert_equal false, @myung.where(@age.not_in([nil,1])).blank?
796
- assert_equal true, @myung.where(@age.not_in([nil,23])).blank?
797
- assert_equal false, @myung.where(@age.not_in([nil,1,2])).blank?
798
- assert_equal true, @myung.where(@age.not_in([nil,1,23])).blank?
799
-
800
- assert_equal false, @myung.where(@age.not_in(1..2)).blank?
893
+ assert_predicate @myung.where(@age.not_in(1)), :present?
894
+ assert_predicate @myung.where(@age.not_in(23)), :blank?
895
+ assert_predicate @myung.where(@age.not_in([1])), :present?
896
+ assert_predicate @myung.where(@age.not_in([1, 2])), :present?
897
+ assert_predicate @myung.where(@age.not_in([1, 23])), :blank?
898
+ assert_predicate @myung.where(@age.not_in(nil)), :present?
899
+ assert_predicate @myung.where(@age.not_in([nil])), :present?
900
+ assert_predicate @myung.where(@age.not_in([nil, 1])), :present?
901
+ assert_predicate @myung.where(@age.not_in([nil, 23])), :blank?
902
+ assert_predicate @myung.where(@age.not_in([nil, 1, 2])), :present?
903
+ assert_predicate @myung.where(@age.not_in([nil, 1, 23])), :blank?
904
+
905
+ assert_predicate @myung.where(@age.not_in(1..2)), :present?
801
906
 
802
907
  # if the column is null, the entry will never be selected with not in (like every DBMS does)
803
- # assert_equal false , @test.where(@age.not_in(1)).blank?
804
- # assert_equal false , @test.where(@age.not_in([1])).blank?
805
- # assert_equal false , @test.where(@age.not_in([1,2])).blank?
806
- # assert_equal true , @test.where(@age.not_in(nil)).blank?
807
- # assert_equal true , @test.where(@age.not_in([nil])).blank?
808
- # assert_equal true , @test.where(@age.not_in([nil,1])).blank?
809
- # assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
908
+ # assert_predicate @test.where(@age.not_in(1)), :present?
909
+ # assert_predicate @test.where(@age.not_in([1])), :present?
910
+ # assert_predicate @test.where(@age.not_in([1,2])), :present?
911
+ # assert_predicate @test.where(@age.not_in(nil)), :blank?
912
+ # assert_predicate @test.where(@age.not_in([nil])), :blank?
913
+ # assert_predicate @test.where(@age.not_in([nil,1])), :blank?
914
+ # assert_predicate @test.where(@age.not_in([nil,1,2])), :blank?
810
915
  end
811
916
 
812
917
  def test_in_on_grouping
813
- skip "We should modify the visitor of IN to make it work" if $sqlite || @env_db == 'mssql'
814
- assert_equal 2, User.where(Arel.tuple(@name,@age).in(Arel.tuple('Myung',23),Arel.tuple('Arthur',21))).count
815
- assert_equal 1, User.where(Arel.tuple(@name,@age).in(Arel.tuple('Myung',23))).count
816
- assert_equal 0, User.where(Arel.tuple(@name,@age).in([])).count
918
+ skip 'We should modify the visitor of IN to make it work' if $sqlite || @env_db == 'mssql'
919
+ assert_equal 2, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23), Arel.tuple('Arthur', 21))).count
920
+ assert_equal 1, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23))).count
921
+ assert_equal 0, User.where(Arel.tuple(@name, @age).in([])).count
817
922
  end
818
923
 
819
924
  def test_alias_shortened
820
- if ['postgresql','oracle'].include?(@env_db)
925
+ if %w[postgresql oracle].include?(@env_db)
821
926
  new_alias = Arel.shorten('azerty' * 15)
822
927
  at = User.arel_table.alias('azerty' * 15)
823
928
  assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
@@ -840,64 +945,64 @@ module ArelExtensions
840
945
  assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
841
946
  assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
842
947
  assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
843
- skip "Not Yet Implemented" # if !['postgresql'].include?(@env_db)
844
- assert_equal 2, User.select(@score.std(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
845
- assert_equal 2, User.select(@score.variance(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
846
- assert_equal 2, User.select(@score.sum(group: Arel.when(@name > "M").then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
847
- 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
948
+ skip 'Not Yet Implemented' # if !['postgresql'].include?(@env_db)
949
+ assert_equal 2, User.select(@score.std(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
950
+ assert_equal 2, User.select(@score.variance(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
951
+ assert_equal 2, User.select(@score.sum(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
952
+ 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
848
953
  end
849
954
 
850
955
  def test_levenshtein_distance
851
- skip "Not Yet Implemented" if $sqlite
852
- assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
853
- assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
854
- assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
956
+ skip 'Not Yet Implemented' if $sqlite
957
+ assert_equal 0, t(@arthur, @name.levenshtein_distance('Arthur'))
958
+ assert_equal 2, t(@arthur, @name.levenshtein_distance('Artoor'))
959
+ assert_equal 1, t(@arthur, @name.levenshtein_distance('Artehur'))
855
960
  end
856
961
 
857
962
  def test_json
858
963
  skip "Can't be tested on travis"
859
964
  # creation
860
- assert_equal 'Arthur', t(@arthur,Arel.json(@name))
861
- assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,Arel.json(@name,@name)))
862
- assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => @name+@name})))
863
- assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,Arel.json({@name => @name,@name+"2" => 1})))
864
- assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,Arel.json([{age: @age},{name: @name,score: @score}])))
965
+ assert_equal 'Arthur', t(@arthur, Arel.json(@name))
966
+ assert_equal %w[Arthur Arthur], parse_json(t(@arthur, Arel.json(@name, @name)))
967
+ assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 'ArthurArthur'}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => @name + @name})))
968
+ assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 1}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => 1})))
969
+ assert_equal [{'age' => 21}, {'name' => 'Arthur', 'score' => 65.62}], parse_json(t(@arthur, Arel.json([{age: @age}, {name: @name, score: @score}])))
865
970
 
866
971
  # aggregate
867
- assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure"}),
868
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name}).group(false)))
869
- assert_equal ({"5" => "Lucas", "15" => "Sophie", "23" => "Myung", "25" => "Laure", "Laure"=>25, "Lucas"=>5, "Myung"=>23, "Sophie"=>15}),
870
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16),Arel.json({@age => @name,@name => @age}).group(false)))
871
- assert_equal ([{"5" => "Lucas"},{ "15" => "Sophie"},{ "23" => "Myung"},{ "25" => "Laure"}]),
872
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score),Arel.json({@age => @name}).group(true,[@age])))
972
+ assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure'}),
973
+ parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name}).group(false)))
974
+ assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure', 'Laure' => 25, 'Lucas' => 5, 'Myung' => 23, 'Sophie' => 15}),
975
+ parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name, @name => @age}).group(false)))
976
+ assert_equal [{'5' => 'Lucas'}, {'15' => 'Sophie'}, {'23' => 'Myung'}, {'25' => 'Laure'}],
977
+ parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score), Arel.json({@age => @name}).group(true, [@age])))
873
978
 
874
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_sql
875
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score,Arel.json({@age => @name}).group(true,[@age])).to_a
979
+ # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_sql
980
+ # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_a
876
981
 
877
- skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
982
+ skip 'Not Yet Implemented' if $sqlite || %w[oracle mssql].include?(@env_db)
878
983
  # get
879
- h1 = Arel.json({@name => @name+@name,@name+"2" => 1})
880
- assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
881
- h2 = Arel.json([{age: @age},{name: @name,score: @score}])
882
- assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
883
- assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
884
- assert_nil t(@arthur,h2.get('age'))
984
+ h1 = Arel.json({@name => @name + @name, @name + '2' => 1})
985
+ assert_equal 'ArthurArthur', parse_json(t(@arthur, h1.get(@name)))
986
+ h2 = Arel.json([{age: @age}, {name: @name, score: @score}])
987
+ assert_equal ({'age' => 21}), parse_json(t(@arthur, h2.get(0)))
988
+ assert_equal 21, parse_json(t(@arthur, h2.get(0).get('age')))
989
+ assert_nil t(@arthur, h2.get('age'))
885
990
  # set
886
- assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1}), parse_json(t(@arthur,h1.set(@name, ['toto','tata'])))
887
- assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.set(@name+"3",2)))
888
- assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => nil}), parse_json(t(@arthur,h1.set(@name+"3",nil)))
889
- assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => {"a" => 2}}), parse_json(t(@arthur,h1.set(@name+"3",{a: 2})))
991
+ assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1}), parse_json(t(@arthur, h1.set(@name, %w[toto tata])))
992
+ assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.set(@name + '3', 2)))
993
+ assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => nil}), parse_json(t(@arthur, h1.set(@name + '3', nil)))
994
+ assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => {'a' => 2}}), parse_json(t(@arthur, h1.set(@name + '3', {a: 2})))
890
995
  # merge
891
- assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata']},{@name+"3" => 2})))
892
- assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata'], @name+"3" => 2})))
893
- assert_equal ({"Arthur" => "ArthurArthur","Arthur2" => 1}), parse_json(t(@arthur,h1.merge({})))
996
+ assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata]}, {@name + '3' => 2})))
997
+ assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata], @name + '3' => 2})))
998
+ assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1}), parse_json(t(@arthur, h1.merge({})))
894
999
  end
895
1000
 
896
1001
  def test_as_on_everything
897
1002
  name = @arthur.select(@name.as('NaMe')).first.attributes
898
- assert_equal 'Arthur', name["NaMe"] || name["name"] # because of Oracle
899
- assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
900
- assert_equal 'ArthurArthur', @arthur.select((@name+@name).as('Na-Me')).first.attributes["Na-Me"]
1003
+ assert_equal 'Arthur', name['NaMe'] || name['name'] # because of Oracle
1004
+ assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes['Na Me']
1005
+ assert_equal 'ArthurArthur', @arthur.select((@name + @name).as('Na-Me')).first.attributes['Na-Me']
901
1006
  end
902
1007
 
903
1008
  def test_exists_in_subquery