arel_extensions 1.1.8 → 1.1.9

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.
@@ -24,7 +24,7 @@ module ArelExtensions
24
24
  end
25
25
 
26
26
  def setup_db
27
- @cnx.drop_table(:user_tests) rescue nil
27
+ @cnx.drop_table(:user_tests) rescue nil
28
28
  @cnx.create_table :user_tests do |t|
29
29
  t.column :age, :integer
30
30
  t.column :name, :string
@@ -67,7 +67,7 @@ module ArelExtensions
67
67
  @test = User.where(:id => u.id)
68
68
  u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
69
69
  @neg = User.where(:id => u.id)
70
-
70
+
71
71
 
72
72
  @age = User.arel_table[:age]
73
73
  @name = User.arel_table[:name]
@@ -78,7 +78,7 @@ module ArelExtensions
78
78
  @duration = User.arel_table[:duration]
79
79
  @price = Product.arel_table[:price]
80
80
  @not_in_table = User.arel_table[:not_in_table]
81
-
81
+
82
82
  @ut = User.arel_table
83
83
  @pt = Product.arel_table
84
84
  end
@@ -92,6 +92,15 @@ module ArelExtensions
92
92
  scope.select(node.as('res')).to_a.first.res
93
93
  end
94
94
 
95
+ #manage the difference between adapters that handle or not json type
96
+ def parse_json(h)
97
+ if @env_db != 'postgresql'
98
+ JSON.parse("{\"res\":#{h}}")['res']
99
+ else
100
+ h
101
+ end
102
+ end
103
+
95
104
  # Math Functions
96
105
  def test_classical_arel
97
106
  assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
@@ -154,6 +163,7 @@ module ArelExtensions
154
163
  assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
155
164
  assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
156
165
 
166
+ skip "No group_concat in SqlServer before 2017" if @env_db == 'mssql'
157
167
  assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
158
168
  assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
159
169
  assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
@@ -202,7 +212,7 @@ module ArelExtensions
202
212
  end
203
213
  assert_equal 'Lu', t(@lucas, @name[0,2])
204
214
  assert_equal 'Lu', t(@lucas, @name[0..1])
205
-
215
+
206
216
  #substring should accept string function
207
217
  assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
208
218
  assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
@@ -221,8 +231,8 @@ module ArelExtensions
221
231
  if @env_db == 'postgresql' # may return real boolean
222
232
  assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
223
233
  assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
224
- elsif @env_db == 'oracle'
225
- assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
234
+ elsif @env_db == 'oracle'
235
+ assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name >= 'Mest').then(1).else(0))
226
236
  assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name <= (@name + 'Z')).then(1).else(0))
227
237
  assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name > 'Mest').then(1).else(0))
228
238
  assert_equal 1, t(@neg, ArelExtensions::Nodes::Case.new.when(@name < (@name + 'Z')).then(1).else(0))
@@ -233,23 +243,23 @@ module ArelExtensions
233
243
  assert_equal 1, t(@neg, @name < (@name + 'Z'))
234
244
  end
235
245
  end
236
-
237
- def test_compare_on_date_time_types
238
- skip "Sqlite can't compare time" if $sqlite
239
- skip "Oracle can't compare time" if @env_db == 'oracle'
240
- #@created_at == 2016-05-23
246
+
247
+ def test_compare_on_date_time_types
248
+ skip "Sqlite can't compare time" if $sqlite
249
+ skip "Oracle can't compare time" if @env_db == 'oracle'
250
+ #@created_at == 2016-05-23
241
251
  assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2014-01-01').then(1).else(0))
242
252
  assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@created_at >= '2018-01-01').then(1).else(0))
243
253
  #@updated_at == 2014-03-03 12:42:00
244
- assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
245
- assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
246
- #@duration == 12:42:21
247
- #puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
248
- #puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
249
- assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
250
- assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
254
+ assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
255
+ assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
256
+ #@duration == 12:42:21
257
+ #puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0)).to_sql
258
+ #puts @laure.select(ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0)).to_sql
259
+ assert_includes [true,'t',1], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '10:10:10').then(1).else(0))
260
+ assert_includes [false,'f',0], t(@laure, ArelExtensions::Nodes::Case.new.when(@duration >= '14:10:10').then(1).else(0))
251
261
  end
252
-
262
+
253
263
 
254
264
  def test_regexp_not_regexp
255
265
  skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
@@ -261,7 +271,7 @@ module ArelExtensions
261
271
  end
262
272
 
263
273
  def test_imatches
264
- #puts User.where(@name.imatches('m%')).to_sql
274
+ #puts User.where(@name.imatches('m%')).to_sql
265
275
  assert_equal 1, User.where(@name.imatches('m%')).count
266
276
  assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
267
277
  assert_equal 6, User.where(@name.idoes_not_match('L%')).count
@@ -274,7 +284,7 @@ module ArelExtensions
274
284
 
275
285
  def test_replace_once
276
286
  skip "TODO"
277
- # skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
287
+ #skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
278
288
  assert_equal "LuCas", t(@lucas, @name.substring(1, @name.locate('c') - 1) + 'C' + @name.substring(@name.locate('c') + 1, @name.length))
279
289
  end
280
290
 
@@ -317,7 +327,7 @@ module ArelExtensions
317
327
  assert_equal 0, @sophie.where(@comments.not_blank).count
318
328
  assert_equal 1, @camille.where(@comments.blank).count
319
329
  assert_equal 0, @camille.where(@comments.not_blank).count
320
-
330
+
321
331
  assert_equal 0, @neg.where(@comments.blank).count
322
332
  assert_equal 1, @neg.where(@comments.not_blank).count
323
333
  assert_equal 'false', t(@myung, @name.blank.then('true', 'false'))
@@ -344,16 +354,12 @@ module ArelExtensions
344
354
  else
345
355
  assert_equal('', t(@laure, @comments.coalesce("")))
346
356
  end
347
-
348
-
349
357
  assert_equal 100, t(@test, @age.coalesce(100))
350
358
  assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
351
359
  assert_equal 20, t(@test, @age.coalesce(nil, 20))
352
360
 
353
361
  assert_equal 20, t(@test, @age.coalesce(10)+10)
354
362
  assert_equal 'Laure10', t(@laure, @comments.coalesce("Laure") + 10)
355
-
356
-
357
363
  end
358
364
 
359
365
  # Comparators
@@ -373,7 +379,7 @@ module ArelExtensions
373
379
 
374
380
  def test_date_duration
375
381
  #Year
376
- assert_equal 2016, t(@lucas, @created_at.year).to_i
382
+ assert_equal 2016, t(@lucas, @created_at.year).to_i
377
383
  assert_equal 0, User.where(@created_at.year.eq("2012")).count
378
384
  #Month
379
385
  assert_equal 5, t(@camille, @created_at.month).to_i
@@ -401,7 +407,7 @@ module ArelExtensions
401
407
  assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
402
408
  if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
403
409
  assert_equal 42 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
404
- assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
410
+ assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
405
411
  else
406
412
  assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
407
413
  assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
@@ -411,30 +417,30 @@ module ArelExtensions
411
417
  assert_includes [nil, 0, 'f', false], t(@lucas, (@updated_at - Time.utc(2014, 3, 3, 12, 41, 18)) < -1)
412
418
  end
413
419
  if @env_db == 'mysql'
414
- date1 = Date.new(2016, 5, 23)
415
- durPos = 10.years
416
- durNeg = -10.years
417
- date2 = date1 + durPos
418
- date3 = date1 - durPos
419
- # Pull Request #5 tests
420
- assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos))
421
- assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg))
422
- # we test with the ruby object or the string because some adapters don't return an object Date
420
+ date1 = Date.new(2016, 5, 23)
421
+ durPos = 10.years
422
+ durNeg = -10.years
423
+ date2 = date1 + durPos
424
+ date3 = date1 - durPos
425
+ # Pull Request #5 tests
426
+ assert_includes [date2,"2026-05-23"], t(@test,(@created_at + durPos))
427
+ assert_includes [date3,"2006-05-23"], t(@test,(@created_at + durNeg))
428
+ # we test with the ruby object or the string because some adapters don't return an object Date
423
429
  end
424
430
  end
425
431
  end
426
432
 
427
433
  # TODO; cast types
428
434
  def test_cast_types
429
- assert_equal "5", t(@lucas, @age.cast(:string))
430
- if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle'
431
- assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0))
432
- assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0))
433
- end
435
+ assert_equal "5", t(@lucas, @age.cast(:string))
436
+ if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle'
437
+ assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0))
438
+ assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0))
439
+ end
434
440
  end
435
441
 
436
- def test_is_null
437
- #puts User.where(@age.is_null).select(@name).to_sql
442
+ def test_is_null
443
+ #puts User.where(@age.is_null).select(@name).to_sql
438
444
  assert_equal "Test", User.where(@age.is_null).select(@name).first.name
439
445
  end
440
446
 
@@ -445,18 +451,18 @@ module ArelExtensions
445
451
  assert_equal "Sophie2", t(@sophie, @name + 2)
446
452
  assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
447
453
  assert_equal "Sophie15", t(@sophie, @name + @age)
448
- assert_equal "SophieSophie", t(@sophie, @name + @name)
454
+ assert_equal "SophieSophie", t(@sophie, @name + @name)
449
455
  assert_equal "SophieSophieSophie", t(@sophie, @name + @name + @name)
450
456
  assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name.concat(@name)))
451
457
  assert_equal "SophieSophieSophie", t(@sophie, @name.concat(@name).concat(@name))
452
458
  #FIXME: should work as expected in Oracle
453
- assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
459
+ assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at) unless @env_db == 'oracle'
454
460
  #concat Integer
455
461
  assert_equal 1, User.where((@age + 10).eq(33)).count
456
462
  assert_equal 1, User.where((@age + "1").eq(6)).count
457
463
  assert_equal 1, User.where((@age + @age).eq(10)).count
458
464
  #concat Date
459
- # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
465
+ #puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
460
466
  assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
461
467
  assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
462
468
  end
@@ -475,28 +481,27 @@ module ArelExtensions
475
481
  end
476
482
 
477
483
  def test_wday
478
- d = Date.new(2016, 6, 26)
484
+ #d = Date.new(2016, 6, 26)
479
485
  assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
480
- assert_equal 0, User.select(d.wday).as("res").first.to_i
481
486
  end
482
487
 
483
488
  # Boolean functions
484
489
  def test_boolean_functions
485
- assert_equal 1, @laure.where(
490
+ assert @laure.where(
486
491
  (@score.round > 19).⋀(@score.round < 21).⋁(@score.round(1) >= 20.1)
487
- ).count
492
+ )
488
493
  end
489
-
494
+
490
495
  # Union operator
491
- def test_union_operator
496
+ def test_union_operator
492
497
  assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.gt(22)) + @ut.project(@age).where(@age.lt(0))).to_sql).length
493
- assert_equal 2, User.find_by_sql((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).to_sql).length
498
+ assert_equal 2, User.find_by_sql((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).to_sql).length
494
499
  assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.gt(22)) + @ut.project(@age).where(@age.lt(0))).as('my_union')).length
495
500
  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
496
501
  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
497
-
502
+
498
503
  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
499
- 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
504
+ 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
500
505
  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
501
506
  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
502
507
  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
@@ -504,185 +509,223 @@ module ArelExtensions
504
509
  assert (@ut.project(@age) + @ut.project(@age)).as('toto').table_name # as on union should answer to table_name (TableAlias)
505
510
  end
506
511
 
507
- # Case clause
508
- def test_case
509
- 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)
510
- assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
511
- assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
512
- assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
513
- assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
514
- 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
515
- end
516
-
517
- def test_format_numbers
518
- #score of Arthur = 65.62
519
- skip " Works with SQLite if the version used knows printf" if @env_db = $sqlite
520
-
521
- assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
522
- assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
523
- assert_equal "65,62AZERTY" , t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
524
- assert_equal "$ 65.62 €" , t(@arthur, @score.format_number("$ %.2f €","en_US"))
525
- assert_equal "$ 66 €" , t(@arthur, @score.format_number("$ %.0f €","en_US"))
526
- assert_equal "$ 0065,62 €" , t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
527
- assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
528
- assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
529
- assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
530
- assert_equal "$ 65,6 €" , t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
531
- assert_equal "$ +65,62 €" , t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
532
- assert_equal "$ +065,62 €" , t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
533
- assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
534
- assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
535
- assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
536
- 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)
537
- assert_equal "123456765,6" , t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") #because SqlServer does it like no one else
538
- assert_equal "123,456,765.6" , t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
539
- assert_equal " 123,456,765.6" , t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
540
- assert_equal "$ 0,00 €" , t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
541
- assert_equal "$ 0,00 €" , t(@arthur, (@score-65.62).format_number("$ %.2f €","fr_FR"))
542
- end
543
-
544
- def test_accent_insensitive
545
- skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
546
- skip "Not finished" if @env_db == 'mysql'
547
- # actual comments value: "arrêté"
548
- #AI & CI
549
- if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
550
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
551
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
552
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("àrrétè")).then("1").else("0"))
553
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
554
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
555
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
556
- #AI & CS
557
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
558
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
559
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
560
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arretez")).then("1").else("0"))
561
- if !['oracle','postgresql','mysql'].include?(@env_db) # AI => CI
562
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrete")).then("1").else("0"))
563
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
564
- end
565
- end
566
- #AS & CI
567
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
568
- if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
569
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
570
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("àrrétè")).then("1").else("0"))
571
- end
572
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arretez")).then("1").else("0"))
573
- if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
574
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
575
- end
576
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
577
- #AS & CS
578
- assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
579
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
580
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
581
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arretez")).then("1").else("0"))
582
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrete")).then("1").else("0"))
583
- assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrêté")).then("1").else("0"))
584
- end
585
-
586
- def test_subquery_with_order
587
- assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
588
- assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
589
- if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
590
- assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
591
- #assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
592
- end
593
- end
594
-
595
- def test_in_with_nil
596
- assert_equal true , @myung.where(@age.in(1)).blank?
597
- assert_equal false , @myung.where(@age.in(23)).blank?
598
- assert_equal true , @myung.where(@age.in([1])).blank?
599
- assert_equal true , @myung.where(@age.in([1,2])).blank?
600
- assert_equal false , @myung.where(@age.in([1,23])).blank?
601
- assert_equal true , @myung.where(@age.in(nil)).blank?
602
- assert_equal true , @myung.where(@age.in([nil])).blank?
603
- assert_equal true , @myung.where(@age.in([nil,1])).blank?
604
- assert_equal false , @myung.where(@age.in([nil,23])).blank?
605
- assert_equal true , @myung.where(@age.in([nil,1,2])).blank?
606
- assert_equal false , @myung.where(@age.in([nil,1,23])).blank?
607
- assert_equal true , @test.where(@age.in(1)).blank?
608
- assert_equal true , @test.where(@age.in([1])).blank?
609
- assert_equal true , @test.where(@age.in([1,2])).blank?
610
- assert_equal false , @test.where(@age.in(nil)).blank?
611
- assert_equal false , @test.where(@age.in([nil])).blank?
612
- assert_equal false , @test.where(@age.in([nil,1])).blank?
613
- assert_equal false , @test.where(@age.in([nil,1,2])).blank?
614
- end
615
-
616
- def test_scope_with_in_plus_new
617
- begin
618
- @test.where(@age.in([1,2])).new
619
- @test.where(@age.not_in([1,2])).new
620
- assert true
621
- rescue
622
- assert false
623
- end
624
- end
625
-
626
- def test_is_not_null
627
- assert_equal false , @myung.where(@age.is_not_null).blank?
628
- assert_equal true , @test.where(@age.is_not_null).blank?
629
- end
630
-
631
- def test_not_in_with_nil
632
- assert_equal false , @myung.where(@age.not_in(1)).blank?
633
- assert_equal true , @myung.where(@age.not_in(23)).blank?
634
- assert_equal false , @myung.where(@age.not_in([1])).blank?
635
- assert_equal false , @myung.where(@age.not_in([1,2])).blank?
636
- assert_equal true , @myung.where(@age.not_in([1,23])).blank?
637
- assert_equal false , @myung.where(@age.not_in(nil)).blank?
638
- assert_equal false , @myung.where(@age.not_in([nil])).blank?
639
- assert_equal false , @myung.where(@age.not_in([nil,1])).blank?
640
- assert_equal true , @myung.where(@age.not_in([nil,23])).blank?
641
- assert_equal false , @myung.where(@age.not_in([nil,1,2])).blank?
642
- assert_equal true , @myung.where(@age.not_in([nil,1,23])).blank?
643
-
644
- #if the column is null, the entry will never be selected with not in (like every DBMS does)
645
- #assert_equal false , @test.where(@age.not_in(1)).blank?
646
- #assert_equal false , @test.where(@age.not_in([1])).blank?
647
- #assert_equal false , @test.where(@age.not_in([1,2])).blank?
648
- #assert_equal true , @test.where(@age.not_in(nil)).blank?
649
- #assert_equal true , @test.where(@age.not_in([nil])).blank?
650
- #assert_equal true , @test.where(@age.not_in([nil,1])).blank?
651
- #assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
652
- end
653
-
654
- def test_alias_shortened
655
- if ['postgresql','oracle'].include?(@env_db)
656
- new_alias = Arel.shorten('azerty' * 15)
657
- at = User.arel_table.alias('azerty' * 15)
658
- assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
659
- assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
660
- assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
661
- User.select(at[:id]).from(at).to_sql.downcase
662
- end
663
- end
664
-
665
- def test_stat_functions
666
- skip "SQLite doesn't work for most on this functions" if $sqlite
667
- #puts t(User.where(nil), @score.average)
668
- #puts t(User.where(nil), @score.variance(true))
669
- #puts t(User.where(nil), @score.variance(false))
670
- #puts t(User.where(nil), @score.std(true))
671
- #puts t(User.where(nil), @score.std(false))
672
-
673
- assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
674
- assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
675
- assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
676
- assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
677
- assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
678
- end
679
-
680
- def test_levenshtein_distance
681
- skip "Not Yet Implemented" if $sqlite
682
- assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
683
- assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
684
- assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
685
- end
512
+ # Case clause
513
+ def test_case
514
+ 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)
515
+ assert_equal 2, t(@arthur, @score.when(65.62,1).else(0)+1)
516
+ assert_equal 0, t(@arthur, @score.when(65.62,1).else(0)-1)
517
+ assert_equal "11", t(@arthur, @score.when(65.62).then("1").else("0")+"1")
518
+ assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score)+1)
519
+ 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
520
+ end
521
+
522
+ def test_format_numbers
523
+ #score of Arthur = 65.62
524
+ skip " Works with SQLite if the version used knows printf" if @env_db = $sqlite
525
+
526
+ assert_equal "Wrong Format" , t(@arthur, @score.format_number("$ %...234.6F €","fr_FR"))
527
+ assert_equal "AZERTY65,62" , t(@arthur, @score.format_number("AZERTY%.2f","fr_FR"))
528
+ assert_equal "65,62AZERTY" , t(@arthur, @score.format_number("%.2fAZERTY","fr_FR"))
529
+ assert_equal "$ 65.62 €" , t(@arthur, @score.format_number("$ %.2f €","en_US"))
530
+ assert_equal "$ 66 €" , t(@arthur, @score.format_number("$ %.0f €","en_US"))
531
+ assert_equal "$ 0065,62 €" , t(@arthur, @score.format_number("$ %07.2f €","fr_FR"))
532
+ assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-07.2f €","fr_FR"))
533
+ assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ %-7.2f €","fr_FR"))
534
+ assert_equal "$ 65,62 €" , t(@arthur, @score.format_number("$ % 7.2f €","fr_FR"))
535
+ assert_equal "$ 65,6 €" , t(@arthur, @score.format_number("$ % 7.1f €","fr_FR"))
536
+ assert_equal "$ +65,62 €" , t(@arthur, @score.format_number("$ % +7.2f €","fr_FR"))
537
+ assert_equal "$ +065,62 €" , t(@arthur, @score.format_number("$ %0+7.2f €","fr_FR"))
538
+ assert_includes ["$ 6,56e1 €","$ 6,56e+01 €"], t(@arthur, @score.format_number("$ %.2e €","fr_FR"))
539
+ assert_includes ["$ 6,56E1 €","$ 6,56E+01 €"], t(@arthur, @score.format_number("$ %.2E €","fr_FR"))
540
+ assert_includes ["$ 6,562E1 €","$ 6,562E+01 €"], t(@arthur, @score.format_number("$ %.3E €","fr_FR"))
541
+ 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)
542
+ assert_equal "123456765,6" , t(@arthur, (@score+123456700).format_number("%.1f","fr_FR")).gsub("\u00A0","") #because SqlServer does it like no one else
543
+ assert_equal "123,456,765.6" , t(@arthur, (@score+123456700).format_number("%.1f","en_US"))
544
+ assert_equal " 123,456,765.6" , t(@arthur, (@score+123456700).format_number("%16.1f","en_US"))
545
+ assert_equal "$ 0,00 €" , t(@arthur, @score.when(65.62).then(Arel.sql("null")).else(1).format_number("$ %.2f €","fr_FR"))
546
+ assert_equal "$ 0,00 €" , t(@arthur, (@score-65.62).format_number("$ %.2f €","fr_FR"))
547
+ end
548
+
549
+ def test_accent_insensitive
550
+ skip "SQLite is natively Case Insensitive and Accent Sensitive" if $sqlite
551
+ skip "Not finished" if @env_db == 'mysql'
552
+ # actual comments value: "arrêté"
553
+ #AI & CI
554
+ if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
555
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrêté")).then("1").else("0"))
556
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arrete")).then("1").else("0"))
557
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("àrrétè")).then("1").else("0"))
558
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("arretez")).then("1").else("0"))
559
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrete")).then("1").else("0"))
560
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_imatches("Arrêté")).then("1").else("0"))
561
+ #AI & CS
562
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrêté")).then("1").else("0"))
563
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arrete")).then("1").else("0"))
564
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("àrrétè")).then("1").else("0"))
565
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("arretez")).then("1").else("0"))
566
+ if !['oracle','postgresql','mysql'].include?(@env_db) # AI => CI
567
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrete")).then("1").else("0"))
568
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.ai_matches("Arrêté")).then("1").else("0"))
569
+ end
570
+ end
571
+ #AS & CI
572
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrêté")).then("1").else("0"))
573
+ if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
574
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arrete")).then("1").else("0"))
575
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("àrrétè")).then("1").else("0"))
576
+ end
577
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("arretez")).then("1").else("0"))
578
+ if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
579
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrete")).then("1").else("0"))
580
+ end
581
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.imatches("Arrêté")).then("1").else("0"))
582
+ #AS & CS
583
+ assert_equal "1", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrêté")).then("1").else("0"))
584
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arrete")).then("1").else("0"))
585
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("àrrétè")).then("1").else("0"))
586
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("arretez")).then("1").else("0"))
587
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrete")).then("1").else("0"))
588
+ assert_equal "0", t(@arthur,ArelExtensions::Nodes::Case.new.when(@comments.smatches("Arrêté")).then("1").else("0"))
589
+ end
590
+
591
+ def test_subquery_with_order
592
+ assert_equal 8, User.where(:name => User.select(:name).order(:name)).count
593
+ assert_equal 8, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
594
+ if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
595
+ assert_equal 2, User.where(:name => User.select(:name).order(:name).limit(2)).count
596
+ #assert_equal 6, User.where(:name => User.select(:name).order(:name).offset(2)).count
597
+ end
598
+ end
599
+
600
+ def test_in_with_nil
601
+ assert_equal true , @myung.where(@age.in(1)).blank?
602
+ assert_equal false , @myung.where(@age.in(23)).blank?
603
+ assert_equal true , @myung.where(@age.in([1])).blank?
604
+ assert_equal true , @myung.where(@age.in([1,2])).blank?
605
+ assert_equal false , @myung.where(@age.in([1,23])).blank?
606
+ assert_equal true , @myung.where(@age.in(nil)).blank?
607
+ assert_equal true , @myung.where(@age.in([nil])).blank?
608
+ assert_equal true , @myung.where(@age.in([nil,1])).blank?
609
+ assert_equal false , @myung.where(@age.in([nil,23])).blank?
610
+ assert_equal true , @myung.where(@age.in([nil,1,2])).blank?
611
+ assert_equal false , @myung.where(@age.in([nil,1,23])).blank?
612
+ assert_equal true , @test.where(@age.in(1)).blank?
613
+ assert_equal true , @test.where(@age.in([1])).blank?
614
+ assert_equal true , @test.where(@age.in([1,2])).blank?
615
+ assert_equal false , @test.where(@age.in(nil)).blank?
616
+ assert_equal false , @test.where(@age.in([nil])).blank?
617
+ assert_equal false , @test.where(@age.in([nil,1])).blank?
618
+ assert_equal false , @test.where(@age.in([nil,1,2])).blank?
619
+ end
620
+
621
+ def test_scope_with_in_plus_new
622
+ begin
623
+ @test.where(@age.in([1,2])).new
624
+ @test.where(@age.not_in([1,2])).new
625
+ assert true
626
+ rescue
627
+ assert false
628
+ end
629
+ end
630
+
631
+ def test_is_not_null
632
+ assert_equal false , @myung.where(@age.is_not_null).blank?
633
+ assert_equal true , @test.where(@age.is_not_null).blank?
634
+ end
635
+
636
+ def test_not_in_with_nil
637
+ assert_equal false , @myung.where(@age.not_in(1)).blank?
638
+ assert_equal true , @myung.where(@age.not_in(23)).blank?
639
+ assert_equal false , @myung.where(@age.not_in([1])).blank?
640
+ assert_equal false , @myung.where(@age.not_in([1,2])).blank?
641
+ assert_equal true , @myung.where(@age.not_in([1,23])).blank?
642
+ assert_equal false , @myung.where(@age.not_in(nil)).blank?
643
+ assert_equal false , @myung.where(@age.not_in([nil])).blank?
644
+ assert_equal false , @myung.where(@age.not_in([nil,1])).blank?
645
+ assert_equal true , @myung.where(@age.not_in([nil,23])).blank?
646
+ assert_equal false , @myung.where(@age.not_in([nil,1,2])).blank?
647
+ assert_equal true , @myung.where(@age.not_in([nil,1,23])).blank?
648
+
649
+ assert_equal false , @myung.where(@age.not_in(1..2)).blank?
650
+
651
+ #if the column is null, the entry will never be selected with not in (like every DBMS does)
652
+ #assert_equal false , @test.where(@age.not_in(1)).blank?
653
+ #assert_equal false , @test.where(@age.not_in([1])).blank?
654
+ #assert_equal false , @test.where(@age.not_in([1,2])).blank?
655
+ #assert_equal true , @test.where(@age.not_in(nil)).blank?
656
+ #assert_equal true , @test.where(@age.not_in([nil])).blank?
657
+ #assert_equal true , @test.where(@age.not_in([nil,1])).blank?
658
+ #assert_equal true , @test.where(@age.not_in([nil,1,2])).blank?
659
+ end
660
+
661
+ def test_alias_shortened
662
+ if ['postgresql','oracle'].include?(@env_db)
663
+ new_alias = Arel.shorten('azerty' * 15)
664
+ at = User.arel_table.alias('azerty' * 15)
665
+ assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
666
+ assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
667
+ assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
668
+ User.select(at[:id]).from(at).to_sql.downcase
669
+ end
670
+ end
671
+
672
+ def test_stat_functions
673
+ skip "SQLite doesn't work for most on this functions" if $sqlite
674
+ #puts t(User.where(nil), @score.average)
675
+ #puts t(User.where(nil), @score.variance(true))
676
+ #puts t(User.where(nil), @score.variance(false))
677
+ #puts t(User.where(nil), @score.std(true))
678
+ #puts t(User.where(nil), @score.std(false))
679
+
680
+ assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
681
+ assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
682
+ assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
683
+ assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
684
+ assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
685
+ end
686
+
687
+ def test_levenshtein_distance
688
+ skip "Not Yet Implemented" if $sqlite
689
+ assert_equal 0, t(@arthur,@name.levenshtein_distance("Arthur"))
690
+ assert_equal 2, t(@arthur,@name.levenshtein_distance("Artoor"))
691
+ assert_equal 1, t(@arthur,@name.levenshtein_distance("Artehur"))
692
+ end
693
+
694
+ def test_json
695
+ skip "Can't be tested on travis"
696
+ #creation
697
+ assert_equal 'Arthur', t(@arthur,ArelExtensions::Nodes::Json.new(@name))
698
+ assert_equal ["Arthur","Arthur"], parse_json(t(@arthur,ArelExtensions::Nodes::Json.new(@name,@name)))
699
+ assert_equal ({"Arthur" => "Arthur", "Arthur2" => "ArthurArthur"}), parse_json(t(@arthur,ArelExtensions::Nodes::Json.new({@name => @name,@name+"2" => @name+@name})))
700
+ assert_equal ({"Arthur" => "Arthur","Arthur2" => 1}), parse_json(t(@arthur,ArelExtensions::Nodes::Json.new({@name => @name,@name+"2" => 1})))
701
+ assert_equal ([{"age" => 21},{"name" => "Arthur","score" => 65.62}]), parse_json(t(@arthur,ArelExtensions::Nodes::Json.new([{age: @age},{name: @name,score: @score}])))
702
+
703
+ skip "Not Yet Implemented" if $sqlite || ['oracle','mssql'].include?(@env_db)
704
+
705
+ #get
706
+ h1 = ArelExtensions::Nodes::Json.new({@name => @name+@name,@name+"2" => 1})
707
+ assert_equal "ArthurArthur", parse_json(t(@arthur,h1.get(@name)))
708
+ h2 = ArelExtensions::Nodes::Json.new([{age: @age},{name: @name,score: @score}])
709
+ assert_equal ({"age" => 21}), parse_json(t(@arthur,h2.get(0)))
710
+ assert_equal 21, parse_json(t(@arthur,h2.get(0).get('age')))
711
+ assert_nil t(@arthur,h2.get('age'))
712
+ #set
713
+ assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1}), parse_json(t(@arthur,h1.set(@name, ['toto','tata'])))
714
+ assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.set(@name+"3",2)))
715
+ assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => nil}), parse_json(t(@arthur,h1.set(@name+"3",nil)))
716
+ assert_equal ({"Arthur" => "ArthurArthur", "Arthur2" => 1, "Arthur3" => {"a" => 2}}), parse_json(t(@arthur,h1.set(@name+"3",{a: 2})))
717
+ #merge
718
+ assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata']},{@name+"3" => 2})))
719
+ assert_equal ({"Arthur" => ["toto", "tata"], "Arthur2" => 1, "Arthur3" => 2}), parse_json(t(@arthur,h1.merge({@name => ['toto','tata'], @name+"3" => 2})))
720
+ assert_equal ({"Arthur" => "ArthurArthur","Arthur2" => 1}), parse_json(t(@arthur,h1.merge({})))
721
+ end
722
+
723
+ def test_as_on_everything
724
+ name = @arthur.select(@name.as('NaMe')).first.attributes
725
+ assert_equal 'Arthur', name["NaMe"] || name["name"] #because of Oracle
726
+ assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes["Na Me"]
727
+ assert_equal 'Arthur', @arthur.select(@name.as('Na-Me')).first.attributes["Na-Me"]
728
+ end
686
729
  end
687
730
  end
688
731
  end