diff options
author | Rafael França <rafaelmfranca@gmail.com> | 2016-01-05 23:05:16 -0200 |
---|---|---|
committer | Rafael França <rafaelmfranca@gmail.com> | 2016-01-05 23:05:16 -0200 |
commit | dfd22638c2773d843ea1d2e56992a6ac355b3ecb (patch) | |
tree | 1bf97bcb2f6928a32b6acb93ea9886925a0e21b4 /test/visitors | |
parent | 347c7786f8e7ea0e9643ff707ce1ace8b3969d6c (diff) | |
parent | 4c7e50f9328aca4e294b41fce0832bf6ac4a939a (diff) | |
download | rails-dfd22638c2773d843ea1d2e56992a6ac355b3ecb.tar.gz rails-dfd22638c2773d843ea1d2e56992a6ac355b3ecb.tar.bz2 rails-dfd22638c2773d843ea1d2e56992a6ac355b3ecb.zip |
Merge pull request #400 from felixbuenemann/case-node
Implement CASE Conditional Expression
Diffstat (limited to 'test/visitors')
-rw-r--r-- | test/visitors/test_depth_first.rb | 12 | ||||
-rw-r--r-- | test/visitors/test_to_sql.rb | 60 |
2 files changed, 72 insertions, 0 deletions
diff --git a/test/visitors/test_depth_first.rb b/test/visitors/test_depth_first.rb index 3356759b7d..1a72789f83 100644 --- a/test/visitors/test_depth_first.rb +++ b/test/visitors/test_depth_first.rb @@ -34,6 +34,7 @@ module Arel Arel::Nodes::UnqualifiedColumn, Arel::Nodes::Top, Arel::Nodes::Limit, + Arel::Nodes::Else, ].each do |klass| define_method("test_#{klass.name.gsub('::', '_')}") do op = klass.new(:a) @@ -118,6 +119,7 @@ module Arel Arel::Nodes::As, Arel::Nodes::DeleteStatement, Arel::Nodes::JoinSource, + Arel::Nodes::When, ].each do |klass| define_method("test_#{klass.name.gsub('::', '_')}") do binary = klass.new(:a, :b) @@ -247,6 +249,16 @@ module Arel assert_equal [:a, :b, stmt.columns, :c, stmt], @collector.calls end + def test_case + node = Arel::Nodes::Case.new + node.case = :a + node.conditions << :b + node.default = :c + + @visitor.accept node + assert_equal [:a, :b, node.conditions, :c, node], @collector.calls + end + def test_node node = Nodes::Node.new @visitor.accept node diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb index 7ae5d5b3af..ea58039529 100644 --- a/test/visitors/test_to_sql.rb +++ b/test/visitors/test_to_sql.rb @@ -607,6 +607,66 @@ module Arel end end end + + describe 'Nodes::Case' do + it 'supports simple case expressions' do + node = Arel::Nodes::Case.new(@table[:name]) + .when('foo').then(1) + .else(0) + + compile(node).must_be_like %{ + CASE "users"."name" WHEN 'foo' THEN 1 ELSE 0 END + } + end + + it 'supports extended case expressions' do + node = Arel::Nodes::Case.new + .when(@table[:name].in(%w(foo bar))).then(1) + .else(0) + + compile(node).must_be_like %{ + CASE WHEN "users"."name" IN ('foo', 'bar') THEN 1 ELSE 0 END + } + end + + it 'works without default branch' do + node = Arel::Nodes::Case.new(@table[:name]) + .when('foo').then(1) + + compile(node).must_be_like %{ + CASE "users"."name" WHEN 'foo' THEN 1 END + } + end + + it 'allows chaining multiple conditions' do + node = Arel::Nodes::Case.new(@table[:name]) + .when('foo').then(1) + .when('bar').then(2) + .else(0) + + compile(node).must_be_like %{ + CASE "users"."name" WHEN 'foo' THEN 1 WHEN 'bar' THEN 2 ELSE 0 END + } + end + + it 'supports #when with two arguments and no #then' do + node = Arel::Nodes::Case.new @table[:name] + + { foo: 1, bar: 0 }.reduce(node) { |node, pair| node.when *pair } + + compile(node).must_be_like %{ + CASE "users"."name" WHEN 'foo' THEN 1 WHEN 'bar' THEN 0 END + } + end + + it 'can be chained as a predicate' do + node = @table[:name].when('foo').then('bar').else('baz') + + compile(node).must_be_like %{ + CASE "users"."name" WHEN 'foo' THEN 'bar' ELSE 'baz' END + } + end + end end end end |