From 43bfd3fae496a2a859aad0a654a91437357c3450 Mon Sep 17 00:00:00 2001 From: Ernie Miller Date: Fri, 21 May 2010 11:45:12 -0400 Subject: Fix tests to work properly on Ruby 1.9, honor multiple calls to #order in memory engine, and make having clauses behave like where clauses in SQL engine (join with AND, allow multiple calls to having to add predicates) --- spec/shared/relation_spec.rb | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'spec/shared') diff --git a/spec/shared/relation_spec.rb b/spec/shared/relation_spec.rb index e0c74fc7ee..b49e79f13d 100644 --- a/spec/shared/relation_spec.rb +++ b/spec/shared/relation_spec.rb @@ -154,25 +154,56 @@ share_examples_for 'A Relation' do describe "#order" do describe "by one attribute" do before :all do - @expected.map! { |r| r[@relation[:age]] } - @expected.sort! + @expected.sort! { |a, b| a[@relation[:age]] <=> b[@relation[:age]]}.map! {|e| e[@relation[:id]]} end it "can be specified as ascending order" do actual = [] - @relation.order(@relation[:age].asc).each { |r| actual << r[@relation[:age]] } + @relation.order(@relation[:age].asc).each { |r| actual << r[@relation[:id]] } actual.should == @expected end it "can be specified as descending order" do actual = [] - @relation.order(@relation[:age].desc).each { |r| actual << r[@relation[:age]] } + @relation.order(@relation[:age].desc).each { |r| actual << r[@relation[:id]] } actual.should == @expected.reverse end end - describe "by two attributes" do - it "works" + describe "by two attributes in two separate calls to #order" do + before :all do + @expected = @expected.sort_by { |e| [e[@relation[:name]], e[@relation[:age]]]}.map {|e| e[@relation[:id]]} + end + + it "can be specified as ascending order" do + actual = [] + @relation.order(@relation[:age].asc).order(@relation[:name].asc).each { |r| actual << r[@relation[:id]] } + actual.should == @expected + end + + it "can be specified as descending order" do + actual = [] + @relation.order(@relation[:age].desc).order(@relation[:name].desc).each { |r| actual << r[@relation[:id]] } + actual.should == @expected.reverse + end + end + + describe "by two attributes in one call to #order" do + before :all do + @expected = @expected.sort_by { |e| [e[@relation[:name]], e[@relation[:age]]]}.map {|e| e[@relation[:id]]} + end + + it "can be specified as ascending order in one call to #order" do + actual = [] + @relation.order(@relation[:name].asc, @relation[:age].asc).each { |r| actual << r[@relation[:id]] } + actual.should == @expected + end + + it "can be specified as descending order in one call to #order" do + actual = [] + @relation.order(@relation[:name].desc, @relation[:age].desc).each { |r| actual << r[@relation[:id]] } + actual.should == @expected.reverse + end end end -- cgit v1.2.3