arel_extensions 1.3.4 → 2.0.0.rc3

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