arel_extensions 1.3.5 → 2.0.0.rc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.gitignore +6 -7
  4. data/.rubocop.yml +3 -67
  5. data/.travis/oracle/download.js +152 -0
  6. data/.travis/oracle/download.sh +30 -0
  7. data/.travis/oracle/download_ojdbc.js +116 -0
  8. data/.travis/oracle/install.sh +34 -0
  9. data/.travis/setup_accounts.sh +9 -0
  10. data/.travis/sqlite3/extension-functions.sh +6 -0
  11. data/.travis.yml +223 -0
  12. data/Gemfile +21 -16
  13. data/README.md +13 -125
  14. data/Rakefile +30 -41
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -51
  17. data/arel_extensions.gemspec +14 -14
  18. data/functions.html +3 -3
  19. data/gemfiles/rails3.gemfile +10 -10
  20. data/gemfiles/rails4.gemfile +14 -14
  21. data/gemfiles/rails5_0.gemfile +14 -14
  22. data/gemfiles/rails5_1_4.gemfile +14 -14
  23. data/gemfiles/rails5_2.gemfile +14 -16
  24. data/init/mssql.sql +4 -4
  25. data/init/mysql.sql +38 -38
  26. data/init/oracle.sql +0 -0
  27. data/init/postgresql.sql +21 -21
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -4
  30. data/lib/arel_extensions/boolean_functions.rb +14 -53
  31. data/lib/arel_extensions/common_sql_functions.rb +17 -16
  32. data/lib/arel_extensions/comparators.rb +28 -27
  33. data/lib/arel_extensions/date_duration.rb +14 -13
  34. data/lib/arel_extensions/insert_manager.rb +15 -18
  35. data/lib/arel_extensions/math.rb +53 -55
  36. data/lib/arel_extensions/math_functions.rb +39 -46
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +2 -1
  39. data/lib/arel_extensions/nodes/case.rb +16 -16
  40. data/lib/arel_extensions/nodes/cast.rb +8 -10
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +4 -3
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +18 -9
  45. data/lib/arel_extensions/nodes/date_diff.rb +26 -42
  46. data/lib/arel_extensions/nodes/duration.rb +3 -0
  47. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  48. data/lib/arel_extensions/nodes/floor.rb +1 -1
  49. data/lib/arel_extensions/nodes/format.rb +8 -35
  50. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  51. data/lib/arel_extensions/nodes/function.rb +37 -42
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  53. data/lib/arel_extensions/nodes/json.rb +39 -48
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  56. data/lib/arel_extensions/nodes/locate.rb +2 -1
  57. data/lib/arel_extensions/nodes/log10.rb +2 -1
  58. data/lib/arel_extensions/nodes/matches.rb +7 -5
  59. data/lib/arel_extensions/nodes/md5.rb +1 -0
  60. data/lib/arel_extensions/nodes/power.rb +5 -5
  61. data/lib/arel_extensions/nodes/rand.rb +1 -0
  62. data/lib/arel_extensions/nodes/repeat.rb +5 -3
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +6 -5
  65. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  66. data/lib/arel_extensions/nodes/std.rb +21 -18
  67. data/lib/arel_extensions/nodes/substring.rb +16 -8
  68. data/lib/arel_extensions/nodes/then.rb +1 -1
  69. data/lib/arel_extensions/nodes/trim.rb +6 -4
  70. data/lib/arel_extensions/nodes/union.rb +8 -5
  71. data/lib/arel_extensions/nodes/union_all.rb +7 -4
  72. data/lib/arel_extensions/nodes/wday.rb +4 -0
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +7 -5
  75. data/lib/arel_extensions/predications.rb +43 -44
  76. data/lib/arel_extensions/railtie.rb +5 -5
  77. data/lib/arel_extensions/set_functions.rb +7 -5
  78. data/lib/arel_extensions/string_functions.rb +29 -58
  79. data/lib/arel_extensions/tasks.rb +6 -6
  80. data/lib/arel_extensions/version.rb +1 -1
  81. data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
  82. data/lib/arel_extensions/visitors/mssql.rb +181 -279
  83. data/lib/arel_extensions/visitors/mysql.rb +210 -280
  84. data/lib/arel_extensions/visitors/oracle.rb +180 -201
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -252
  87. data/lib/arel_extensions/visitors/sqlite.rb +126 -140
  88. data/lib/arel_extensions/visitors/to_sql.rb +237 -272
  89. data/lib/arel_extensions/visitors.rb +59 -75
  90. data/lib/arel_extensions.rb +31 -159
  91. data/test/database.yml +7 -15
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +116 -105
  94. data/test/support/fake_record.rb +3 -3
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +11 -11
  97. data/test/visitors/test_bulk_insert_sqlite.rb +13 -12
  98. data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
  99. data/test/visitors/test_oracle.rb +55 -55
  100. data/test/visitors/test_to_sql.rb +226 -419
  101. data/test/with_ar/all_agnostic_test.rb +361 -578
  102. data/test/with_ar/insert_agnostic_test.rb +21 -27
  103. data/test/with_ar/test_bulk_sqlite.rb +16 -17
  104. data/test/with_ar/test_math_sqlite.rb +26 -26
  105. data/test/with_ar/test_string_mysql.rb +33 -31
  106. data/test/with_ar/test_string_sqlite.rb +34 -30
  107. metadata +22 -29
  108. data/.github/workflows/ruby.yml +0 -341
  109. data/gemfiles/rails6.gemfile +0 -30
  110. data/gemfiles/rails6_1.gemfile +0 -30
  111. data/gemfiles/rails7.gemfile +0 -23
  112. data/gemspecs/arel_extensions-v1.gemspec +0 -28
  113. data/gemspecs/arel_extensions-v2.gemspec +0 -28
  114. data/generate_gems.sh +0 -15
  115. data/lib/arel_extensions/aliases.rb +0 -14
  116. data/lib/arel_extensions/helpers.rb +0 -51
  117. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  118. data/lib/arel_extensions/nodes/sum.rb +0 -7
  119. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  120. data/test/arelx_test_helper.rb +0 -71
  121. data/version_v1.rb +0 -3
  122. 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: %w[Lucas Sophie]), @name.group_concat(' '))
197
- assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(','))
198
- assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat)
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: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.asc))
202
- assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.desc))
203
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', [@score.asc, @name.asc]))
204
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @score.asc, @name.asc))
205
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
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,193 +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 !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
423
- # TODO: Standarize timezone conversion across all databases.
424
- # This test case will be refactored and should work the same across all vendors.
425
- if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
426
- skip "SQL Server < 2016 is not currently supported"
427
- end
428
-
429
- tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
430
-
431
- assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', tz['utc']))
432
- assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
433
- assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
434
-
435
- # Skipping conversion from UTC to the desired timezones fails in SQL
436
- # Server and Postgres. This is mainly due to the fact that timezone
437
- # information is not preserved in the column itself.
438
- #
439
- # MySQL is happy to consider that times by default are in UTC.
440
- assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
441
- refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', tz['paris'])) if !['mysql'].include?(ENV['DB'])
442
-
443
- # Winter/Summer time
444
- assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
445
- if ENV['DB'] == 'mssql'
446
- assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
447
- assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
448
- else
449
- assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
450
- assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
451
- end
452
- end
453
-
454
- def test_format_iso_week
455
- skip "Unsupported ISO week number for DB=#{ENV['DB']}" if ['sqlite'].include?(ENV['DB'])
456
- assert_equal '10', t(@lucas, @updated_at.format('%V'))
457
- {
458
- '2024-01-01 10:42:00' => '01', # Monday
459
- '2030-01-01 10:42:00' => '01', # Tuesday
460
- '2025-01-01 10:42:00' => '01', # Wednesday
461
- '2026-01-01 10:42:00' => '01', # Thursday
462
- '2027-01-01 10:42:00' => '53', # Friday
463
- '2028-01-01 10:42:00' => '52', # Saturday
464
- '2034-01-01 10:42:00' => '52', # Sunday
465
- }.each do |date, exp|
466
- assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).format('%V'))
467
- end
468
- end
469
-
470
- def test_format_iso_year_of_week
471
- skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
472
- assert_equal '2014', t(@lucas, @updated_at.format('%G'))
473
-
474
- {
475
- '2024-01-01 10:42:00' => '2024', # Monday
476
- '2030-01-01 10:42:00' => '2030', # Tuesday
477
- '2025-01-01 10:42:00' => '2025', # Wednesday
478
- '2026-01-01 10:42:00' => '2026', # Thursday
479
- '2027-01-01 10:42:00' => '2026', # Friday
480
- '2028-01-01 10:42:00' => '2027', # Saturday
481
- '2034-01-01 10:42:00' => '2033', # Sunday
482
- }.each do |date, exp|
483
- assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).format('%G'))
484
- end
485
- end
486
-
487
- def test_format_date_with_names
488
- skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
489
- assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
490
- assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
491
-
492
- skip "#{ENV['DB']} does not support ALLCAPS month and day names" if ['mysql'].include?(ENV['DB'])
493
- assert_equal 'Mon, 03 MAR 14', t(@lucas, @updated_at.format('%a, %d %^b %y'))
494
- assert_equal 'Monday, 03 MARCH 14', t(@lucas, @updated_at.format('%A, %d %^B %y'))
495
- end
496
-
497
- def switch_to_lang(lang)
498
- languages = {
499
- 'mssql' => {en: 'English', fr: 'French'},
500
- 'mysql' => {en: 'en_US', fr: 'fr_FR'},
501
- 'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
502
- }
503
-
504
- sql = {
505
- 'mssql' => ->(l) { "SET LANGUAGE #{l};" },
506
- 'mysql' => ->(l) { "SET lc_time_names = '#{l}';" },
507
- 'postgresql' => ->(l) { "SET lc_time to '#{l}';" }
508
- }
509
-
510
- User.connection.execute(sql[ENV['DB']][languages[ENV['DB']][lang]])
511
- end
512
-
513
- def test_format_date_with_names_and_lang_switch
514
- skip "#{ENV['DB']} does not support word-based formatting for month and day names" if ['sqlite'].include?(ENV['DB'])
515
-
516
- # the begin-rescue block is here to make sure we set the db back to en_US
517
- # if we fail, so that other tests don't get contaminated.
518
- #
519
- # Tests should assert one single thing in principle, but until we
520
- # refactor this whole thing, we'll have to do tricks of this sort.
521
- begin
522
- switch_to_lang(:en)
523
- case ENV['DB']
524
- when 'mysql', 'postgresql'
525
- assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
526
- assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
527
- when 'mssql'
528
- assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.format('%A, %d %B %y'))
529
- end
530
- switch_to_lang(:fr)
531
- case ENV['DB']
532
- when 'mysql'
533
- assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
534
- assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
535
- when 'postgresql'
536
- assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
537
- assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
538
- when 'mssql'
539
- assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.format('%A, %d %B %y'))
540
- end
541
- ensure
542
- switch_to_lang(:en)
543
- end
544
347
  end
545
348
 
546
349
  def test_coalesce
547
- assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, 'default') + ' concat')
350
+ assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
548
351
 
549
- assert_equal 'toto', t(@test, @other.coalesce(''))
352
+ assert_equal 'toto', t(@test, @other.coalesce(""))
550
353
 
551
- assert_equal ' ', t(@myung, @comments.coalesce('Myung').coalesce('ignored'))
552
- 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"))
553
356
  if @env_db == 'oracle'
554
- assert_nil t(@laure, @comments.coalesce(''))
555
- assert_nil t(@camille, @other.coalesce(''))
357
+ assert_nil t(@laure, @comments.coalesce(""))
358
+ assert_nil t(@camille, @other.coalesce(""))
556
359
  else
557
- assert_equal('', t(@laure, @comments.coalesce('')))
558
- assert_equal '', t(@camille, @other.coalesce(''))
360
+ assert_equal('', t(@laure, @comments.coalesce("")))
361
+ assert_equal '', t(@camille, @other.coalesce(""))
559
362
  end
560
363
  assert_equal 100, t(@test, @age.coalesce(100))
561
- assert_equal 'Camille', t(@camille, @name.coalesce(nil, 'default'))
364
+ assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
562
365
  assert_equal 20, t(@test, @age.coalesce(nil, 20))
563
366
 
564
- assert_equal 20, t(@test, @age.coalesce(10) + 10)
565
- 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)
566
369
  end
567
370
 
568
371
  # Comparators
@@ -571,37 +374,37 @@ module ArelExtensions
571
374
  assert_equal 2, User.where(@age <= 10).count
572
375
  assert_equal 3, User.where(@age > 20).count
573
376
  assert_equal 4, User.where(@age >= 20).count
574
- assert_equal 2, User.where(@age > 5).where(@age < 20).count
377
+ assert_equal 1, User.where(@age > 5).where(@age < 20).count
575
378
  end
576
379
 
577
380
  def test_date_comparator
578
381
  d = Date.new(2016, 5, 23)
579
382
  assert_equal 0, User.where(@created_at < d).count
580
- assert_equal 9, User.where(@created_at >= d).count
383
+ assert_equal 8, User.where(@created_at >= d).count
581
384
  end
582
385
 
583
386
  def test_date_duration
584
- # Year
387
+ #Year
585
388
  assert_equal 2016, t(@lucas, @created_at.year).to_i
586
- assert_equal 0, User.where(@created_at.year.eq('2012')).count
587
- # Month
389
+ assert_equal 0, User.where(@created_at.year.eq("2012")).count
390
+ #Month
588
391
  assert_equal 5, t(@camille, @created_at.month).to_i
589
- assert_equal 9, User.where(@created_at.month.eq('05')).count
590
- # Week
392
+ assert_equal 8, User.where(@created_at.month.eq("05")).count
393
+ #Week
591
394
  assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
592
- assert_equal 9, User.where(@created_at.month.eq('05')).count
593
- # Day
395
+ assert_equal 8, User.where(@created_at.month.eq("05")).count
396
+ #Day
594
397
  assert_equal 23, t(@laure, @created_at.day).to_i
595
- assert_equal 0, User.where(@created_at.day.eq('05')).count
398
+ assert_equal 0, User.where(@created_at.day.eq("05")).count
596
399
 
597
- # skip "manage DATE" if @env_db == 'oracle'
598
- # Hour
400
+ #skip "manage DATE" if @env_db == 'oracle'
401
+ #Hour
599
402
  assert_equal 0, t(@laure, @created_at.hour).to_i
600
403
  assert_equal 12, t(@lucas, @updated_at.hour).to_i
601
- # Minute
404
+ #Minute
602
405
  assert_equal 0, t(@laure, @created_at.minute).to_i
603
406
  assert_equal 42, t(@lucas, @updated_at.minute).to_i
604
- # Second
407
+ #Second
605
408
  assert_equal 0, t(@laure, @created_at.second).to_i
606
409
  assert_equal 0, t(@lucas, @updated_at.second).to_i
607
410
  end
@@ -609,8 +412,8 @@ module ArelExtensions
609
412
  def test_datetime_diff
610
413
  assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
611
414
  if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
612
- assert_equal 42 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
613
- assert_equal(-3600 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
415
+ assert_equal 42 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
416
+ assert_equal(-3600 * 86400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
614
417
  else
615
418
  assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
616
419
  assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
@@ -621,8 +424,7 @@ module ArelExtensions
621
424
  end
622
425
  end
623
426
 
624
-
625
- skip 'not yet implemented' if $sqlite
427
+ skip "not yet implemented" if $sqlite
626
428
 
627
429
  date1 = Date.new(2016, 5, 23)
628
430
  durPos = 10.years
@@ -634,108 +436,106 @@ module ArelExtensions
634
436
 
635
437
  datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
636
438
  # Pull Request #5 tests
637
- # puts (@created_at + durPos).cast(:date).to_sql
638
- assert_includes [date2, '2026-05-23'], t(@test, (@created_at + durPos).cast(:date))
639
- assert_includes [date3, '2006-05-23'], t(@test, (@created_at + durNeg).cast(:date))
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))
640
442
 
641
- # puts (@created_at + @created_at.day).cast(:date).to_sql
642
- assert_includes [date4, '2016-06-15'], t(@test, (@created_at + @created_at.day).cast(:date))
643
- # puts (@created_at - @created_at.day).cast(:date).to_sql
644
- 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))
645
447
 
646
- assert_includes [datetime1 + 42.seconds, '2014-03-03 12:42:42 UTC'], t(@lucas, (@updated_at + @updated_at.minute))
647
- assert_includes [datetime1 - 42.seconds, '2014-03-03 12:41:18 UTC'], t(@lucas, (@updated_at - @updated_at.minute))
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))
648
450
 
649
451
  # (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
650
- assert_includes [datetime1 + (12 * 60 + 42).seconds, '2014-03-03 12:54:42 UTC'],
651
- t(@lucas, (@updated_at + Arel.duration('s', (@updated_at.hour * 60 + @updated_at.minute))))
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))))
652
454
 
653
- assert_includes [datetime1 + (12 * 60 + 42).minutes, '2014-03-04 01:24:00 UTC'],
654
- t(@lucas, (@updated_at + Arel.duration('mn', (@updated_at.hour * 60 + @updated_at.minute))))
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))))
655
457
 
656
- assert_includes ['2024-03-03'], t(@lucas, (@updated_at + durPos).format('%Y-%m-%d'))
657
- # puts (@updated_at - durPos).to_sql
658
- 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'))
659
461
 
660
462
 
661
463
  # we test with the ruby object or the string because some adapters don't return an object Date
662
- # end
464
+ # end
663
465
  end
664
466
 
665
467
  # TODO; cast types
666
468
  def test_cast_types
667
- assert_equal '5', t(@lucas, @age.cast(:string))
668
- skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM.match?(/java/i)
469
+ assert_equal "5", t(@lucas, @age.cast(:string))
669
470
  if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
670
- assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).cast(:string).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
671
- assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle'
672
- assert_equal '20.16', t(@laure, @score.cast(:string)).gsub(/0*\z/, '')
673
- assert_equal '20.161', t(@laure, @score.cast(:string) + 1).gsub(/0*1\z/, '1')
674
- assert_equal 21.16, t(@laure, @score.cast(:string).cast(:decimal) + 1)
675
- assert_equal 21, t(@laure, @score.cast(:string).cast(:int) + 1)
676
-
677
- assert_equal String, t(@lucas, @updated_at.cast(:string)).class
678
-
679
- assert_equal Date, t(@lucas, @updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
680
- assert_equal Time, t(@lucas, @updated_at.cast(:string).cast(:datetime)).class
681
- assert_equal Time, t(@lucas, @updated_at.cast(:time)).class
682
-
683
- # mysql adapter in rails7 adds some infos we just squeeze here
684
- assert_equal '2014-03-03 12:42:00', t(@lucas, @updated_at.cast(:string)).split('.').first unless @env_db == 'mssql' # locale dependent
685
- assert_equal Date.parse('2014-03-03'), t(@lucas, Arel.quoted('2014-03-03').cast(:date))
686
- assert_equal Date.parse('5014-03-03'), t(@lucas, (@age.cast(:string) + '014-03-03').cast(:date))
687
- assert_equal Time.parse('2014-03-03 12:42:00 UTC'), t(@lucas, @updated_at.cast(:string).cast(:datetime))
688
- assert_equal Date.parse('2014-03-03'), t(@lucas, @updated_at.cast(:date))
689
- assert_equal '12:42:00', t(@lucas, @updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
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
690
489
  end
691
490
  end
692
491
 
693
492
  def test_is_null
694
- # puts User.where(@age.is_null).select(@name).to_sql
695
- # puts @age.is_null
696
- # puts @age.is_null.inspect
697
- # puts @age.is_null.to_sql
698
- # puts @age=='34'
699
- 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
700
499
  end
701
500
 
702
501
  def test_math_plus
703
502
  d = Date.new(1997, 6, 15)
704
- # Concat String
705
- assert_equal 'SophiePhan', t(@sophie, @name + 'Phan')
706
- assert_equal 'Sophie2', t(@sophie, @name + 2)
707
- assert_equal 'Sophie1997-06-15', t(@sophie, @name + d)
708
- assert_equal 'Sophie15', t(@sophie, @name + @age)
709
- assert_equal 'SophieSophie', t(@sophie, @name + @name)
710
- assert_equal 'SophieSophieSophie', t(@sophie, @name + @name + @name)
711
- assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name.concat(@name)))
712
- assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name).concat(@name))
713
- # FIXME: should work as expected in Oracle
714
- assert_equal 'Sophie2016-05-23', t(@sophie, @name + @created_at) unless @env_db == 'oracle'
715
- # 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
716
515
  assert_equal 1, User.where((@age + 10).eq(33)).count
717
- assert_equal 1, User.where((@age + '1').eq(6)).count
516
+ assert_equal 1, User.where((@age + "1").eq(6)).count
718
517
  assert_equal 1, User.where((@age + @age).eq(10)).count
719
- # concat Date
720
- # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
721
- assert_equal '2016-05-24', t(@myung, @created_at + 1).to_date.to_s
722
- assert_equal '2016-05-25', t(@myung, @created_at + 2.day).to_date.to_s
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
723
522
  end
724
523
 
524
+
725
525
  def test_math_minus
726
526
  d = Date.new(2016, 5, 20)
727
- # Datediff
728
- assert_equal 9, User.where((@created_at - @created_at).eq(0)).count
729
- assert_equal 3, @laure.select((@created_at - d).as('res')).first.res.abs.to_i
730
- # 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
731
531
  assert_equal 0, User.where((@age - 10).eq(50)).count
732
- assert_equal 0, User.where((@age - '10').eq(50)).count
532
+ assert_equal 0, User.where((@age - "10").eq(50)).count
733
533
  # assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
734
- 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
735
535
  end
736
536
 
737
537
  def test_wday
738
- # d = Date.new(2016, 6, 26)
538
+ #d = Date.new(2016, 6, 26)
739
539
  assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
740
540
  end
741
541
 
@@ -754,8 +554,8 @@ module ArelExtensions
754
554
  assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(23)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
755
555
  assert_equal 2, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
756
556
 
757
- assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0))).to_sql).length
758
- assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21))).to_sql).length
557
+ assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).to_sql).length
558
+ assert_equal 3, User.find_by_sql((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).to_sql).length
759
559
  assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).as('my_union')).length
760
560
  assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(23))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
761
561
  assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
@@ -766,118 +566,116 @@ module ArelExtensions
766
566
  # Case clause
767
567
  def test_case
768
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)
769
- assert_equal 4, User.where(@score.when(20.16).then(1).else(0).eq(1)).count
770
- assert_equal 2, t(@arthur, @score.when(65.62, 1).else(0) + 1)
771
- assert_equal 0, t(@arthur, @score.when(65.62, 1).else(0) - 1)
772
- assert_equal '11', t(@arthur, @score.when(65.62).then('1').else('0') + '1')
773
- assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score) + 1)
774
- assert_equal '65.621', t(@arthur, @score.when(65.62).then(@score.cast(:string)).else(@score.cast(:string)) + 1).tr('0', '') # tr is here because of precision on cast for some DBMS
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
775
574
  end
776
575
 
777
576
  def test_format_numbers
778
- # score of Arthur = 65.62
779
- skip ' Works with SQLite if the version used knows printf' if $sqlite
780
-
781
- assert_equal 'Wrong Format', t(@arthur, @score.format_number('$ %...234.6F €', 'fr_FR'))
782
- assert_equal 'AZERTY65,62', t(@arthur, @score.format_number('AZERTY%.2f', 'fr_FR'))
783
- assert_equal '65,62AZERTY', t(@arthur, @score.format_number('%.2fAZERTY', 'fr_FR'))
784
- assert_equal '$ 65.62 €', t(@arthur, @score.format_number('$ %.2f €', 'en_US'))
785
- assert_equal '$ 66 €', t(@arthur, @score.format_number('$ %.0f €', 'en_US'))
786
- assert_equal '$ 0065,62 €', t(@arthur, @score.format_number('$ %07.2f €', 'fr_FR'))
787
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-07.2f €', 'fr_FR'))
788
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-7.2f €', 'fr_FR'))
789
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ % 7.2f €', 'fr_FR'))
790
- assert_equal '$ 65,6 €', t(@arthur, @score.format_number('$ % 7.1f €', 'fr_FR'))
791
- assert_equal '$ +65,62 €', t(@arthur, @score.format_number('$ % +7.2f €', 'fr_FR'))
792
- assert_equal '$ +065,62 €', t(@arthur, @score.format_number('$ %0+7.2f €', 'fr_FR'))
793
- assert_includes ['$ 6,56e1 €', '$ 6,56e+01 €'], t(@arthur, @score.format_number('$ %.2e €', 'fr_FR'))
794
- assert_includes ['$ 6,56E1 €', '$ 6,56E+01 €'], t(@arthur, @score.format_number('$ %.2E €', 'fr_FR'))
795
- assert_includes ['$ 6,562E1 €', '$ 6,562E+01 €'], t(@arthur, @score.format_number('$ %.3E €', 'fr_FR'))
796
- assert_equal '123 456 765,6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'sv_SE')).tr("\u00A0", ' ') # some DBMS put no-break space here (it makes sense thus)
797
- assert_equal '123456765,6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'fr_FR')).delete("\u00A0") # because SqlServer does it like no one else
798
- assert_equal '123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'en_US'))
799
- assert_equal ' 123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%16.1f', 'en_US'))
800
- assert_equal '$ 0,00 €', t(@arthur, @score.when(65.62).then(Arel.sql('null')).else(1).format_number('$ %.2f €', 'fr_FR'))
801
- assert_equal '$ 0,00 €', t(@arthur, (@score - 65.62).format_number('$ %.2f €', 'fr_FR'))
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"))
802
601
  end
803
602
 
804
603
  def test_accent_insensitive
805
- skip 'SQLite is natively Case Insensitive and Accent Sensitive' if $sqlite
806
- 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'
807
606
  # actual comments value: "arrêté"
808
- # AI & CI
607
+ #AI & CI
809
608
  if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
810
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrêté')).then('1').else('0'))
811
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrete')).then('1').else('0'))
812
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('àrrétè')).then('1').else('0'))
813
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_imatches('arretez')).then('1').else('0'))
814
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrete')).then('1').else('0'))
815
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrêté')).then('1').else('0'))
816
- # AI & CS
817
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrêté')).then('1').else('0'))
818
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrete')).then('1').else('0'))
819
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('àrrétè')).then('1').else('0'))
820
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('arretez')).then('1').else('0'))
821
- if !%w[oracle postgresql mysql].include?(@env_db) # AI => CI
822
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrete')).then('1').else('0'))
823
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrêté')).then('1').else('0'))
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"))
824
623
  end
825
624
  end
826
- # AS & CI
827
- 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"))
828
627
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
829
- assert_equal '0', t(@arthur, Arel.when(@comments.imatches('arrete')).then('1').else('0'))
830
- assert_equal '0', t(@arthur, Arel.when(@comments.imatches('àrrétè')).then('1').else('0'))
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"))
831
630
  end
832
- 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"))
833
632
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
834
- 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"))
835
634
  end
836
- assert_equal '1', t(@arthur, Arel.when(@comments.imatches('Arrêté')).then('1').else('0'))
837
- # AS & CS
838
- assert_equal '1', t(@arthur, Arel.when(@comments.smatches('arrêté')).then('1').else('0'))
839
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arrete')).then('1').else('0'))
840
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('àrrétè')).then('1').else('0'))
841
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arretez')).then('1').else('0'))
842
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('Arrete')).then('1').else('0'))
843
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('Arrêté')).then('1').else('0'))
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"))
844
643
  end
845
644
 
846
645
  def test_subquery_with_order
847
- skip if ['mssql'].include?(@env_db) && Arel::VERSION.to_i < 10
848
- assert_equal 9, User.where(name: User.select(:name).order(:name)).count
849
- assert_equal 9, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
850
- if !['mysql'].include?(@env_db) # MySql can't have limit in IN subquery
851
- assert_equal 2, User.where(name: User.select(:name).order(:name).limit(2)).count
852
- # assert_equal 6, User.where(name: User.select(:name).order(:name).offset(2)).count
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
853
651
  end
854
652
  end
855
653
 
856
654
  def test_in_with_nil
857
- assert_predicate @myung.where(@age.in(1)), :blank?
858
- assert_predicate @myung.where(@age.in(23)), :present?
859
- assert_predicate @myung.where(@age.in([1])), :blank?
860
- assert_predicate @myung.where(@age.in([1, 2])), :blank?
861
- assert_predicate @myung.where(@age.in([1, 23])), :present?
862
- assert_predicate @myung.where(@age.in(nil)), :blank?
863
- assert_predicate @myung.where(@age.in([nil])), :blank?
864
- assert_predicate @myung.where(@age.in([nil, 1])), :blank?
865
- assert_predicate @myung.where(@age.in([nil, 23])), :present?
866
- assert_predicate @myung.where(@age.in([nil, 1, 2])), :blank?
867
- assert_predicate @myung.where(@age.in([nil, 1, 23])), :present?
868
- assert_predicate @test.where(@age.in(1)), :blank?
869
- assert_predicate @test.where(@age.in([1])), :blank?
870
- assert_predicate @test.where(@age.in([1, 2])), :blank?
871
- assert_predicate @test.where(@age.in(nil)), :present?
872
- assert_predicate @test.where(@age.in([nil])), :present?
873
- assert_predicate @test.where(@age.in([nil, 1])), :present?
874
- assert_predicate @test.where(@age.in([nil, 1, 2])), :present?
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?
875
673
  end
876
674
 
877
675
  def test_scope_with_in_plus_new
878
676
  begin
879
- @test.where(@age.in([1, 2])).new
880
- @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
881
679
  assert true
882
680
  rescue
883
681
  assert false
@@ -885,129 +683,114 @@ module ArelExtensions
885
683
  end
886
684
 
887
685
  def test_is_not_null
888
- assert_predicate @myung.where(@age.is_not_null), :present?
889
- 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?
890
688
  end
891
689
 
892
690
  def test_not_in_with_nil
893
- assert_predicate @myung.where(@age.not_in(1)), :present?
894
- assert_predicate @myung.where(@age.not_in(23)), :blank?
895
- assert_predicate @myung.where(@age.not_in([1])), :present?
896
- assert_predicate @myung.where(@age.not_in([1, 2])), :present?
897
- assert_predicate @myung.where(@age.not_in([1, 23])), :blank?
898
- assert_predicate @myung.where(@age.not_in(nil)), :present?
899
- assert_predicate @myung.where(@age.not_in([nil])), :present?
900
- assert_predicate @myung.where(@age.not_in([nil, 1])), :present?
901
- assert_predicate @myung.where(@age.not_in([nil, 23])), :blank?
902
- assert_predicate @myung.where(@age.not_in([nil, 1, 2])), :present?
903
- assert_predicate @myung.where(@age.not_in([nil, 1, 23])), :blank?
904
-
905
- assert_predicate @myung.where(@age.not_in(1..2)), :present?
906
-
907
- # if the column is null, the entry will never be selected with not in (like every DBMS does)
908
- # assert_predicate @test.where(@age.not_in(1)), :present?
909
- # assert_predicate @test.where(@age.not_in([1])), :present?
910
- # assert_predicate @test.where(@age.not_in([1,2])), :present?
911
- # assert_predicate @test.where(@age.not_in(nil)), :blank?
912
- # assert_predicate @test.where(@age.not_in([nil])), :blank?
913
- # assert_predicate @test.where(@age.not_in([nil,1])), :blank?
914
- # assert_predicate @test.where(@age.not_in([nil,1,2])), :blank?
915
- end
916
-
917
- def test_in_on_grouping
918
- skip 'We should modify the visitor of IN to make it work' if $sqlite || @env_db == 'mssql'
919
- assert_equal 2, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23), Arel.tuple('Arthur', 21))).count
920
- assert_equal 1, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23))).count
921
- assert_equal 0, User.where(Arel.tuple(@name, @age).in([])).count
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?
922
713
  end
923
714
 
924
715
  def test_alias_shortened
925
- if %w[postgresql oracle].include?(@env_db)
716
+ if ['postgresql','oracle'].include?(@env_db)
926
717
  new_alias = Arel.shorten('azerty' * 15)
927
718
  at = User.arel_table.alias('azerty' * 15)
928
719
  assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
929
720
  assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
930
- assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
931
- 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
932
723
  end
933
724
  end
934
725
 
935
726
  def test_stat_functions
936
727
  skip "SQLite doesn't work for most on this functions" if $sqlite
937
- # puts t(User.where(nil), @score.average)
938
- # puts t(User.where(nil), @score.variance(unbiased: true))
939
- # puts t(User.where(nil), @score.variance(unbiased: false))
940
- # puts t(User.where(nil), @score.std(unbiased: true))
941
- # puts t(User.where(nil), @score.std(unbiased: false))
942
-
943
- assert ( 15.43222 - t(User.where(nil), @score.average)).abs < 0.01
944
- assert (539.79804 - t(User.where(nil), @score.variance)).abs < 0.01
945
- assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
946
- assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
947
- assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
948
- skip 'Not Yet Implemented' # if !['postgresql'].include?(@env_db)
949
- assert_equal 2, User.select(@score.std(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
950
- assert_equal 2, User.select(@score.variance(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
951
- assert_equal 2, User.select(@score.sum(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
952
- assert_equal 2, User.select(@comments.group_concat(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
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
953
739
  end
954
740
 
955
741
  def test_levenshtein_distance
956
- skip 'Not Yet Implemented' if $sqlite
957
- assert_equal 0, t(@arthur, @name.levenshtein_distance('Arthur'))
958
- assert_equal 2, t(@arthur, @name.levenshtein_distance('Artoor'))
959
- assert_equal 1, t(@arthur, @name.levenshtein_distance('Artehur'))
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"))
960
746
  end
961
747
 
962
748
  def test_json
963
749
  skip "Can't be tested on travis"
964
- # creation
965
- assert_equal 'Arthur', t(@arthur, Arel.json(@name))
966
- assert_equal %w[Arthur Arthur], parse_json(t(@arthur, Arel.json(@name, @name)))
967
- assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 'ArthurArthur'}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => @name + @name})))
968
- assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 1}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => 1})))
969
- assert_equal [{'age' => 21}, {'name' => 'Arthur', 'score' => 65.62}], parse_json(t(@arthur, Arel.json([{age: @age}, {name: @name, score: @score}])))
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}])))
970
756
 
971
757
  # aggregate
972
- assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure'}),
973
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name}).group(false)))
974
- assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure', 'Laure' => 25, 'Lucas' => 5, 'Myung' => 23, 'Sophie' => 15}),
975
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name, @name => @age}).group(false)))
976
- assert_equal [{'5' => 'Lucas'}, {'15' => 'Sophie'}, {'23' => 'Myung'}, {'25' => 'Laure'}],
977
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score), Arel.json({@age => @name}).group(true, [@age])))
978
-
979
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_sql
980
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_a
981
-
982
- skip 'Not Yet Implemented' if $sqlite || %w[oracle mssql].include?(@env_db)
983
- # get
984
- h1 = Arel.json({@name => @name + @name, @name + '2' => 1})
985
- assert_equal 'ArthurArthur', parse_json(t(@arthur, h1.get(@name)))
986
- h2 = Arel.json([{age: @age}, {name: @name, score: @score}])
987
- assert_equal ({'age' => 21}), parse_json(t(@arthur, h2.get(0)))
988
- assert_equal 21, parse_json(t(@arthur, h2.get(0).get('age')))
989
- assert_nil t(@arthur, h2.get('age'))
990
- # set
991
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1}), parse_json(t(@arthur, h1.set(@name, %w[toto tata])))
992
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.set(@name + '3', 2)))
993
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => nil}), parse_json(t(@arthur, h1.set(@name + '3', nil)))
994
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => {'a' => 2}}), parse_json(t(@arthur, h1.set(@name + '3', {a: 2})))
995
- # merge
996
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata]}, {@name + '3' => 2})))
997
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata], @name + '3' => 2})))
998
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1}), parse_json(t(@arthur, h1.merge({})))
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({})))
999
785
  end
1000
786
 
1001
787
  def test_as_on_everything
1002
788
  name = @arthur.select(@name.as('NaMe')).first.attributes
1003
- assert_equal 'Arthur', name['NaMe'] || name['name'] # because of Oracle
1004
- assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes['Na Me']
1005
- assert_equal 'ArthurArthur', @arthur.select((@name + @name).as('Na-Me')).first.attributes['Na-Me']
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"]
1006
792
  end
1007
793
 
1008
- def test_exists_in_subquery
1009
- assert User.where(User.where(nil).arel.exists).first
1010
- end
1011
794
  end
1012
795
  end
1013
796
  end