aboutsummaryrefslogtreecommitdiffstats
path: root/spec/arel
diff options
context:
space:
mode:
authorCarl Lerche <carllerche@mac.com>2010-03-11 16:13:47 -0800
committerCarl Lerche <carllerche@mac.com>2010-03-11 16:13:47 -0800
commite3461239adfa972de8f25a2bc6b48b4a8aa62c9c (patch)
tree3f90435e3c4350cc8af16eb5717dff1c19b2e297 /spec/arel
parent9e3450dd830caa8d1c12a0ce33b3837dc29d779c (diff)
downloadrails-e3461239adfa972de8f25a2bc6b48b4a8aa62c9c.tar.gz
rails-e3461239adfa972de8f25a2bc6b48b4a8aa62c9c.tar.bz2
rails-e3461239adfa972de8f25a2bc6b48b4a8aa62c9c.zip
Start writing integration specs for arel.
Diffstat (limited to 'spec/arel')
-rw-r--r--spec/arel/algebra/integration/basic_spec.rb120
1 files changed, 120 insertions, 0 deletions
diff --git a/spec/arel/algebra/integration/basic_spec.rb b/spec/arel/algebra/integration/basic_spec.rb
new file mode 100644
index 0000000000..84b8105f66
--- /dev/null
+++ b/spec/arel/algebra/integration/basic_spec.rb
@@ -0,0 +1,120 @@
+require 'spec_helper'
+
+module Arel
+ module Testing
+ class Engine
+ attr_reader :rows
+
+ def initialize
+ @rows = []
+ end
+
+ def supports(operation)
+ false
+ end
+
+ def read(relation)
+ @rows.dup.map { |r| Row.new(relation, r) }
+ end
+
+ def create(insert)
+ @rows << insert.record.tuple
+ insert
+ end
+ end
+ end
+end
+
+class Thing < Arel::Relation
+ attr_reader :engine, :attributes
+
+ def initialize(engine, attributes)
+ @engine = engine
+ @attributes = attributes.map { |a| a.to_attribute(self) }
+ end
+
+ def format(attribute, value)
+ value
+ end
+
+ def insert(row)
+ insert = super Arel::Row.new(self, row)
+ insert.record
+ end
+end
+
+def have_rows(expected)
+ simple_matcher "have rows" do |given, matcher|
+ found, got, expected = [], [], expected.map { |r| r.tuple }
+ given.each do |row|
+ got << row.tuple
+ found << expected.find { |r| row.tuple == r }
+ end
+
+ matcher.failure_message = "Expected to get:\n" \
+ "#{expected.map {|r| " #{r.inspect}" }.join("\n")}\n" \
+ "instead, got:\n" \
+ "#{got.map {|r| " #{r.inspect}" }.join("\n")}"
+
+ found.compact.length == expected.length && got.compact.length == expected.length
+ end
+end
+
+share_examples_for 'A Relation' do
+
+ before :all do
+ # The two needed instance variables need to be set in a
+ # before :all callback.
+ # @relation is the relation being tested here.
+ # @expected is an array of the elements that are expected to be in
+ # the relation.
+ %w[ @relation @expected ].each do |ivar|
+ raise "#{ivar} needs to be defined" unless instance_variable_get(ivar)
+ end
+
+ # There needs to be enough items to be able to run all the tests
+ raise "@expected needs to have at least 6 items" unless @expected.length >= 6
+ end
+
+ describe "#each" do
+ it "iterates over the rows in any order" do
+ @relation.should have_rows(@expected)
+ end
+ end
+
+ describe "#where" do
+ before :all do
+ @expected = @expected.sort_by { |r| r[@relation[:age]] }
+ @pivot = @expected[@expected.length / 2]
+ end
+
+ it "finds rows with an equal to predicate" do
+ expected = @expected.select { |r| r[@relation[:age]] == @pivot[@relation[:age]] }
+ @relation.where(@relation[:age].eq(@pivot[@relation[:age]])).should have_rows(expected)
+ end
+ end
+end
+
+describe "Arel::Relation" do
+
+ before :all do
+ @engine = Arel::Testing::Engine.new
+ @relation = Thing.new(@engine, [:id, :name, :age])
+ end
+
+ describe "..." do
+ before :all do
+ @expected = (1..20).map { |i| @relation.insert([i, nil, 2 * i]) }
+ end
+
+ it_should_behave_like 'A Relation'
+ end
+
+ describe "#insert" do
+ it "inserts the row into the engine" do
+ @relation.insert([1, 'Foo', 10])
+ @engine.rows.should == [[1, 'Foo', 10]]
+ end
+ end
+
+end \ No newline at end of file