arel_extensions 1.6.0 → 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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.gitignore +6 -7
  4. data/.rubocop.yml +3 -67
  5. data/.travis/oracle/download.js +152 -0
  6. data/.travis/oracle/download.sh +30 -0
  7. data/.travis/oracle/download_ojdbc.js +116 -0
  8. data/.travis/oracle/install.sh +34 -0
  9. data/.travis/setup_accounts.sh +9 -0
  10. data/.travis/sqlite3/extension-functions.sh +6 -0
  11. data/.travis.yml +223 -0
  12. data/Gemfile +28 -2
  13. data/README.md +91 -258
  14. data/Rakefile +30 -48
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -60
  17. data/arel_extensions.gemspec +14 -13
  18. data/functions.html +3 -3
  19. data/gemfiles/rails3.gemfile +20 -0
  20. data/gemfiles/rails4.gemfile +29 -0
  21. data/gemfiles/rails5_0.gemfile +29 -0
  22. data/gemfiles/rails5_1_4.gemfile +14 -14
  23. data/gemfiles/rails5_2.gemfile +14 -16
  24. data/init/mssql.sql +4 -4
  25. data/init/mysql.sql +38 -38
  26. data/init/oracle.sql +0 -0
  27. data/init/postgresql.sql +25 -24
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -7
  30. data/lib/arel_extensions/boolean_functions.rb +14 -53
  31. data/lib/arel_extensions/common_sql_functions.rb +17 -16
  32. data/lib/arel_extensions/comparators.rb +28 -29
  33. data/lib/arel_extensions/date_duration.rb +13 -17
  34. data/lib/arel_extensions/insert_manager.rb +15 -18
  35. data/lib/arel_extensions/math.rb +53 -55
  36. data/lib/arel_extensions/math_functions.rb +39 -46
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +2 -1
  39. data/lib/arel_extensions/nodes/case.rb +19 -20
  40. data/lib/arel_extensions/nodes/cast.rb +8 -10
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +4 -3
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +18 -9
  45. data/lib/arel_extensions/nodes/date_diff.rb +26 -42
  46. data/lib/arel_extensions/nodes/duration.rb +3 -0
  47. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  48. data/lib/arel_extensions/nodes/floor.rb +1 -1
  49. data/lib/arel_extensions/nodes/format.rb +8 -35
  50. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  51. data/lib/arel_extensions/nodes/function.rb +37 -46
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  53. data/lib/arel_extensions/nodes/json.rb +39 -52
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  56. data/lib/arel_extensions/nodes/locate.rb +2 -1
  57. data/lib/arel_extensions/nodes/log10.rb +2 -1
  58. data/lib/arel_extensions/nodes/matches.rb +8 -6
  59. data/lib/arel_extensions/nodes/md5.rb +1 -0
  60. data/lib/arel_extensions/nodes/power.rb +5 -5
  61. data/lib/arel_extensions/nodes/rand.rb +1 -0
  62. data/lib/arel_extensions/nodes/repeat.rb +5 -3
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +6 -5
  65. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  66. data/lib/arel_extensions/nodes/std.rb +21 -18
  67. data/lib/arel_extensions/nodes/substring.rb +16 -8
  68. data/lib/arel_extensions/nodes/then.rb +1 -1
  69. data/lib/arel_extensions/nodes/trim.rb +6 -4
  70. data/lib/arel_extensions/nodes/union.rb +8 -5
  71. data/lib/arel_extensions/nodes/union_all.rb +7 -4
  72. data/lib/arel_extensions/nodes/wday.rb +4 -0
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +5 -19
  75. data/lib/arel_extensions/predications.rb +44 -45
  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 +35 -91
  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 +194 -440
  83. data/lib/arel_extensions/visitors/mysql.rb +212 -368
  84. data/lib/arel_extensions/visitors/oracle.rb +179 -236
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -271
  87. data/lib/arel_extensions/visitors/sqlite.rb +127 -157
  88. data/lib/arel_extensions/visitors/to_sql.rb +238 -300
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +31 -235
  91. data/test/database.yml +10 -20
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +118 -121
  94. data/test/support/fake_record.rb +3 -11
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +12 -12
  97. data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
  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 +370 -773
  102. data/test/with_ar/insert_agnostic_test.rb +22 -28
  103. data/test/with_ar/test_bulk_sqlite.rb +17 -18
  104. data/test/with_ar/test_math_sqlite.rb +27 -27
  105. data/test/with_ar/test_string_mysql.rb +34 -32
  106. data/test/with_ar/test_string_sqlite.rb +35 -31
  107. metadata +38 -52
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -452
  111. data/CONTRIBUTING.md +0 -102
  112. data/Makefile +0 -18
  113. data/NEWS.md +0 -116
  114. data/bin/build +0 -15
  115. data/bin/publish +0 -8
  116. data/dev/arelx.dockerfile +0 -41
  117. data/dev/compose.yaml +0 -69
  118. data/dev/postgres.dockerfile +0 -5
  119. data/dev/rbenv +0 -189
  120. data/gemfiles/rails5.gemfile +0 -29
  121. data/gemfiles/rails6.gemfile +0 -34
  122. data/gemfiles/rails6_1.gemfile +0 -42
  123. data/gemfiles/rails7.gemfile +0 -42
  124. data/gemfiles/rails7_1.gemfile +0 -41
  125. data/gemfiles/rails7_2.gemfile +0 -41
  126. data/gemfiles/rails8.gemfile +0 -40
  127. data/gemfiles/rails8_1.gemfile +0 -41
  128. data/gemspecs/arel_extensions-v1.gemspec +0 -27
  129. data/gemspecs/arel_extensions-v2.gemspec +0 -27
  130. data/generate_gems.sh +0 -15
  131. data/lib/arel_extensions/aliases.rb +0 -14
  132. data/lib/arel_extensions/constants.rb +0 -13
  133. data/lib/arel_extensions/helpers.rb +0 -61
  134. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  135. data/lib/arel_extensions/nodes/byte_size.rb +0 -11
  136. data/lib/arel_extensions/nodes/char_length.rb +0 -11
  137. data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
  138. data/lib/arel_extensions/nodes/rollup.rb +0 -36
  139. data/lib/arel_extensions/nodes/select.rb +0 -10
  140. data/lib/arel_extensions/nodes/sum.rb +0 -7
  141. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  142. data/lib/arel_extensions/warning.rb +0 -42
  143. data/test/arelx_test_helper.rb +0 -94
  144. data/test/config_loader.rb +0 -9
  145. data/version_v1.rb +0 -3
  146. data/version_v2.rb +0 -3
@@ -1,39 +1,21 @@
1
- require 'arelx_test_helper'
1
+ require 'helper'
2
2
  require 'date'
3
3
 
4
- # class ActiveRecord::ConnectionAdapters::SQLServerAdapter
5
- # # We use *args to avoid breaking signature changes between versions.
6
- # # internal_exec_sql_query(sql, name = "SQL", binds = [], prepare: false)
7
- # def internal_exec_sql_query(*args)
8
- # sql = args.first
9
- # puts "[DEBUG] MSSQL Query: #{sql}\n"
10
-
11
- # # Call original implementation (defined in the DatabaseStatements module included in this class)
12
- # super
13
- # rescue => e
14
- # # Catch the crash to print the specific query that caused it one last time
15
- # puts "[CRASH]: #{args.first}\n"
16
- # raise e
17
- # end
18
- # end
19
-
20
4
  module ArelExtensions
21
- module WithAr
5
+ module WthAr
6
+
22
7
  class ListTest < Minitest::Test
8
+ require 'minitest/pride'
23
9
  def connect_db
24
- ActiveRecord::Base.configurations = ConfigLoader.load('test/database.yml')
25
- if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
26
- @env_db = (RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
27
- skip "Platform not supported (DB: #{ENV['DB']}, RUBY_ENGINE: #{RUBY_ENGINE}, RUBY_PLATFORM: #{RUBY_PLATFORM})"
10
+ ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
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"
28
14
  else
29
15
  @env_db = ENV['DB']
30
16
  end
31
17
  ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
32
- if ACTIVE_RECORD_VERSION >= V7_0
33
- ActiveRecord.default_timezone = :utc
34
- else
35
- ActiveRecord::Base.default_timezone = :utc
36
- end
18
+ ActiveRecord::Base.default_timezone = :utc
37
19
  @cnx = ActiveRecord::Base.connection
38
20
  $sqlite = @cnx.adapter_name =~ /sqlite/i
39
21
  $load_extension_disabled ||= false
@@ -48,14 +30,14 @@ module ArelExtensions
48
30
  t.column :name, :string
49
31
  t.column :comments, :text
50
32
  t.column :created_at, :date
51
- t.column :updated_at, :datetime, precision: nil
33
+ t.column :updated_at, :datetime
52
34
  t.column :duration, :time
53
35
  t.column :other, :string
54
- t.column :score, :decimal, precision: 20, scale: 10
36
+ t.column :score, :decimal, :precision => 20, :scale => 10
55
37
  end
56
38
  @cnx.drop_table(:product_tests) rescue nil
57
39
  @cnx.create_table :product_tests do |t|
58
- t.column :price, :decimal, precision: 20, scale: 10
40
+ t.column :price, :decimal, :precision => 20, :scale => 10
59
41
  end
60
42
  end
61
43
 
@@ -70,34 +52,24 @@ module ArelExtensions
70
52
  d = Date.new(2016, 5, 23)
71
53
  connect_db
72
54
  setup_db
73
- u = User.create age: 5, name: 'Lucas', created_at: d, score: 20.16, updated_at: Time.utc(2014, 3, 3, 12, 42, 0)
74
- @lucas = User.where(id: u.id)
75
- u = User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
76
- @sophie = User.where(id: u.id)
77
- u = User.create age: 20, name: 'Camille', created_at: d, score: -20.16, comments: ''
78
- @camille = User.where(id: u.id)
79
- u = User.create age: 21, name: 'Arthur', created_at: d, score: 65.62, comments: 'arrêté'
80
- @arthur = User.where(id: u.id)
81
- u = User.create age: 23, name: 'Myung', created_at: d, score: 20.16, comments: ' '
82
- @myung = User.where(id: u.id)
83
- 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)
84
- @laure = User.where(id: u.id)
85
- u = User.create age: nil, name: 'Test', created_at: d, score: 1.62, other: 'toto'
86
- @test = User.where(id: u.id)
87
- u = User.create age: -42, name: 'Negatif', comments: '1,22,3,42,2', created_at: d, updated_at: d.to_time, score: 0.17, other: '2'
88
- @neg = User.where(id: u.id)
89
- u = User.create age: 15, name: 'Justin', created_at: d, score: 11.0
90
- @justin = User.where(id: u.id)
91
- u = User.create age: nil, name: 'nilly', created_at: nil, score: nil
92
- @nilly = User.where(id: u.id)
93
- u = User.create age: nil, name: 'esmé', created_at: nil, score: nil
94
- @esme = User.where(id: u.id)
95
- u = User.create age: nil, name: 'esmé ', created_at: nil, score: nil
96
- @esme2 = User.where(id: u.id)
97
- u = User.create age: nil, name: nil, created_at: nil, score: nil
98
- @all_nil = User.where(id: u.id)
99
-
100
- @id = User.arel_table[: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
+
72
+
101
73
  @age = User.arel_table[:age]
102
74
  @name = User.arel_table[:name]
103
75
  @score = User.arel_table[:score]
@@ -119,12 +91,10 @@ module ArelExtensions
119
91
  end
120
92
 
121
93
  def t(scope, node)
122
- res = scope.select(node.as('res'))
123
- # puts "[scope] #{res.to_sql}"
124
- res.to_a.first.res
94
+ scope.select(node.as('res')).to_a.first.res
125
95
  end
126
96
 
127
- # manage the difference between adapters that handle or not json type
97
+ #manage the difference between adapters that handle or not json type
128
98
  def parse_json(h)
129
99
  if @env_db != 'postgresql'
130
100
  JSON.parse("{\"res\":#{h}}")['res']
@@ -133,14 +103,6 @@ module ArelExtensions
133
103
  end
134
104
  end
135
105
 
136
- # Connection and column info
137
- def test_column_of
138
- assert_nil Arel.column_of('chupa', 'maflavla'), 'Non-existent table and column should return nil'
139
- assert_nil Arel.column_of('chupa', 'updated_at'), 'Non-existent table but existent column should return nil'
140
- assert_nil Arel.column_of('user_tests', 'maflavla'), 'Existent table but non-existent column should return nil'
141
- assert_equal 'updated_at', Arel.column_of('user_tests', 'updated_at').name, 'An existing column name should be returned'
142
- end
143
-
144
106
  # Math Functions
145
107
  def test_classical_arel
146
108
  assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
@@ -154,28 +116,25 @@ module ArelExtensions
154
116
  end
155
117
 
156
118
  def test_ceil
157
- # 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
158
120
  assert_equal 2, t(@test, @score.ceil) # 1.62
159
121
  assert_equal(-20, t(@camille, @score.ceil)) # -20.16
160
122
  assert_equal(-20, t(@camille, (@score - 0.5).ceil)) # -20.16
161
123
  assert_equal 63, t(@arthur, @age.ceil + 42)
162
- assert_equal 11, t(@justin, @score.ceil) # 11.0
163
124
  end
164
125
 
165
126
  def test_floor
166
- # 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
167
128
  assert_equal 0, t(@neg, @score.floor)
168
129
  assert_equal 1, t(@test, @score.floor) # 1.62
169
130
  assert_equal(-9, t(@test, (@score - 10).floor)) # 1.62
170
131
  assert_equal 42, t(@arthur, @score.floor - 23)
171
- assert_equal 11, t(@justin, @score.floor) # 11.0
172
- assert_equal(-21, t(@camille, @score.floor)) # # -20.16
173
132
  end
174
133
 
175
134
  def test_rand
176
135
  assert 42 != User.select(Arel.rand.as('res')).first.res
177
136
  assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
178
- assert_equal 13, User.order(Arel.rand).limit(50).count
137
+ assert_equal 8, User.order(Arel.rand).limit(50).count
179
138
  end
180
139
 
181
140
  def test_round
@@ -187,124 +146,54 @@ module ArelExtensions
187
146
 
188
147
  def test_sum
189
148
  if @env_db == 'mssql'
190
- skip 'SQL Server forces order?' # TODO
191
- assert_equal 83, User.select((@age.sum + 1).as('res'), User.arel_table[:id].sum).take(50).reorder(@age).first.res
192
- assert_equal 164, User.reorder(nil).select((@age.sum + @age.sum).as('res'), User.arel_table[:id].sum).take(50).first.res
193
- assert_equal 246, User.reorder(nil).select(((@age * 3).sum).as('res'), User.arel_table[:id].sum).take(50).first.res
194
- 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
195
154
  else
196
- assert_equal 83, User.select((@age.sum + 1).as('res')).take(50).first.res
197
- assert_equal 164, User.select((@age.sum + @age.sum).as('res')).take(50).first.res
198
- assert_equal 246, User.select((@age * 3).sum.as('res')).take(50).first.res
199
- 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
200
159
  end
201
160
  end
202
161
 
203
- def test_aggregation_with_ar_calculation
204
- # Since Arel10 (Rails6.1), some unwanted behaviors on aggregated calculation were present.
205
- # This should works no matter which version of rails is used
206
- assert User.group(:score).average(:id).values.all?{|e| !e.nil?}
207
-
208
- # Since Rails 7, a patch to calculations.rb has tirggered a double
209
- # quoting of the alias name. See https://github.com/rails/rails/commit/7e6e9091e55c3357b0162d44b6ab955ed0c718d5
210
- # Before the patch that fixed this the following error would occur:
211
- # ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
212
- assert User.group(:score).count(:id).values.all?{|e| !e.nil?}
213
- end
214
-
215
- def test_rollup
216
- skip "sqlite not supported" if $sqlite
217
- at = User.arel_table
218
- # single
219
- q = User.select(at[:name], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:name]]))
220
- assert q.to_a.length > 0
221
-
222
- # multi
223
- q = User.select(at[:name], at[:score], at[:age].sum).group(Arel::Nodes::RollUp.new([at[:score], at[:name]]))
224
- assert q.to_a.length > 0
225
-
226
- # hybrid
227
- q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel::Nodes::RollUp.new([at[:name]]))
228
- assert q.to_a.length > 0
229
-
230
- ## Using Arel.rollup which is less verbose than the original way
231
-
232
- # simple
233
- q = User.select(at[:name], at[:age].sum).group(Arel.rollup(at[:name]))
234
- assert q.to_a.length > 0
235
-
236
- # multi
237
- q = User.select(at[:name], at[:score], at[:age].sum).group(Arel.rollup([at[:score], at[:name]]))
238
- assert q.to_a.length > 0
239
-
240
- # hybrid
241
- q = User.select(at[:name], at[:score], at[:age].sum).group(at[:score], Arel.rollup([at[:name]]))
242
- assert q.to_a.length > 0
243
-
244
- ## Using at[:col].rollup which is handy for single column rollups
245
-
246
- # simple
247
- q = User.select(at[:name], at[:age].sum).group(at[:name].rollup)
248
- assert q.to_a.length > 0
249
-
250
- q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name].rollup, at[:score].rollup)
251
- assert q.to_a.length > 0
252
-
253
- # hybrid
254
- q = User.select(at[:name], at[:score], at[:age].sum).group(at[:name], at[:score].rollup)
255
- assert q.to_a.length > 0
256
- end
257
-
258
162
  # String Functions
259
163
  def test_concat
260
164
  assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
261
165
  assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
262
- assert_equal 'Test Laure', t(@laure, Arel.quoted('Test ') + @name)
263
-
264
- skip 'No group_concat in SqlServer before 2017' if @env_db == 'mssql'
265
- assert_equal 'Lucas Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(' '))
266
- assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(','))
267
- assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat)
268
-
269
- skip 'No order in group_concat in SqlLite' if $sqlite
270
- assert_equal 'Arthur,Lucas,Sophie', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: @name.asc))
271
- assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: @name.desc))
272
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
273
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
274
- assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
166
+ assert_equal 'Test Laure', t(@laure, Arel::Nodes.build_quoted('Test ') + @name)
167
+
168
+ skip "No group_concat in SqlServer before 2017" if @env_db == 'mssql'
169
+ assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(' '))
170
+ assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat(','))
171
+ assert_equal "Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie']), @name.group_concat)
172
+
173
+ skip "No order in group_concat in SqlLite" if $sqlite
174
+ assert_equal "Arthur,Lucas,Sophie", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.asc))
175
+ assert_equal "Sophie,Lucas,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@name.desc))
176
+ assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',[@score.asc,@name.asc]))
177
+ assert_equal "Lucas,Sophie,Arthur", t(User.where(:name => ['Lucas', 'Sophie','Arthur']), @name.group_concat(',',@score.asc,@name.asc))
275
178
  end
276
179
 
277
180
  def test_length
278
181
  assert_equal 7, t(@camille, @name.length)
279
182
  assert_equal 7, t(@camille, @name.length.round.abs)
280
183
  assert_equal 42, t(@laure, @name.length + 37)
281
-
282
- if @env_db == 'mssql'
283
- # By default it's UTF-16, and configuring the CI to be UTF-8 is a bit of a hassle.
284
- assert_equal 4, t(@esme, @name.byte_size)
285
- assert_equal 5, t(@esme2, @name.byte_size)
286
- else
287
- assert_equal 5, t(@esme, @name.byte_size)
288
- assert_equal 6, t(@esme2, @name.byte_size)
289
- end
290
- assert_equal 0, t(@all_nil, @name.byte_size)
291
-
292
- assert_equal 4, t(@esme, @name.char_length)
293
- assert_equal 5, t(@esme2, @name.char_length)
294
- assert_equal 0, t(@all_nil, @name.char_length)
295
184
  end
296
185
 
297
186
  def test_md5
298
187
  skip "Sqlite can't do md5" if $sqlite
299
- assert_equal 'e2cf99ca82a7e829d2a4ac85c48154d0', t(@camille, @name.md5)
300
- assert_equal 'c3d41bf5efb468a1bcce53bd53726c85', t(@lucas, @name.md5)
188
+ assert_equal "e2cf99ca82a7e829d2a4ac85c48154d0", t(@camille, @name.md5)
189
+ assert_equal "c3d41bf5efb468a1bcce53bd53726c85", t(@lucas, @name.md5)
301
190
  end
302
191
 
303
192
  def test_locate
304
193
  skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
305
- assert_equal 1, t(@camille, @name.locate('C'))
306
- assert_equal 0, t(@lucas, @name.locate('z'))
307
- 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"))
308
197
  end
309
198
 
310
199
  def test_substring
@@ -314,7 +203,7 @@ module ArelExtensions
314
203
  else
315
204
  assert_equal('', t(@lucas, @name.substring(42)))
316
205
  end
317
- assert_equal 'Lu', t(@lucas, @name.substring(1, 2))
206
+ assert_equal 'Lu', t(@lucas, @name.substring(1,2))
318
207
 
319
208
  assert_equal 'C', t(@camille, @name[0, 1])
320
209
  assert_equal 'C', t(@camille, @name[0])
@@ -323,35 +212,32 @@ module ArelExtensions
323
212
  else
324
213
  assert_equal('', t(@lucas, @name[42]))
325
214
  end
326
- assert_equal 'Lu', t(@lucas, @name[0, 2])
215
+ assert_equal 'Lu', t(@lucas, @name[0,2])
327
216
  assert_equal 'Lu', t(@lucas, @name[0..1])
328
217
 
329
- # substring should accept string function
218
+ #substring should accept string function
330
219
  assert_equal 'Ce', t(@camille, @name.substring(1, 1).concat('e'))
331
- assert_equal 'Ce', t(@camille, @name.substring(1, 1) + 'e')
220
+ assert_equal 'Ce', t(@camille, @name.substring(1, 1)+'e')
332
221
  end
333
222
 
334
223
  def test_find_in_set
335
224
  skip "Sqlite version can't load extension for find_in_set" if $sqlite && $load_extension_disabled
336
- 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'
337
226
  assert_equal 5, t(@neg, @comments & 2)
338
227
  assert_equal 0, t(@neg, @comments & 6) # not found
339
- assert_equal 5, t(@neg, @comments & '2')
340
- assert_equal 0, t(@neg, @comments & '6') # not found
341
- assert_equal 5, t(@neg, @comments & @other)
342
228
  end
343
229
 
344
230
  def test_string_comparators
345
- # 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 ?
346
232
  skip "SQL Server can't use math operators to compare strings" if @env_db == 'mssql' # use GREATEST ?
347
233
  if @env_db == 'postgresql' # may return real boolean
348
234
  assert t(@neg, @name >= 'Mest') == true || t(@neg, @name >= 'Mest') == 't' # depends of ar version
349
235
  assert t(@neg, @name <= (@name + 'Z')) == true || t(@neg, @name <= (@name + 'Z')) == 't'
350
236
  elsif @env_db == 'oracle'
351
- assert_equal 1, t(@neg, Arel.when(@name >= 'Mest').then(1).else(0))
352
- assert_equal 1, t(@neg, Arel.when(@name <= (@name + 'Z')).then(1).else(0))
353
- assert_equal 1, t(@neg, Arel.when(@name > 'Mest').then(1).else(0))
354
- 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))
355
241
  else
356
242
  assert_equal 1, t(@neg, @name >= 'Mest')
357
243
  assert_equal 1, t(@neg, @name <= (@name + 'Z'))
@@ -363,86 +249,69 @@ module ArelExtensions
363
249
  def test_compare_on_date_time_types
364
250
  skip "Sqlite can't compare time" if $sqlite
365
251
  skip "Oracle can't compare time" if @env_db == 'oracle'
366
- # @created_at == 2016-05-23
367
- assert_includes [true, 't', 1], t(@laure, Arel.when(@created_at >= '2014-01-01').then(1).else(0))
368
- assert_includes [false, 'f', 0], t(@laure, Arel.when(@created_at >= '2018-01-01').then(1).else(0))
369
- # @updated_at == 2014-03-03 12:42:00
370
- assert_includes [true, 't', 1], t(@laure, Arel.when(@updated_at >= '2014-03-03 10:10:10').then(1).else(0))
371
- assert_includes [false, 'f', 0], t(@laure, Arel.when(@updated_at >= '2014-03-03 13:10:10').then(1).else(0))
372
- # @duration == 12:42:21
373
- # puts @laure.select(Arel.when(@duration >= '10:10:10').then(1).else(0)).to_sql
374
- # puts @laure.select(Arel.when(@duration >= '14:10:10').then(1).else(0)).to_sql
375
- assert_includes [true, 't', 1], t(@laure, Arel.when(@duration >= '10:10:10').then(1).else(0))
376
- 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))
377
263
  end
378
264
 
265
+
379
266
  def test_regexp_not_regexp
380
267
  skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
381
- 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'
382
269
  assert_equal 1, User.where(@name =~ '^M').count
383
- assert_equal 10, User.where(@name !~ '^L').count
270
+ assert_equal 6, User.where(@name !~ '^L').count
384
271
  assert_equal 1, User.where(@name =~ /^M/).count
385
- assert_equal 10, User.where(@name !~ /^L/).count
386
- end
387
-
388
- def test_regex_matches
389
- skip "Sqlite version can't load extension for regexp" if $sqlite && $load_extension_disabled
390
- skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
391
- assert_equal 1, User.where(@name.regex_matches '^M').count
392
- assert_equal 1, User.where(@name.regex_matches /^M/).count
272
+ assert_equal 6, User.where(@name !~ /^L/).count
393
273
  end
394
274
 
395
275
  def test_imatches
396
- # puts User.where(@name.imatches('m%')).to_sql
276
+ #puts User.where(@name.imatches('m%')).to_sql
397
277
  assert_equal 1, User.where(@name.imatches('m%')).count
398
- if @env_db == 'mysql'
399
- assert_equal 5, User.where(@name.imatches_any(['L%', '%e'])).count
400
- else
401
- assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
402
- end
403
- assert_equal 10, User.where(@name.idoes_not_match('L%')).count
278
+ assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
279
+ assert_equal 6, User.where(@name.idoes_not_match('L%')).count
404
280
  end
405
281
 
406
282
  def test_replace
407
- assert_equal 'LucaX', t(@lucas, @name.replace('s', 'X'))
408
- assert_equal 'replace', t(@lucas, @name.replace(@name, 'replace'))
409
-
410
- skip 'Sqlite does not seem to support regexp_replace' if $sqlite
411
- skip 'SQL Server does not know about REGEXP without extensions' if @env_db == 'mssql'
412
- skip 'Travis mysql version does not support REGEXP_REPLACE' if @env_db == 'mysql'
413
- assert_equal 'LXcXs', t(@lucas, @name.replace(/[ua]/, 'X'))
414
- assert_equal 'LXcXs', t(@lucas, @name.regexp_replace(/[ua]/, 'X'))
415
- 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"))
416
285
  end
417
286
 
418
287
  def test_replace_once
419
- skip 'TODO'
420
- # skip "Sqlite version can't load extension for locate" if $sqlite && $load_extension_disabled
421
- 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))
422
291
  end
423
292
 
424
293
  def test_soundex
425
294
  skip "Sqlite version can't load extension for soundex" if $sqlite && $load_extension_disabled
426
295
  skip "PostgreSql version can't load extension for soundex" if @env_db == 'postgresql'
427
- assert_equal 'C540', t(@camille, @name.soundex)
428
- assert_equal 12, User.where(@name.soundex.eq(@name.soundex)).count
429
- assert_equal 12, 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
430
299
  end
431
300
 
432
301
  def test_change_case
433
- assert_equal 'myung', t(@myung, @name.downcase)
434
- assert_equal 'MYUNG', t(@myung, @name.upcase)
435
- 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)
436
305
  end
437
306
 
438
307
  def test_trim
439
- assert_equal 'Myung', t(@myung, @name.trim)
440
- assert_equal 'Myung', t(@myung, @name.trim.ltrim.rtrim)
441
- assert_equal 'Myun', t(@myung, @name.rtrim('g'))
442
- assert_equal 'yung', t(@myung, @name.ltrim('M'))
443
- assert_equal 'yung', t(@myung, (@name + 'M').trim('M'))
444
- skip 'Oracle does not accept multi char trim' if @env_db == 'oracle'
445
- 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))
446
315
  end
447
316
 
448
317
  def test_blank
@@ -471,244 +340,32 @@ module ArelExtensions
471
340
  assert_equal 'true', t(@neg, @comments.not_blank.then('true', 'false'))
472
341
  end
473
342
 
474
- # This test repeats a lot of `test_blank` cases.
475
- def test_present
476
- if @env_db == 'postgresql'
477
- assert_includes [true, 't'], t(@myung, @name.present) # depends of adapter
478
- assert_includes [false, 'f'], t(@myung, @comments.present)
479
- end
480
- assert_equal 1, @myung.where(@name.present).count
481
- assert_equal 0, @myung.where(@comments.present).count
482
- assert_equal 0, @sophie.where(@comments.present).count
483
- assert_equal 0, @camille.where(@comments.present).count
484
-
485
- assert_equal 1, @neg.where(@comments.present).count
486
- assert_equal 'true', t(@myung, @name.present.then('true', 'false'))
487
- assert_equal 'false', t(@myung, @comments.present.then('true', 'false'))
488
- assert_equal 'true', t(@neg, @comments.present.then('true', 'false'))
489
- end
490
-
491
343
  def test_format
492
- %i[format format_date].each do |method|
493
- assert_equal '2016-05-23', t(@lucas, @created_at.send(method, '%Y-%m-%d'))
494
- assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S'))
495
- assert_equal '12:42%', t(@lucas, @updated_at.send(method, '%R%%'))
496
-
497
- # The following tests will ensure proper conversion of timestamps to
498
- # requested timezones.
499
- #
500
- # The names of the timezones is highly dependant on the underlying
501
- # operating system, and this is why we need to handle each database
502
- # separately: the images we're using to test these databases are
503
- # different. So don't rely on the provided examples. Your setup is your
504
- # reference.
505
- #
506
- # One could always have portable code if s/he uses standard
507
- # abbreviations, like:
508
- #
509
- # 1. CET => Central European Time
510
- # 2. CEST => Central European Summer Time
511
- #
512
- # Which implies that the caller should handle daylight saving detection.
513
- # In fact, CET will handle daylight saving in MySQL but not Postgres.
514
- #
515
- # It looks like the posix convention is supported by mysql and
516
- # postgresql, e.g.:
517
- #
518
- # posix/Europe/Paris
519
- # posix/America/Nipigon
520
- #
521
- # so it looks like a more reliably portable way of specifying it.
522
- time_zones = {
523
- 'mssql' => {
524
- 'utc' => 'UTC',
525
- 'sao_paulo' => 'Argentina Standard Time',
526
- 'tahiti' => 'Hawaiian Standard Time',
527
- 'paris' => 'Central European Standard Time'
528
- },
529
- 'posix' => {
530
- 'utc' => 'UTC',
531
- 'sao_paulo' => 'America/Sao_Paulo',
532
- 'tahiti' => 'Pacific/Tahiti',
533
- 'paris' => 'Europe/Paris'
534
- }
535
- }
536
-
537
- skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
538
- # TODO: Standarize timezone conversion across all databases.
539
- # This test case will be refactored and should work the same across all vendors.
540
- if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
541
- skip "SQL Server < 2016 is not currently supported"
542
- end
543
-
544
- tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
545
-
546
- assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['utc']))
547
- assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
548
- assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
549
-
550
- # Skipping conversion from UTC to the desired timezones fails in SQL
551
- # Server and Postgres. This is mainly due to the fact that timezone
552
- # information is not preserved in the column itself.
553
- #
554
- # MySQL is happy to consider that times by default are in UTC.
555
- assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
556
- refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.send(method, '%Y/%m/%d %H:%M:%S', tz['paris'])) if !%w[mysql postgresql].include?(ENV['DB'])
557
-
558
- # Winter/Summer time
559
- assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
560
- if ENV['DB'] == 'mssql'
561
- assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
562
- assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
563
- else
564
- assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
565
- assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).send(method, '%Y/%m/%d %H:%M:%S', tz['paris']))
566
- end
567
- end
568
- end
569
-
570
- def test_format_iso_week
571
- %i[format format_date].each do |method|
572
- skip "Unsupported ISO week number for DB=#{ENV['DB']}" if ['sqlite'].include?(ENV['DB'])
573
- assert_equal '10', t(@lucas, @updated_at.send(method, '%V'))
574
- {
575
- '2024-01-01 10:42:00' => '01', # Monday
576
- '2030-01-01 10:42:00' => '01', # Tuesday
577
- '2025-01-01 10:42:00' => '01', # Wednesday
578
- '2026-01-01 10:42:00' => '01', # Thursday
579
- '2027-01-01 10:42:00' => '53', # Friday
580
- '2028-01-01 10:42:00' => '52', # Saturday
581
- '2034-01-01 10:42:00' => '52', # Sunday
582
- }.each do |date, exp|
583
- assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%V'))
584
- end
585
- end
586
- end
587
-
588
- def test_format_iso_year_of_week
589
- skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
590
- %i[format format_date].each do |method|
591
- assert_equal '2014', t(@lucas, @updated_at.send(method, '%G'))
592
-
593
- {
594
- '2024-01-01 10:42:00' => '2024', # Monday
595
- '2030-01-01 10:42:00' => '2030', # Tuesday
596
- '2025-01-01 10:42:00' => '2025', # Wednesday
597
- '2026-01-01 10:42:00' => '2026', # Thursday
598
- '2027-01-01 10:42:00' => '2026', # Friday
599
- '2028-01-01 10:42:00' => '2027', # Saturday
600
- '2034-01-01 10:42:00' => '2033', # Sunday
601
- }.each do |date, exp|
602
- assert_equal exp, t(@lucas, Arel.quoted(date).cast(:datetime).send(method, '%G'))
603
- end
604
- end
605
- end
606
-
607
- def test_format_date_with_names
608
- skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
609
- %i[format format_date].each do |method|
610
- assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
611
- assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
612
- end
613
-
614
- skip "#{ENV['DB']} does not support ALLCAPS month and day names" if ['mysql'].include?(ENV['DB'])
615
- %i[format format_date].each do |method|
616
-
617
- assert_equal 'Mon, 03 MAR 14', t(@lucas, @updated_at.send(method, '%a, %d %^b %y'))
618
- assert_equal 'Monday, 03 MARCH 14', t(@lucas, @updated_at.send(method, '%A, %d %^B %y'))
619
- end
620
- end
621
-
622
- def switch_to_lang(lang)
623
- languages = {
624
- 'mssql' => {en: 'English', fr: 'French'},
625
- 'mysql' => {en: 'en_US', fr: 'fr_FR'},
626
- 'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
627
- }
628
-
629
- sql = {
630
- 'mssql' => ->(l) { "SET LANGUAGE #{l};" },
631
- 'mysql' => ->(l) { "SET lc_time_names = '#{l}';" },
632
- 'postgresql' => ->(l) { "SET lc_time to '#{l}';" }
633
- }
634
-
635
- User.connection.execute(sql[ENV['DB']][languages[ENV['DB']][lang]])
636
- end
637
-
638
- def test_format_date_with_names_and_lang_switch
639
- skip "#{ENV['DB']} does not support word-based formatting for month and day names" if ['sqlite'].include?(ENV['DB'])
640
-
641
- # the begin-rescue block is here to make sure we set the db back to en_US
642
- # if we fail, so that other tests don't get contaminated.
643
- #
644
- # Tests should assert one single thing in principle, but until we
645
- # refactor this whole thing, we'll have to do tricks of this sort.
646
- %i[format format_date].each do |method|
647
- begin
648
- switch_to_lang(:en)
649
- case ENV['DB']
650
- when 'mysql', 'postgresql'
651
- assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
652
- assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
653
- when 'mssql'
654
- assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
655
- end
656
- switch_to_lang(:fr)
657
- case ENV['DB']
658
- when 'mysql'
659
- assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
660
- assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
661
- when 'postgresql'
662
- assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.send(method, '%a, %d %b %y'))
663
- assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
664
- when 'mssql'
665
- assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.send(method, '%A, %d %B %y'))
666
- end
667
- ensure
668
- switch_to_lang(:en)
669
- end
670
- end
344
+ assert_equal '2016-05-23', t(@lucas, @created_at.format('%Y-%m-%d'))
345
+ skip "SQL Server does not accept any format" if @env_db == 'mssql'
346
+ assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S'))
671
347
  end
672
348
 
673
349
  def test_coalesce
674
- assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, 'default') + ' concat')
350
+ assert_equal 'Camille concat', t(@camille, @name.coalesce(nil, "default") + ' concat')
675
351
 
676
- assert_equal 'toto', t(@test, @other.coalesce(''))
352
+ assert_equal 'toto', t(@test, @other.coalesce(""))
677
353
 
678
- assert_equal ' ', t(@myung, @comments.coalesce('Myung').coalesce('ignored'))
679
- 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"))
680
356
  if @env_db == 'oracle'
681
- assert_nil t(@laure, @comments.coalesce(''))
682
- assert_nil t(@camille, @other.coalesce(''))
357
+ assert_nil t(@laure, @comments.coalesce(""))
358
+ assert_nil t(@camille, @other.coalesce(""))
683
359
  else
684
- assert_equal('', t(@laure, @comments.coalesce('')))
685
- assert_equal '', t(@camille, @other.coalesce(''))
360
+ assert_equal('', t(@laure, @comments.coalesce("")))
361
+ assert_equal '', t(@camille, @other.coalesce(""))
686
362
  end
687
363
  assert_equal 100, t(@test, @age.coalesce(100))
688
- assert_equal 'Camille', t(@camille, @name.coalesce(nil, 'default'))
364
+ assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
689
365
  assert_equal 20, t(@test, @age.coalesce(nil, 20))
690
366
 
691
- assert_equal 20, t(@test, @age.coalesce(10) + 10)
692
- assert_equal 'Laure10', t(@laure, @comments.coalesce('Laure') + 10)
693
- end
694
-
695
- def test_coalesce_blank
696
- assert_equal 'Myung', t(@myung, @comments.coalesce_blank('Myung').coalesce_blank('ignored'))
697
- assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ').coalesce_blank('Myung'))
698
- assert_equal 'Myung', t(@myung, @comments.coalesce_blank('', ' ', ' ', 'Myung'))
699
- assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format('%Y-%m-%d'))
700
- assert_equal '2016-05-23', t(@myung, @created_at.coalesce_blank(Date.new(2022, 1, 1)).format_date('%Y-%m-%d'))
701
- assert_equal 'Laure', t(@laure, @comments.coalesce_blank('Laure'))
702
- assert_equal 100, t(@test, @age.coalesce_blank(100))
703
- assert_equal 20, t(@test, @age.coalesce_blank(20))
704
- assert_equal 20, t(@test, @age.coalesce_blank(10) + 10)
705
- assert_equal 'Laure10', t(@laure, @comments.coalesce_blank('Laure') + 10)
706
-
707
- skip 'mssql does not support null in case results' if @env_db == 'mssql'
708
-
709
- assert_equal 'Camille concat', t(@camille, @name.coalesce_blank(Arel.null, 'default') + ' concat')
710
- assert_equal 'Myung', t(@myung, @comments.coalesce_blank(Arel.null, 'Myung'))
711
- assert_equal 'Camille', t(@camille, @name.coalesce_blank(Arel.null, 'default'))
367
+ assert_equal 20, t(@test, @age.coalesce(10)+10)
368
+ assert_equal 'Laure10', t(@laure, @comments.coalesce("Laure") + 10)
712
369
  end
713
370
 
714
371
  # Comparators
@@ -717,46 +374,37 @@ module ArelExtensions
717
374
  assert_equal 2, User.where(@age <= 10).count
718
375
  assert_equal 3, User.where(@age > 20).count
719
376
  assert_equal 4, User.where(@age >= 20).count
720
- assert_equal 2, User.where(@age > 5).where(@age < 20).count
377
+ assert_equal 1, User.where(@age > 5).where(@age < 20).count
721
378
  end
722
379
 
723
380
  def test_date_comparator
724
381
  d = Date.new(2016, 5, 23)
725
382
  assert_equal 0, User.where(@created_at < d).count
726
- assert_equal 13, User.where(@created_at >= d).count
383
+ assert_equal 8, User.where(@created_at >= d).count
727
384
  end
728
385
 
729
386
  def test_date_duration
730
- # When user `nilly` is created, with an explicit `created_at: nil`,
731
- # activerecord will give it the current date.
732
- #
733
- # So depending on the month when we run this test, we will get different
734
- # results for `User.where(@created_at.month.eq('05'))`.
735
- count_for_may = Date.today.month == 5 ? 10 : 9
736
- count_for_day = Date.today.day == 5 ? 1 : 0
737
-
738
- # Year
387
+ #Year
739
388
  assert_equal 2016, t(@lucas, @created_at.year).to_i
740
- assert_equal 0, User.where(@created_at.year.eq('2012')).count
741
- # Month
389
+ assert_equal 0, User.where(@created_at.year.eq("2012")).count
390
+ #Month
742
391
  assert_equal 5, t(@camille, @created_at.month).to_i
743
- assert_equal count_for_may, User.where(@created_at.month.eq('05')).count
744
- # Week
392
+ assert_equal 8, User.where(@created_at.month.eq("05")).count
393
+ #Week
745
394
  assert_equal(@env_db == 'mssql' ? 22 : 21, t(@arthur, @created_at.week).to_i)
746
- assert_equal count_for_may, User.where(@created_at.month.eq('05')).count
747
- # Day
395
+ assert_equal 8, User.where(@created_at.month.eq("05")).count
396
+ #Day
748
397
  assert_equal 23, t(@laure, @created_at.day).to_i
749
- # Make sure we get the correct count on the date we run the test.
750
- assert_equal count_for_day, User.where(@created_at.day.eq('05')).count
398
+ assert_equal 0, User.where(@created_at.day.eq("05")).count
751
399
 
752
- # skip "manage DATE" if @env_db == 'oracle'
753
- # Hour
400
+ #skip "manage DATE" if @env_db == 'oracle'
401
+ #Hour
754
402
  assert_equal 0, t(@laure, @created_at.hour).to_i
755
403
  assert_equal 12, t(@lucas, @updated_at.hour).to_i
756
- # Minute
404
+ #Minute
757
405
  assert_equal 0, t(@laure, @created_at.minute).to_i
758
406
  assert_equal 42, t(@lucas, @updated_at.minute).to_i
759
- # Second
407
+ #Second
760
408
  assert_equal 0, t(@laure, @created_at.second).to_i
761
409
  assert_equal 0, t(@lucas, @updated_at.second).to_i
762
410
  end
@@ -764,8 +412,8 @@ module ArelExtensions
764
412
  def test_datetime_diff
765
413
  assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
766
414
  if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
767
- assert_equal 42 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
768
- 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)
769
417
  else
770
418
  assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
771
419
  assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
@@ -776,8 +424,7 @@ module ArelExtensions
776
424
  end
777
425
  end
778
426
 
779
-
780
- skip 'not yet implemented' if $sqlite
427
+ skip "not yet implemented" if $sqlite
781
428
 
782
429
  date1 = Date.new(2016, 5, 23)
783
430
  durPos = 10.years
@@ -789,134 +436,106 @@ module ArelExtensions
789
436
 
790
437
  datetime1 = Time.utc(2014, 3, 3, 12, 42, 0)
791
438
  # Pull Request #5 tests
792
- # puts (@created_at + durPos).cast(:date).to_sql
793
- assert_includes [date2, '2026-05-23'], t(@test, (@created_at + durPos).cast(:date))
794
- 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))
795
442
 
796
- # puts (@created_at + @created_at.day).cast(:date).to_sql
797
- assert_includes [date4, '2016-06-15'], t(@test, (@created_at + @created_at.day).cast(:date))
798
- # puts (@created_at - @created_at.day).cast(:date).to_sql
799
- 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))
800
447
 
801
- assert_includes [datetime1 + 42.seconds, '2014-03-03 12:42:42 UTC'], t(@lucas, (@updated_at + @updated_at.minute))
802
- 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))
803
450
 
804
451
  # (@updated_at + Arel.duration('s',(@updated_at.hour*60 + @updated_at.minute))).to_sql
805
- assert_includes [datetime1 + (12 * 60 + 42).seconds, '2014-03-03 12:54:42 UTC'],
806
- 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))))
807
454
 
808
- assert_includes [datetime1 + (12 * 60 + 42).minutes, '2014-03-04 01:24:00 UTC'],
809
- 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))))
810
457
 
811
- assert_includes ['2024-03-03'], t(@lucas, (@updated_at + durPos).format('%Y-%m-%d'))
812
- assert_includes ['2024-03-03'], t(@lucas, (@updated_at + durPos).format_date('%Y-%m-%d'))
813
- # puts (@updated_at - durPos).to_sql
814
- assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format('%Y-%m-%d'))
815
- assert_includes ['2004-03-03'], t(@lucas, (@updated_at - durPos).format_date('%Y-%m-%d'))
458
+ assert_includes ["2024-03-03"], t(@lucas,(@updated_at + durPos).format('%Y-%m-%d'))
459
+ #puts (@updated_at - durPos).to_sql
460
+ assert_includes ["2004-03-03"], t(@lucas,(@updated_at - durPos).format('%Y-%m-%d'))
816
461
 
817
462
 
818
463
  # we test with the ruby object or the string because some adapters don't return an object Date
819
- # end
464
+ # end
820
465
  end
821
466
 
822
467
  # TODO; cast types
823
468
  def test_cast_types
824
- assert_equal '5', t(@lucas, @age.cast(:string))
825
- 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))
826
470
  if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
827
- 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'
828
- assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle'
829
- assert_equal '20.16', t(@laure, @score.cast(:string)).gsub(/0*\z/, '')
830
- assert_equal '20.161', t(@laure, @score.cast(:string) + 1).gsub(/0*1\z/, '1')
831
- assert_equal 21.16, t(@laure, @score.cast(:string).cast(:decimal) + 1)
832
- assert_equal 21, t(@laure, @score.cast(:string).cast(:int) + 1)
833
-
834
- assert_equal String, t(@lucas, @updated_at.cast(:string)).class
835
-
836
- assert_equal Date, t(@lucas, @updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
837
- assert_equal Time, t(@lucas, @updated_at.cast(:string).cast(:datetime)).class
838
- assert_equal Time, t(@lucas, @updated_at.cast(:time)).class
839
-
840
- # mysql adapter in rails7 adds some infos we just squeeze here
841
- assert_equal '2014-03-03 12:42:00', t(@lucas, @updated_at.cast(:string)).split('.').first unless @env_db == 'mssql' # locale dependent
842
- assert_equal Date.parse('2014-03-03'), t(@lucas, Arel.quoted('2014-03-03').cast(:date))
843
- assert_equal Date.parse('5014-03-03'), t(@lucas, (@age.cast(:string) + '014-03-03').cast(:date))
844
- assert_equal Time.parse('2014-03-03 12:42:00 UTC'), t(@lucas, @updated_at.cast(:string).cast(:datetime))
845
- assert_equal Date.parse('2014-03-03'), t(@lucas, @updated_at.cast(:date))
846
- assert_equal '12:42:00', t(@lucas, @updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' # DateTime
847
- end
848
- end
849
-
850
- def test_if_present
851
- assert_nil t(@myung, @comments.if_present)
852
- assert_equal 0, t(@myung, @comments.if_present.count)
853
- assert_equal 20.16, t(@myung, @score.if_present)
854
- assert_equal '2016-05-23', t(@myung, @created_at.if_present.format('%Y-%m-%d'))
855
- assert_equal '2016-05-23', t(@myung, @created_at.if_present.format_date('%Y-%m-%d'))
856
- assert_nil t(@laure, @comments.if_present)
857
-
858
- assert_nil t(@nilly, @duration.if_present.format('%Y-%m-%d'))
859
- assert_nil t(@nilly, @duration.if_present.format_date('%Y-%m-%d'))
860
-
861
- # NOTE: here we're testing the capacity to format a nil value,
862
- # however, @comments is a text field, and not a date/datetime field,
863
- # so Postgres will rightfully complain when we format the text:
864
- # we need to cast it first.
865
- if @env_db == 'postgresql'
866
- assert_nil t(@laure, @comments.cast(:date).if_present.format('%Y-%m-%d'))
867
- assert_nil t(@laure, @comments.cast(:date).if_present.format_date('%Y-%m-%d'))
868
- else
869
- assert_nil t(@laure, @comments.if_present.format('%Y-%m-%d'))
870
- assert_nil t(@laure, @comments.if_present.format_date('%Y-%m-%d'))
471
+ assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).cast(:string).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
472
+ assert_equal 1, t(@laure,ArelExtensions::Nodes::Case.new.when(@duration.cast(:time).eq("12:42:21")).then(1).else(0)) unless @env_db == 'oracle'
473
+ assert_equal "20.16", t(@laure,@score.cast(:string)).gsub(/[0]*\z/,'')
474
+ assert_equal "20.161", t(@laure,@score.cast(:string)+1).gsub(/[0]*1\z/,'1')
475
+ assert_equal 21.16, t(@laure,@score.cast(:string).cast(:decimal)+1)
476
+ assert_equal 21, t(@laure,@score.cast(:string).cast(:int)+1)
477
+
478
+ assert_equal String, t(@lucas,@updated_at.cast(:string)).class
479
+ assert_equal Date, t(@lucas,@updated_at.cast(:date)).class unless @env_db == 'oracle' # DateTime
480
+ assert_equal Time, t(@lucas,@updated_at.cast(:string).cast(:datetime)).class
481
+ assert_equal Time, t(@lucas,@updated_at.cast(:time)).class
482
+
483
+ assert_equal "2014-03-03 12:42:00", t(@lucas,@updated_at.cast(:string)) unless @env_db == 'mssql' #locale dependent
484
+ assert_equal Date.parse("2014-03-03"), t(@lucas,Arel::Nodes.build_quoted('2014-03-03').cast(:date))
485
+ assert_equal Date.parse("5014-03-03"), t(@lucas,(@age.cast(:string) + '014-03-03').cast(:date))
486
+ assert_equal Time.parse("2014-03-03 12:42:00 UTC"), t(@lucas,@updated_at.cast(:string).cast(:datetime))
487
+ assert_equal Date.parse("2014-03-03"), t(@lucas,@updated_at.cast(:date))
488
+ assert_equal "12:42:00", t(@lucas,@updated_at.cast(:time).cast(:string)).split('.').first unless @env_db == 'oracle' #DateTime
871
489
  end
872
490
  end
873
491
 
874
492
  def test_is_null
875
- # puts User.where(@age.is_null).select(@name).to_sql
876
- # puts @age.is_null
877
- # puts @age.is_null.inspect
878
- # puts @age.is_null.to_sql
879
- # puts @age=='34'
880
- 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
881
499
  end
882
500
 
883
501
  def test_math_plus
884
502
  d = Date.new(1997, 6, 15)
885
- # Concat String
886
- assert_equal 'SophiePhan', t(@sophie, @name + 'Phan')
887
- assert_equal 'Sophie2', t(@sophie, @name + 2)
888
- assert_equal 'Sophie1997-06-15', t(@sophie, @name + d)
889
- assert_equal 'Sophie15', t(@sophie, @name + @age)
890
- assert_equal 'SophieSophie', t(@sophie, @name + @name)
891
- assert_equal 'SophieSophieSophie', t(@sophie, @name + @name + @name)
892
- assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name.concat(@name)))
893
- assert_equal 'SophieSophieSophie', t(@sophie, @name.concat(@name).concat(@name))
894
- # FIXME: should work as expected in Oracle
895
- assert_equal 'Sophie2016-05-23', t(@sophie, @name + @created_at) unless @env_db == 'oracle'
896
- # 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
897
515
  assert_equal 1, User.where((@age + 10).eq(33)).count
898
- assert_equal 1, User.where((@age + '1').eq(6)).count
516
+ assert_equal 1, User.where((@age + "1").eq(6)).count
899
517
  assert_equal 1, User.where((@age + @age).eq(10)).count
900
- # concat Date
901
- # puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
902
- assert_equal '2016-05-24', t(@myung, @created_at + 1).to_date.to_s
903
- 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
904
522
  end
905
523
 
524
+
906
525
  def test_math_minus
907
526
  d = Date.new(2016, 5, 20)
908
- # Datediff
909
- assert_equal 13, User.where((@created_at - @created_at).eq(0)).count
910
- assert_equal 3, @laure.select((@created_at - d).as('res')).first.res.abs.to_i
911
- # 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
912
531
  assert_equal 0, User.where((@age - 10).eq(50)).count
913
- assert_equal 0, User.where((@age - '10').eq(50)).count
532
+ assert_equal 0, User.where((@age - "10").eq(50)).count
914
533
  # assert_equal 0, User.where((@age - 9.5).eq(50.5)).count # should work: TODO
915
- 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
916
535
  end
917
536
 
918
537
  def test_wday
919
- # d = Date.new(2016, 6, 26)
538
+ #d = Date.new(2016, 6, 26)
920
539
  assert_equal(@env_db == 'oracle' || @env_db == 'mssql' ? 2 : 1, t(@myung, @created_at.wday).to_i) # monday
921
540
  end
922
541
 
@@ -935,8 +554,8 @@ module ArelExtensions
935
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
936
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
937
556
 
938
- 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
939
- 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
940
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
941
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
942
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
@@ -947,123 +566,116 @@ module ArelExtensions
947
566
  # Case clause
948
567
  def test_case
949
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)
950
- assert_equal 4, User.where(@score.when(20.16).then(1).else(0).eq(1)).count
951
- assert_equal 2, t(@arthur, @score.when(65.62, 1).else(0) + 1)
952
- assert_equal 0, t(@arthur, @score.when(65.62, 1).else(0) - 1)
953
- assert_equal '11', t(@arthur, @score.when(65.62).then('1').else('0') + '1')
954
- assert_equal 66.62, t(@arthur, @score.when(65.62).then(@score).else(@score) + 1)
955
- 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
956
574
  end
957
575
 
958
576
  def test_format_numbers
959
- # score of Arthur = 65.62
960
- skip ' Works with SQLite if the version used knows printf' if $sqlite
961
-
962
- assert_equal 'Wrong Format', t(@arthur, @score.format_number('$ %...234.6F €', 'fr_FR'))
963
- assert_equal 'AZERTY65,62', t(@arthur, @score.format_number('AZERTY%.2f', 'fr_FR'))
964
- assert_equal '65,62AZERTY', t(@arthur, @score.format_number('%.2fAZERTY', 'fr_FR'))
965
- assert_equal '$ 65.62 €', t(@arthur, @score.format_number('$ %.2f €', 'en_US'))
966
- assert_equal '$ 66 €', t(@arthur, @score.format_number('$ %.0f €', 'en_US'))
967
- assert_equal '$ 0065,62 €', t(@arthur, @score.format_number('$ %07.2f €', 'fr_FR'))
968
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-07.2f €', 'fr_FR'))
969
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ %-7.2f €', 'fr_FR'))
970
- assert_equal '$ 65,62 €', t(@arthur, @score.format_number('$ % 7.2f €', 'fr_FR'))
971
- assert_equal '$ 65,6 €', t(@arthur, @score.format_number('$ % 7.1f €', 'fr_FR'))
972
- assert_equal '$ +65,62 €', t(@arthur, @score.format_number('$ % +7.2f €', 'fr_FR'))
973
- assert_equal '$ +065,62 €', t(@arthur, @score.format_number('$ %0+7.2f €', 'fr_FR'))
974
- assert_includes ['$ 6,56e1 €', '$ 6,56e+01 €'], t(@arthur, @score.format_number('$ %.2e €', 'fr_FR'))
975
- assert_includes ['$ 6,56E1 €', '$ 6,56E+01 €'], t(@arthur, @score.format_number('$ %.2E €', 'fr_FR'))
976
- assert_includes ['$ 6,562E1 €', '$ 6,562E+01 €'], t(@arthur, @score.format_number('$ %.3E €', 'fr_FR'))
977
- 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)
978
- 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
979
- assert_equal '123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'en_US'))
980
- assert_equal ' 123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%16.1f', 'en_US'))
981
- assert_equal '$ 0,00 €', t(@arthur, @score.when(65.62).then(Arel.sql('null')).else(1).format_number('$ %.2f €', 'fr_FR'))
982
- 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"))
983
601
  end
984
602
 
985
603
  def test_accent_insensitive
986
- skip 'SQLite is natively Case Insensitive and Accent Sensitive' if $sqlite
987
- 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'
988
606
  # actual comments value: "arrêté"
989
- # AI & CI
607
+ #AI & CI
990
608
  if !['postgresql'].include?(@env_db) # Extension unaccent required on PG
991
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrêté')).then('1').else('0'))
992
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('arrete')).then('1').else('0'))
993
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('àrrétè')).then('1').else('0'))
994
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_imatches('arretez')).then('1').else('0'))
995
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrete')).then('1').else('0'))
996
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_imatches('Arrêté')).then('1').else('0'))
997
- # AI & CS
998
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrêté')).then('1').else('0'))
999
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrete')).then('1').else('0'))
1000
- assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('àrrétè')).then('1').else('0'))
1001
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('arretez')).then('1').else('0'))
1002
- if !%w[oracle postgresql mysql].include?(@env_db) # AI => CI
1003
- assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrete')).then('1').else('0'))
1004
- 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"))
1005
623
  end
1006
624
  end
1007
- # AS & CI
1008
- 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"))
1009
627
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
1010
- assert_equal '0', t(@arthur, Arel.when(@comments.imatches('arrete')).then('1').else('0'))
1011
- 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"))
1012
630
  end
1013
- 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"))
1014
632
  if !['mysql'].include?(@env_db) # CI => AI in utf8 (AI not possible in latin1)
1015
- 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"))
1016
634
  end
1017
- assert_equal '1', t(@arthur, Arel.when(@comments.imatches('Arrêté')).then('1').else('0'))
1018
- # AS & CS
1019
- assert_equal '1', t(@arthur, Arel.when(@comments.smatches('arrêté')).then('1').else('0'))
1020
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arrete')).then('1').else('0'))
1021
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('àrrétè')).then('1').else('0'))
1022
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('arretez')).then('1').else('0'))
1023
- assert_equal '0', t(@arthur, Arel.when(@comments.smatches('Arrete')).then('1').else('0'))
1024
- 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"))
1025
643
  end
1026
644
 
1027
645
  def test_subquery_with_order
1028
- skip if @env_db == 'mssql' && Arel::VERSION.to_i < 10
1029
- assert_equal 12, User.where(name: User.select(:name).order(:name)).count
1030
- assert_equal 12, User.where(@ut[:name].in(@ut.project(@ut[:name]).order(@ut[:name]))).count
1031
-
1032
- if %w[mssql sqlite].include? @env_db
1033
- # Sqlite and mssql are sensistive to the nil value in name, defined by @all_nil
1034
- assert_equal 1, User.where(name: User.select(:name).order(:name).limit(2)).count
1035
- elsif @env_db != 'mysql'
1036
- # MySql can't have limit in IN subquery
1037
- assert_equal 2, User.where(name: User.select(:name).order(:name).limit(2)).count
1038
- # 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
1039
651
  end
1040
652
  end
1041
653
 
1042
654
  def test_in_with_nil
1043
- assert_predicate @myung.where(@age.in(1)), :blank?
1044
- assert_predicate @myung.where(@age.in(23)), :present?
1045
- assert_predicate @myung.where(@age.in([1])), :blank?
1046
- assert_predicate @myung.where(@age.in([1, 2])), :blank?
1047
- assert_predicate @myung.where(@age.in([1, 23])), :present?
1048
- assert_predicate @myung.where(@age.in(nil)), :blank?
1049
- assert_predicate @myung.where(@age.in([nil])), :blank?
1050
- assert_predicate @myung.where(@age.in([nil, 1])), :blank?
1051
- assert_predicate @myung.where(@age.in([nil, 23])), :present?
1052
- assert_predicate @myung.where(@age.in([nil, 1, 2])), :blank?
1053
- assert_predicate @myung.where(@age.in([nil, 1, 23])), :present?
1054
- assert_predicate @test.where(@age.in(1)), :blank?
1055
- assert_predicate @test.where(@age.in([1])), :blank?
1056
- assert_predicate @test.where(@age.in([1, 2])), :blank?
1057
- assert_predicate @test.where(@age.in(nil)), :present?
1058
- assert_predicate @test.where(@age.in([nil])), :present?
1059
- assert_predicate @test.where(@age.in([nil, 1])), :present?
1060
- 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?
1061
673
  end
1062
674
 
1063
675
  def test_scope_with_in_plus_new
1064
676
  begin
1065
- @test.where(@age.in([1, 2])).new
1066
- @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
1067
679
  assert true
1068
680
  rescue
1069
681
  assert false
@@ -1071,129 +683,114 @@ module ArelExtensions
1071
683
  end
1072
684
 
1073
685
  def test_is_not_null
1074
- assert_predicate @myung.where(@age.is_not_null), :present?
1075
- 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?
1076
688
  end
1077
689
 
1078
690
  def test_not_in_with_nil
1079
- assert_predicate @myung.where(@age.not_in(1)), :present?
1080
- assert_predicate @myung.where(@age.not_in(23)), :blank?
1081
- assert_predicate @myung.where(@age.not_in([1])), :present?
1082
- assert_predicate @myung.where(@age.not_in([1, 2])), :present?
1083
- assert_predicate @myung.where(@age.not_in([1, 23])), :blank?
1084
- assert_predicate @myung.where(@age.not_in(nil)), :present?
1085
- assert_predicate @myung.where(@age.not_in([nil])), :present?
1086
- assert_predicate @myung.where(@age.not_in([nil, 1])), :present?
1087
- assert_predicate @myung.where(@age.not_in([nil, 23])), :blank?
1088
- assert_predicate @myung.where(@age.not_in([nil, 1, 2])), :present?
1089
- assert_predicate @myung.where(@age.not_in([nil, 1, 23])), :blank?
1090
-
1091
- assert_predicate @myung.where(@age.not_in(1..2)), :present?
1092
-
1093
- # if the column is null, the entry will never be selected with not in (like every DBMS does)
1094
- # assert_predicate @test.where(@age.not_in(1)), :present?
1095
- # assert_predicate @test.where(@age.not_in([1])), :present?
1096
- # assert_predicate @test.where(@age.not_in([1,2])), :present?
1097
- # assert_predicate @test.where(@age.not_in(nil)), :blank?
1098
- # assert_predicate @test.where(@age.not_in([nil])), :blank?
1099
- # assert_predicate @test.where(@age.not_in([nil,1])), :blank?
1100
- # assert_predicate @test.where(@age.not_in([nil,1,2])), :blank?
1101
- end
1102
-
1103
- def test_in_on_grouping
1104
- skip 'We should modify the visitor of IN to make it work' if $sqlite || @env_db == 'mssql'
1105
- assert_equal 2, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23), Arel.tuple('Arthur', 21))).count
1106
- assert_equal 1, User.where(Arel.tuple(@name, @age).in(Arel.tuple('Myung', 23))).count
1107
- 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?
1108
713
  end
1109
714
 
1110
715
  def test_alias_shortened
1111
- if %w[postgresql oracle].include?(@env_db)
716
+ if ['postgresql','oracle'].include?(@env_db)
1112
717
  new_alias = Arel.shorten('azerty' * 15)
1113
718
  at = User.arel_table.alias('azerty' * 15)
1114
719
  assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
1115
720
  assert_equal '"user_tests" "u"'.downcase, User.arel_table.alias('u').to_sql.downcase
1116
- assert_equal %Q[SELECT "#{new_alias}"."id" FROM "user_tests" "#{new_alias}"].downcase,
1117
- 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
1118
723
  end
1119
724
  end
1120
725
 
1121
726
  def test_stat_functions
1122
727
  skip "SQLite doesn't work for most on this functions" if $sqlite
1123
- # puts t(User.where(nil), @score.average)
1124
- # puts t(User.where(nil), @score.variance(unbiased: true))
1125
- # puts t(User.where(nil), @score.variance(unbiased: false))
1126
- # puts t(User.where(nil), @score.std(unbiased: true))
1127
- # puts t(User.where(nil), @score.std(unbiased: false))
1128
-
1129
- assert ( 15.43222 - t(User.where(nil), @score.average)).abs < 0.01
1130
- assert (539.79804 - t(User.where(nil), @score.variance)).abs < 0.01
1131
- assert (479.82048 - t(User.where(nil), @score.variance(unbiased: false))).abs < 0.01
1132
- assert ( 23.23355 - t(User.where(nil), @score.std)).abs < 0.01
1133
- assert ( 21.90480 - t(User.where(nil), @score.std(unbiased: false))).abs < 0.01
1134
- skip 'Not Yet Implemented' # if !['postgresql'].include?(@env_db)
1135
- assert_equal 2, User.select(@score.std(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
1136
- assert_equal 2, User.select(@score.variance(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
1137
- assert_equal 2, User.select(@score.sum(group: Arel.when(@name > 'M').then(0).else(1)).as('res')).map{|e| e['res']}.uniq.length
1138
- 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
1139
739
  end
1140
740
 
1141
741
  def test_levenshtein_distance
1142
- skip 'Not Yet Implemented' if $sqlite
1143
- assert_equal 0, t(@arthur, @name.levenshtein_distance('Arthur'))
1144
- assert_equal 2, t(@arthur, @name.levenshtein_distance('Artoor'))
1145
- 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"))
1146
746
  end
1147
747
 
1148
748
  def test_json
1149
749
  skip "Can't be tested on travis"
1150
- # creation
1151
- assert_equal 'Arthur', t(@arthur, Arel.json(@name))
1152
- assert_equal %w[Arthur Arthur], parse_json(t(@arthur, Arel.json(@name, @name)))
1153
- assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 'ArthurArthur'}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => @name + @name})))
1154
- assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 1}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => 1})))
1155
- 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}])))
1156
756
 
1157
757
  # aggregate
1158
- assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure'}),
1159
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name}).group(false)))
1160
- assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure', 'Laure' => 25, 'Lucas' => 5, 'Myung' => 23, 'Sophie' => 15}),
1161
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name, @name => @age}).group(false)))
1162
- assert_equal [{'5' => 'Lucas'}, {'15' => 'Sophie'}, {'23' => 'Myung'}, {'25' => 'Laure'}],
1163
- parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score), Arel.json({@age => @name}).group(true, [@age])))
1164
-
1165
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_sql
1166
- # puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_a
1167
-
1168
- skip 'Not Yet Implemented' if $sqlite || %w[oracle mssql].include?(@env_db)
1169
- # get
1170
- h1 = Arel.json({@name => @name + @name, @name + '2' => 1})
1171
- assert_equal 'ArthurArthur', parse_json(t(@arthur, h1.get(@name)))
1172
- h2 = Arel.json([{age: @age}, {name: @name, score: @score}])
1173
- assert_equal ({'age' => 21}), parse_json(t(@arthur, h2.get(0)))
1174
- assert_equal 21, parse_json(t(@arthur, h2.get(0).get('age')))
1175
- assert_nil t(@arthur, h2.get('age'))
1176
- # set
1177
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1}), parse_json(t(@arthur, h1.set(@name, %w[toto tata])))
1178
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.set(@name + '3', 2)))
1179
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => nil}), parse_json(t(@arthur, h1.set(@name + '3', nil)))
1180
- assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => {'a' => 2}}), parse_json(t(@arthur, h1.set(@name + '3', {a: 2})))
1181
- # merge
1182
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata]}, {@name + '3' => 2})))
1183
- assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata], @name + '3' => 2})))
1184
- 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({})))
1185
785
  end
1186
786
 
1187
787
  def test_as_on_everything
1188
788
  name = @arthur.select(@name.as('NaMe')).first.attributes
1189
- assert_equal 'Arthur', name['NaMe'] || name['name'] # because of Oracle
1190
- assert_equal 'Arthur', @arthur.select(@name.as('Na Me')).first.attributes['Na Me']
1191
- 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"]
1192
792
  end
1193
793
 
1194
- def test_exists_in_subquery
1195
- assert User.where(User.where(nil).arel.exists).first
1196
- end
1197
794
  end
1198
795
  end
1199
796
  end