You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by as...@apache.org on 2008/05/03 02:14:05 UTC

svn commit: r652957 [3/4] - in /ode/sandbox/singleshot: ./ app/controllers/ app/helpers/ app/models/ config/ db/ db/migrate/ lib/tasks/ public/javascripts/ spec/controllers/ vendor/plugins/rspec_on_rails/ vendor/plugins/rspec_on_rails/generators/ vendo...

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,113 @@
+module Spec
+  module Rails
+    module Matchers
+
+      class RedirectTo  #:nodoc:
+
+        def initialize(request, expected)
+          @expected = expected
+          @request = request
+        end
+
+        def matches?(response)
+          @redirected = response.redirect?
+          @actual = response.redirect_url
+          return false unless @redirected
+          if @expected.instance_of? Hash
+            return false unless @actual =~ %r{^\w+://#{@request.host}}
+            return false unless actual_redirect_to_valid_route
+            return actual_hash == expected_hash
+          else
+            return @actual == expected_url
+          end
+        end
+
+        def actual_hash
+          hash_from_url @actual
+        end
+
+        def expected_hash
+          hash_from_url expected_url
+        end
+
+        def actual_redirect_to_valid_route
+          actual_hash
+        end
+
+        def hash_from_url(url)
+          query_hash(url).merge(path_hash(url)).with_indifferent_access
+        end
+
+        def path_hash(url)
+          path = url.sub(%r{^\w+://#{@request.host}}, "").split("?", 2)[0]
+          ActionController::Routing::Routes.recognize_path path
+        end
+
+        def query_hash(url)
+          query = url.split("?", 2)[1] || ""
+          QueryParameterParser.parse_query_parameters(query, @request)
+        end
+
+       def expected_url
+          case @expected
+            when Hash
+              return ActionController::UrlRewriter.new(@request, {}).rewrite(@expected)
+            when :back
+              return @request.env['HTTP_REFERER']
+            when %r{^\w+://.*}
+              return @expected
+            else
+              return "http://#{@request.host}" + (@expected.split('')[0] == '/' ? '' : '/') + @expected
+          end
+        end
+
+        def failure_message
+          if @redirected
+            return %Q{expected redirect to #{@expected.inspect}, got redirect to #{@actual.inspect}}
+          else
+            return %Q{expected redirect to #{@expected.inspect}, got no redirect}
+          end
+        end
+
+        def negative_failure_message
+            return %Q{expected not to be redirected to #{@expected.inspect}, but was} if @redirected
+        end
+
+        def description
+          "redirect to #{@actual.inspect}"
+        end
+
+        class QueryParameterParser
+          def self.parse_query_parameters(query, request)
+            if defined?(CGIMethods)
+              CGIMethods.parse_query_parameters(query)
+            else
+              request.class.parse_query_parameters(query)
+            end
+          end
+        end
+      end
+
+      # :call-seq:
+      #   response.should redirect_to(url)
+      #   response.should redirect_to(:action => action_name)
+      #   response.should redirect_to(:controller => controller_name, :action => action_name)
+      #   response.should_not redirect_to(url)
+      #   response.should_not redirect_to(:action => action_name)
+      #   response.should_not redirect_to(:controller => controller_name, :action => action_name)
+      #
+      # Passes if the response is a redirect to the url, action or controller/action.
+      # Useful in controller specs (integration or isolation mode).
+      #
+      # == Examples
+      #
+      #   response.should redirect_to("path/to/action")
+      #   response.should redirect_to("http://test.host/path/to/action")
+      #   response.should redirect_to(:action => 'list')
+      def redirect_to(opts)
+        RedirectTo.new(request, opts)
+      end
+    end
+
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/render_template.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/render_template.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/render_template.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/render_template.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,70 @@
+module Spec
+  module Rails
+    module Matchers
+    
+      class RenderTemplate #:nodoc:
+    
+        def initialize(expected, controller)
+          @controller = controller
+          @expected = expected
+        end
+      
+        def matches?(response)
+          @actual = response.rendered_file
+          full_path(@actual) == full_path(@expected)
+        end
+
+        def failure_message
+          "expected #{@expected.inspect}, got #{@actual.inspect}"
+        end
+        
+        def negative_failure_message
+          "expected not to render #{@expected.inspect}, but did"
+        end
+        
+        def description
+          "render template #{@expected.inspect}"
+        end
+      
+        private
+          def full_path(path)
+            return nil if path.nil?
+            path.include?('/') ? path : "#{@controller.class.to_s.underscore.gsub('_controller','')}/#{path}"
+          end
+        
+      end
+
+      # :call-seq:
+      #   response.should render_template(path)
+      #   response.should_not render_template(path)
+      #
+      # Passes if the specified template is rendered by the response.
+      # Useful in controller specs (integration or isolation mode).
+      #
+      # <code>path</code> can include the controller path or not. It
+      # can also include an optional extension (no extension assumes .rhtml).
+      #
+      # Note that partials must be spelled with the preceding underscore.
+      #
+      # == Examples
+      #
+      #   response.should render_template('list')
+      #   response.should render_template('same_controller/list')
+      #   response.should render_template('other_controller/list')
+      #
+      #   #rjs
+      #   response.should render_template('list.rjs')
+      #   response.should render_template('same_controller/list.rjs')
+      #   response.should render_template('other_controller/list.rjs')
+      #
+      #   #partials
+      #   response.should render_template('_a_partial')
+      #   response.should render_template('same_controller/_a_partial')
+      #   response.should render_template('other_controller/_a_partial')
+      def render_template(path)
+        RenderTemplate.new(path.to_s, @controller)
+      end
+
+    end
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/story_adapter.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/story_adapter.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/story_adapter.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/story_adapter.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,71 @@
+# WARNING - THIS IS PURELY EXPERIMENTAL AT THIS POINT
+# Courtesy of Brian Takita and Yurii Rashkovskii
+
+$:.unshift File.join(File.dirname(__FILE__), *%w[.. .. .. .. rspec lib])
+if defined?(ActiveRecord::Base)
+  require 'test_help' 
+else
+  require 'action_controller/test_process'
+  require 'action_controller/integration'
+end
+require 'test/unit/testresult'
+require 'spec'
+require 'spec/rails'
+
+Test::Unit.run = true
+
+ActionController::Integration::Session.send(:include, Spec::Matchers)
+ActionController::Integration::Session.send(:include, Spec::Rails::Matchers)
+
+class RailsStory < ActionController::IntegrationTest
+  if defined?(ActiveRecord::Base)
+    self.use_transactional_fixtures = true
+  else
+    def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
+  end
+
+  def initialize #:nodoc:
+    # TODO - eliminate this hack, which is here to stop
+    # Rails Stories from dumping the example summary.
+    Spec::Runner::Options.class_eval do
+      def examples_should_be_run?
+        false
+      end
+    end
+    @_result = Test::Unit::TestResult.new
+  end
+end
+
+class ActiveRecordSafetyListener
+  include Singleton
+  def scenario_started(*args)
+    if defined?(ActiveRecord::Base)
+      ActiveRecord::Base.send :increment_open_transactions unless Rails::VERSION::STRING == "1.1.6"
+      ActiveRecord::Base.connection.begin_db_transaction
+    end
+  end
+
+  def scenario_succeeded(*args)
+    if defined?(ActiveRecord::Base)
+      ActiveRecord::Base.connection.rollback_db_transaction
+      ActiveRecord::Base.send :decrement_open_transactions unless Rails::VERSION::STRING == "1.1.6"
+    end
+  end
+  alias :scenario_pending :scenario_succeeded
+  alias :scenario_failed :scenario_succeeded
+end
+
+class Spec::Story::Runner::ScenarioRunner
+  def initialize
+    @listeners = [ActiveRecordSafetyListener.instance]
+  end
+end
+
+class Spec::Story::GivenScenario
+  def perform(instance, name = nil)
+    scenario = Spec::Story::Runner::StoryRunner.scenario_from_current_story @name
+    runner = Spec::Story::Runner::ScenarioRunner.new
+    runner.instance_variable_set(:@listeners,[])
+    runner.run(scenario, instance)
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/version.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/version.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/version.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/lib/spec/rails/version.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,23 @@
+module Spec
+  module Rails
+    module VERSION #:nodoc:
+      BUILD_TIME_UTC = 20080131122909
+    end
+  end
+end
+
+# Verify that the plugin has the same revision as RSpec
+if Spec::Rails::VERSION::BUILD_TIME_UTC != Spec::VERSION::BUILD_TIME_UTC
+  raise <<-EOF
+
+############################################################################
+Your RSpec on Rails plugin is incompatible with your installed RSpec.
+
+RSpec          : #{Spec::VERSION::BUILD_TIME_UTC}
+RSpec on Rails : #{Spec::Rails::VERSION::BUILD_TIME_UTC}
+
+Make sure your RSpec on Rails plugin is compatible with your RSpec gem.
+See http://rspec.rubyforge.org/documentation/rails/install.html for details.
+############################################################################
+EOF
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/mappings_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/mappings_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/mappings_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/mappings_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,36 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require File.join(File.dirname(__FILE__), *%w[.. .. .. lib autotest rails_rspec])
+require File.join(File.dirname(__FILE__), *%w[.. .. .. .. rspec spec autotest_matchers])
+
+describe Autotest::RailsRspec, "file mapping" do
+  before(:each) do
+    @autotest = Autotest::RailsRspec.new
+    @autotest.hook :initialize
+  end
+  
+  it "should map model example to model" do
+    @autotest.should map_specs(['spec/models/thing_spec.rb']).
+                            to('app/models/thing.rb')
+  end
+  
+  it "should map controller example to controller" do
+    @autotest.should map_specs(['spec/controllers/things_controller_spec.rb']).
+                            to('app/controllers/things_controller.rb')
+  end
+  
+  it "should map view.rhtml" do
+    @autotest.should map_specs(['spec/views/things/index.rhtml_spec.rb']).
+                            to('app/views/things/index.rhtml')
+  end
+  
+  it "should map view.rhtml with underscores in example filename" do
+    @autotest.should map_specs(['spec/views/things/index_rhtml_spec.rb']).
+                            to('app/views/things/index.rhtml')
+  end
+  
+  it "should map view.html.erb" do
+    @autotest.should map_specs(['spec/views/things/index.html.erb_spec.rb']).
+                            to('app/views/things/index.html.erb')
+  end
+  
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/rails_rspec_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/rails_rspec_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/rails_rspec_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/autotest/rails_rspec_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "autotest", "rails_rspec")
+
+describe Autotest::RailsRspec do
+  it "should provide the correct spec_command" do
+    Autotest::RailsRspec.new.spec_command.should == "script/spec"
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/assigns_hash_proxy_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/assigns_hash_proxy_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/assigns_hash_proxy_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/assigns_hash_proxy_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,55 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "An AssignsHashProxy" do
+  before(:each) do
+    @object = Object.new
+    @assigns = Hash.new
+    @object.stub!(:assigns).and_return(@assigns)
+    @proxy = Spec::Rails::Example::AssignsHashProxy.new(@object)
+  end
+
+  it "has [] accessor" do
+    @proxy['foo'] = 'bar'
+    @assigns['foo'].should == 'bar'
+    @proxy['foo'].should == 'bar'
+  end
+
+  it "works for symbol key" do
+    @assigns[:foo] = 2
+    @proxy[:foo].should == 2
+  end
+
+  it "checks for string key before symbol key" do
+    @assigns['foo'] = false
+    @assigns[:foo] = 2
+    @proxy[:foo].should == false
+  end
+
+  it "each method iterates through each element like a Hash" do
+    values = {
+      'foo' => 1,
+      'bar' => 2,
+      'baz' => 3
+    }
+    @proxy['foo'] = values['foo']
+    @proxy['bar'] = values['bar']
+    @proxy['baz'] = values['baz']
+
+    @proxy.each do |key, value|
+      key.should == key
+      value.should == values[key]
+    end
+  end
+
+  it "delete method deletes the element of passed in key" do
+    @proxy['foo'] = 'bar'
+    @proxy.delete('foo').should == 'bar'
+    @proxy['foo'].should be_nil
+  end
+
+  it "has_key? detects the presence of a key" do
+    @proxy['foo'] = 'bar'
+    @proxy.has_key?('foo').should == true
+    @proxy.has_key?('bar').should == false
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/configuration_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/configuration_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/configuration_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/configuration_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,83 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module Spec
+  module Example
+    describe Configuration, :shared => true do
+      before(:each) { @config = Configuration.new }
+    end
+
+    describe Configuration, "#use_transactional_fixtures" do
+      it_should_behave_like "Spec::Example::Configuration"
+
+      it "should return Test::Unit::TestCase.use_transactional_fixtures" do
+        @config.use_transactional_fixtures.should == Test::Unit::TestCase.use_transactional_fixtures
+      end
+
+      it "should set Test::Unit::TestCase.use_transactional_fixtures to false" do
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.should_receive(:use_transactional_fixtures=).with(false)
+        end
+        @config.use_transactional_fixtures = false
+      end
+
+      it "should set Test::Unit::TestCase.use_transactional_fixtures to true" do
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.should_receive(:use_transactional_fixtures=).with(true)
+        end
+        @config.use_transactional_fixtures = true
+      end
+    end
+
+    describe Configuration, "#use_instantiated_fixtures" do
+      it_should_behave_like "Spec::Example::Configuration"
+
+      it "should return Test::Unit::TestCase.use_transactional_fixtures" do
+        @config.use_instantiated_fixtures.should == Test::Unit::TestCase.use_instantiated_fixtures
+      end
+
+      it "should set Test::Unit::TestCase.use_instantiated_fixtures to false" do
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.should_receive(:use_instantiated_fixtures=).with(false)
+        end
+        @config.use_instantiated_fixtures = false
+      end
+
+      it "should set Test::Unit::TestCase.use_instantiated_fixtures to true" do
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.should_receive(:use_instantiated_fixtures=).with(true)
+        end
+        @config.use_instantiated_fixtures = true
+      end
+    end
+
+    describe Configuration, "#fixture_path" do
+      it_should_behave_like "Spec::Example::Configuration"
+
+      it "should default to RAILS_ROOT + '/spec/fixtures'" do
+        @config.fixture_path.should == RAILS_ROOT + '/spec/fixtures'
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.fixture_path.should == RAILS_ROOT + '/spec/fixtures'
+        end
+      end
+
+      it "should set fixture_path" do
+        @config.fixture_path = "/new/path"
+        @config.fixture_path.should == "/new/path"
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.fixture_path.should == "/new/path"
+        end
+      end
+    end
+
+    describe Configuration, "#global_fixtures" do
+      it_should_behave_like "Spec::Example::Configuration"
+
+      it "should set fixtures on TestCase" do
+        Configuration::EXAMPLE_GROUP_CLASSES.each do |example_group|
+          example_group.should_receive(:fixtures).with(:blah)
+        end
+        @config.global_fixtures = [:blah]
+      end
+    end
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_isolation_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_isolation_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_isolation_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_isolation_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,43 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'controller_spec_controller'
+
+describe "a controller spec running in isolation mode", :type => :controller do
+  controller_name :controller_spec
+
+  it "should not care if the template doesn't exist" do
+    get 'some_action'
+    response.should be_success
+    response.should render_template("template/that/does/not/actually/exist")
+  end
+
+  it "should not care if the template has errors" do
+    get 'action_with_errors_in_template'
+    response.should be_success
+    response.should render_template("action_with_errors_in_template")
+  end
+end
+
+describe "a controller spec running in integration mode", :type => :controller do
+  controller_name :controller_spec
+  integrate_views
+  
+  before(:each) do
+    controller.class.send(:define_method, :rescue_action) { |e| raise e }
+  end
+
+  it "should render a template" do
+    get 'action_with_template'
+    response.should be_success
+    response.should have_tag('div', 'This is action_with_template.rhtml')
+  end
+
+  it "should choke if the template doesn't exist" do
+    lambda { get 'some_action' }.should raise_error(ActionController::MissingTemplate)
+    response.should_not be_success
+  end
+
+  it "should choke if the template has errors" do
+    lambda { get 'action_with_errors_in_template' }.should raise_error(ActionView::TemplateError)
+    response.should_not be_success
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_spec_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_spec_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_spec_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/controller_spec_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,187 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'controller_spec_controller'
+
+['integration', 'isolation'].each do |mode|
+  describe "A controller example running in #{mode} mode", :type => :controller do
+    controller_name :controller_spec
+    integrate_views if mode == 'integration'
+  
+    it "should provide controller.session as session" do
+      get 'action_with_template'
+      session.should equal(controller.session)
+    end
+  
+    it "should provide the same session object before and after the action" do
+      session_before = session
+      get 'action_with_template'
+      session.should equal(session_before)
+    end
+  
+    it "should ensure controller.session is NOT nil before the action" do
+      controller.session.should_not be_nil
+      get 'action_with_template'
+    end
+    
+    it "should ensure controller.session is NOT nil after the action" do
+      get 'action_with_template'
+      controller.session.should_not be_nil
+    end
+    
+    it "should allow specifying a partial with partial name only" do
+      get 'action_with_partial'
+      response.should render_template("_partial")
+    end
+    
+    it "should allow specifying a partial with expect_render" do
+      controller.expect_render(:partial => "controller_spec/partial")
+      get 'action_with_partial'
+    end
+    
+    it "should allow specifying a partial with expect_render with object" do
+      controller.expect_render(:partial => "controller_spec/partial", :object => "something")
+      get 'action_with_partial_with_object', :thing => "something"
+    end
+    
+    it "should allow specifying a partial with expect_render with locals" do
+      controller.expect_render(:partial => "controller_spec/partial", :locals => {:thing => "something"})
+      get 'action_with_partial_with_locals', :thing => "something"
+    end
+    
+    it "should yield to render :update" do
+      template = stub("template")
+      controller.expect_render(:update).and_yield(template)
+      template.should_receive(:replace).with(:bottom, "replace_me", :partial => "non_existent_partial")
+      get 'action_with_render_update'
+      puts response.body
+    end
+    
+    it "should allow a path relative to RAILS_ROOT/app/views/ when specifying a partial" do
+      get 'action_with_partial'
+      response.should render_template("controller_spec/_partial")
+    end
+    
+    it "should provide access to flash" do
+      get 'action_with_template'
+      flash[:flash_key].should == "flash value"
+    end
+    
+    it "should provide access to flash values set after a session reset" do
+      get 'action_setting_flash_after_session_reset'
+      flash[:after_reset].should == "available"
+    end
+    
+    it "should not provide access to flash values set before a session reset" do
+      get 'action_setting_flash_before_session_reset'
+      flash[:before_reset].should_not == "available"
+    end
+
+    it "should provide access to session" do
+      get 'action_with_template'
+      session[:session_key].should == "session value"
+    end
+
+    it "should support custom routes" do
+      route_for(:controller => "custom_route_spec", :action => "custom_route").should == "/custom_route"
+    end
+
+    it "should support existing routes" do
+      route_for(:controller => "controller_spec", :action => "some_action").should == "/controller_spec/some_action"
+    end
+
+    it "should generate params for custom routes" do
+      params_from(:get, '/custom_route').should == {:controller => "custom_route_spec", :action => "custom_route"}
+    end
+    
+    it "should generate params for existing routes" do
+      params_from(:get, '/controller_spec/some_action').should == {:controller => "controller_spec", :action => "some_action"}
+    end
+    
+    it "should expose instance vars through the assigns hash" do
+      get 'action_setting_the_assigns_hash'
+      assigns[:indirect_assigns_key].should == :indirect_assigns_key_value
+    end
+    
+    it "should expose the assigns hash directly" do
+      get 'action_setting_the_assigns_hash'
+      assigns[:direct_assigns_key].should == :direct_assigns_key_value
+    end
+    
+    it "should complain when calling should_receive(:render) on the controller" do
+      lambda {
+        controller.should_receive(:render)
+      }.should raise_error(RuntimeError, /should_receive\(:render\) has been disabled/)
+    end
+
+    it "should complain when calling stub!(:render) on the controller" do
+      lambda {
+        controller.stub!(:render)
+      }.should raise_error(RuntimeError, /stub!\(:render\) has been disabled/)
+    end
+    
+    it "should NOT complain when calling should_receive with arguments other than :render" do
+      controller.should_receive(:anything_besides_render)
+      lambda {
+        controller.rspec_verify
+      }.should raise_error(Exception, /expected :anything_besides_render/)
+    end
+  end
+
+  describe "Given a controller spec for RedirectSpecController running in #{mode} mode", :type => :controller do
+    controller_name :redirect_spec
+    integrate_views if mode == 'integration'
+
+    it "a redirect should ignore the absence of a template" do
+      get 'action_with_redirect_to_somewhere'
+      response.should be_redirect
+      response.redirect_url.should == "http://test.host/redirect_spec/somewhere"
+      response.should redirect_to("http://test.host/redirect_spec/somewhere")
+    end
+    
+    it "a call to response.should redirect_to should fail if no redirect" do
+      get 'action_with_no_redirect'
+      lambda {
+        response.redirect?.should be_true
+      }.should fail
+      lambda {
+        response.should redirect_to("http://test.host/redirect_spec/somewhere")
+      }.should fail_with("expected redirect to \"http://test.host/redirect_spec/somewhere\", got no redirect")
+    end
+  end
+  
+  describe "Given a controller spec running in #{mode} mode" do
+    example_group = describe "A controller spec"
+    # , :type => :controller do
+    # integrate_views if mode == 'integration'
+    it "a spec in a context without controller_name set should fail with a useful warning" do
+      pending("need a new way to deal with examples that should_raise")
+    # ,
+    #   :should_raise => [
+    #     Spec::Expectations::ExpectationNotMetError,
+    #     /You have to declare the controller name in controller specs/
+    #   ] do
+    end
+  end
+  
+end
+
+describe ControllerSpecController, :type => :controller do
+  it "should not require naming the controller if describe is passed a type" do
+  end  
+end
+
+module Spec
+  module Rails
+    module Example
+      describe ControllerExampleGroup do
+        it "should clear its name from the description" do
+          group = describe("foo", :type => :controller) do
+            $nested_group = describe("bar") do
+            end
+          end
+          group.description.to_s.should == "foo"
+          $nested_group.description.to_s.should == "foo bar"
+        end
+      end
+    end
+  end
+end
\ No newline at end of file

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/example_group_factory_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/example_group_factory_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/example_group_factory_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/example_group_factory_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,112 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module Spec
+  module Example
+    describe ExampleGroupFactory do
+      it "should return a ModelExampleGroup when given :type => :model" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :type => :model
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ModelExampleGroup
+      end
+
+      it "should return a ModelExampleGroup when given :spec_path => '/blah/spec/models/'" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '/blah/spec/models/blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ModelExampleGroup
+      end
+
+      it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\models\\' (windows format)" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '\\blah\\spec\\models\\blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ModelExampleGroup
+      end
+
+      it "should return a RailsExampleGroup when given :spec_path => '/blah/spec/foo/' (anything other than controllers, views and helpers)" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '/blah/spec/foo/blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::RailsExampleGroup
+      end
+
+      it "should return a RailsExampleGroup when given :spec_path => '\\blah\\spec\\foo\\' (windows format)  (anything other than controllers, views and helpers)" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '\\blah\\spec\\foo\\blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::RailsExampleGroup
+      end
+
+      it "should return a ViewExampleGroup when given :type => :model" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :type => :view
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ViewExampleGroup
+      end
+
+      it "should return a ViewExampleGroup when given :spec_path => '/blah/spec/views/'" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '/blah/spec/views/blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ViewExampleGroup
+      end
+
+      it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\views\\' (windows format)" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '\\blah\\spec\\views\\blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ViewExampleGroup
+      end
+
+      it "should return a HelperExampleGroup when given :type => :helper" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :type => :helper
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::HelperExampleGroup
+      end
+
+      it "should return a HelperExampleGroup when given :spec_path => '/blah/spec/helpers/'" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '/blah/spec/helpers/blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::HelperExampleGroup
+      end
+
+      it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\helpers\\' (windows format)" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '\\blah\\spec\\helpers\\blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::HelperExampleGroup
+      end
+
+      it "should return a ControllerExampleGroup when given :type => :controller" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :type => :controller
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+      end
+
+      it "should return a ControllerExampleGroup when given :spec_path => '/blah/spec/controllers/'" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '/blah/spec/controllers/blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+      end
+
+      it "should return a ModelExampleGroup when given :spec_path => '\\blah\\spec\\controllers\\' (windows format)" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '\\blah\\spec\\controllers\\blah.rb'
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+      end
+
+      it "should favor the :type over the :spec_path" do
+        example_group = Spec::Example::ExampleGroupFactory.create_example_group(
+          "name", :spec_path => '/blah/spec/models/blah.rb', :type => :controller
+        ) {}
+        example_group.superclass.should == Spec::Rails::Example::ControllerExampleGroup
+      end
+    end
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/helper_spec_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/helper_spec_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/helper_spec_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/helper_spec_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,118 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+Spec::Runner.configuration.global_fixtures = :people
+
+describe ExplicitHelper, :type => :helper do
+  it "should not require naming the helper if describe is passed a type" do
+    method_in_explicit_helper.should match(/text from a method/)
+  end
+end
+
+module Spec
+  module Rails
+    module Example
+      describe HelperExampleGroup, :type => :helper do
+        helper_name :explicit
+
+        it "should have direct access to methods defined in helpers" do
+          method_in_explicit_helper.should =~ /text from a method/
+        end
+
+        it "should have access to named routes" do
+          rspec_on_rails_specs_url.should == "http://test.host/rspec_on_rails_specs"
+          rspec_on_rails_specs_path.should == "/rspec_on_rails_specs"
+        end
+
+        it "should fail if the helper method deson't exist" do
+          lambda { non_existant_helper_method }.should raise_error(NameError)
+        end
+      end
+
+
+      describe HelperExampleGroup, "#eval_erb", :type => :helper do
+        helper_name :explicit
+
+        it "should support methods that accept blocks" do
+          eval_erb("<% prepend 'foo' do %>bar<% end %>").should == "foobar"
+        end
+      end
+
+      describe HelperExampleGroup, ".fixtures", :type => :helper do
+        helper_name :explicit
+        fixtures :animals
+
+        it "should load fixtures" do
+          pig = animals(:pig)
+          pig.class.should == Animal
+        end
+
+        it "should load global fixtures" do
+          lachie = people(:lachie)
+          lachie.class.should == Person
+        end
+      end
+
+      describe HelperExampleGroup, "included modules", :type => :helper do
+        helpers = [
+          ActionView::Helpers::ActiveRecordHelper,
+          ActionView::Helpers::AssetTagHelper,
+          ActionView::Helpers::BenchmarkHelper,
+          ActionView::Helpers::CacheHelper,
+          ActionView::Helpers::CaptureHelper,
+          ActionView::Helpers::DateHelper,
+          ActionView::Helpers::DebugHelper,
+          ActionView::Helpers::FormHelper,
+          ActionView::Helpers::FormOptionsHelper,
+          ActionView::Helpers::FormTagHelper,
+          ActionView::Helpers::JavaScriptHelper,
+          ActionView::Helpers::NumberHelper,
+          ActionView::Helpers::PrototypeHelper,
+          ActionView::Helpers::ScriptaculousHelper,
+          ActionView::Helpers::TagHelper,
+          ActionView::Helpers::TextHelper,
+          ActionView::Helpers::UrlHelper
+        ]
+        helpers << ActionView::Helpers::PaginationHelper rescue nil       #removed for 2.0
+        helpers << ActionView::Helpers::JavaScriptMacrosHelper rescue nil #removed for 2.0
+        helpers.each do |helper_module|
+          it "should include #{helper_module}" do
+            self.class.ancestors.should include(helper_module)
+          end
+        end
+      end
+      
+      # TODO: BT - Helper Examples should proxy method_missing to a Rails View instance.
+      # When that is done, remove this method
+      describe HelperExampleGroup, "#protect_against_forgery?", :type => :helper do
+        it "should return false" do
+          protect_against_forgery?.should be_false
+        end
+      end
+    end
+  end
+end
+
+module Bug11223
+  # see http://rubyforge.org/tracker/index.php?func=detail&aid=11223&group_id=797&atid=3149
+  describe 'Accessing flash from helper spec', :type => :helper do
+    it 'should not raise an error' do
+      lambda { flash['test'] }.should_not raise_error
+    end
+  end
+end
+
+module Spec
+  module Rails
+    module Example
+      describe HelperExampleGroup do
+        it "should clear its name from the description" do
+          group = describe("foo", :type => :helper) do
+            $nested_group = describe("bar") do
+            end
+          end
+          group.description.to_s.should == "foo"
+          $nested_group.description.to_s.should == "foo bar"
+        end
+      end
+    end
+  end
+end
\ No newline at end of file

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/ivar_proxy_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/ivar_proxy_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/ivar_proxy_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/ivar_proxy_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,64 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "IvarProxy setup", :shared => true do
+  before do
+    @object = Object.new
+    @proxy = Spec::Rails::Example::IvarProxy.new(@object)
+  end  
+end
+
+describe "IvarProxy" do
+  it_should_behave_like "IvarProxy setup"
+  
+  it "has [] accessor" do
+    @proxy['foo'] = 'bar'
+    @object.instance_variable_get(:@foo).should == 'bar'
+    @proxy['foo'].should == 'bar'
+  end
+
+  it "iterates through each element like a Hash" do
+    values = {
+      'foo' => 1,
+      'bar' => 2,
+      'baz' => 3
+    }
+    @proxy['foo'] = values['foo']
+    @proxy['bar'] = values['bar']
+    @proxy['baz'] = values['baz']
+
+    @proxy.each do |key, value|
+      key.should == key
+      value.should == values[key]
+    end
+  end
+
+  it "detects the presence of a key" do
+    @proxy['foo'] = 'bar'
+    @proxy.has_key?('foo').should == true
+    @proxy.has_key?('bar').should == false
+  end
+end
+
+describe "IvarProxy", "#delete" do
+  it_should_behave_like "IvarProxy setup"
+  
+  it "deletes the element with key" do
+    @proxy['foo'] = 'bar'
+    @proxy.delete('foo').should == 'bar'
+    @proxy['foo'].should be_nil
+  end
+
+  it "deletes nil instance variables" do
+    @proxy['foo'] = nil
+    @object.instance_variables.should include("@foo")
+    @proxy.delete('foo').should == nil
+    @proxy['foo'].should be_nil
+    @object.instance_variables.should_not include("@foo")
+  end
+
+  it "returns nil when key does not exist" do
+    @proxy['foo'].should be_nil
+    @proxy.delete('foo').should == nil
+    @proxy['foo'].should be_nil
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/model_spec_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/model_spec_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/model_spec_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/model_spec_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,18 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module Spec
+  module Rails
+    module Example
+      describe ModelExampleGroup do
+        it "should clear its name from the description" do
+          group = describe("foo", :type => :model) do
+            $nested_group = describe("bar") do
+            end
+          end
+          group.description.to_s.should == "foo"
+          $nested_group.description.to_s.should == "foo bar"
+        end
+      end
+    end
+  end
+end
\ No newline at end of file

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/shared_behaviour_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/shared_behaviour_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/shared_behaviour_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/shared_behaviour_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,16 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "A shared view example_group", :shared => true do
+  it "should have some tag with some text" do
+    response.should have_tag('div', 'This is text from a method in the ViewSpecHelper')
+  end
+end
+
+describe "A view example_group", :type => :view do
+  it_should_behave_like "A shared view example_group"
+  
+  before(:each) do
+    render "view_spec/implicit_helper"
+  end
+end
+  

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/test_unit_assertion_accessibility_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/test_unit_assertion_accessibility_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/test_unit_assertion_accessibility_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/test_unit_assertion_accessibility_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,33 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "assert_equal", :shared => true do
+  it "like assert_equal" do
+    assert_equal 1, 1
+    lambda {
+      assert_equal 1, 2
+    }.should raise_error(Test::Unit::AssertionFailedError)
+  end
+end
+
+describe "A model spec should be able to access 'test/unit' assertions", :type => :model do
+  it_should_behave_like "assert_equal"
+end
+
+describe "A view spec should be able to access 'test/unit' assertions", :type => :view do
+  it_should_behave_like "assert_equal"
+end
+
+describe "A helper spec should be able to access 'test/unit' assertions", :type => :helper do
+  it_should_behave_like "assert_equal"
+end
+
+describe "A controller spec with integrated views should be able to access 'test/unit' assertions", :type => :controller do
+  controller_name :controller_spec
+  integrate_views
+  it_should_behave_like "assert_equal"
+end
+
+describe "A controller spec should be able to access 'test/unit' assertions", :type => :controller do
+  controller_name :controller_spec
+  it_should_behave_like "assert_equal"
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/view_spec_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/view_spec_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/view_spec_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/example/view_spec_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,263 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "A template with an implicit helper", :type => :view do
+  before(:each) do
+    render "view_spec/implicit_helper"
+  end
+
+  it "should include the helper" do
+    response.should have_tag('div', :content => "This is text from a method in the ViewSpecHelper")
+  end
+
+  it "should include the application helper" do
+    response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
+  end
+
+  it "should have access to named routes" do
+    rspec_on_rails_specs_url.should == "http://test.host/rspec_on_rails_specs"
+    rspec_on_rails_specs_path.should == "/rspec_on_rails_specs"
+  end
+end
+
+describe "A template requiring an explicit helper", :type => :view do
+  before(:each) do
+    render "view_spec/explicit_helper", :helper => 'explicit'
+  end
+
+  it "should include the helper if specified" do
+    response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
+  end
+
+  it "should include the application helper" do
+    response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
+  end
+end
+
+describe "A template requiring multiple explicit helpers", :type => :view do
+  before(:each) do
+    render "view_spec/multiple_helpers", :helpers => ['explicit', 'more_explicit']
+  end
+
+  it "should include all specified helpers" do
+    response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
+    response.should have_tag('div', :content => "This is text from a method in the MoreExplicitHelper")
+  end
+
+  it "should include the application helper" do
+    response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
+  end
+end
+
+describe "Message Expectations on helper methods", :type => :view do
+  it "should work" do
+    template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 1')
+    render "view_spec/implicit_helper"
+    response.body.should =~ /alternate message 1/
+  end
+
+  it "should work twice" do
+    template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 2')
+    render "view_spec/implicit_helper"
+    response.body.should =~ /alternate message 2/
+  end
+end
+
+describe "A template that includes a partial", :type => :view do
+  def render!
+    render "view_spec/template_with_partial"
+  end
+
+  it "should render the enclosing template" do
+    render!
+    response.should have_tag('div', "method_in_partial in ViewSpecHelper")
+  end
+
+  it "should render the partial" do
+    render!
+    response.should have_tag('div', "method_in_template_with_partial in ViewSpecHelper")
+  end
+
+  it "should include the application helper" do
+    render!
+    response.should have_tag('div', "This is text from a method in the ApplicationHelper")
+  end
+  
+  it "should pass expect_render with the right partial" do
+    template.expect_render(:partial => 'partial')
+    render!
+    template.verify_rendered
+  end
+  
+  it "should fail expect_render with the wrong partial" do
+    template.expect_render(:partial => 'non_existent')
+    render!
+    begin
+      template.verify_rendered
+    rescue Spec::Mocks::MockExpectationError => e
+    ensure
+      e.backtrace.find{|line| line =~ /view_spec_spec\.rb\:92/}.should_not be_nil
+    end
+  end
+  
+  it "should pass expect_render when a partial is expected twice and happens twice" do
+    template.expect_render(:partial => 'partial_used_twice').twice
+    render!
+    template.verify_rendered
+  end
+  
+  it "should pass expect_render when a partial is expected once and happens twice" do
+    template.expect_render(:partial => 'partial_used_twice')
+    render!
+    begin
+      template.verify_rendered
+    rescue Spec::Mocks::MockExpectationError => e
+    ensure
+      e.backtrace.find{|line| line =~ /view_spec_spec\.rb\:109/}.should_not be_nil
+    end
+  end
+  
+  it "should fail expect_render with the right partial but wrong options" do
+    template.expect_render(:partial => 'partial', :locals => {:thing => Object.new})
+    render!
+    lambda {template.verify_rendered}.should raise_error(Spec::Mocks::MockExpectationError)
+  end
+end
+
+describe "A partial that includes a partial", :type => :view do
+  it "should support expect_render with nested partial" do
+    obj = Object.new
+    template.expect_render(:partial => 'partial', :object => obj)
+    render :partial => "view_spec/partial_with_sub_partial", :locals => { :partial => obj }
+  end
+end
+
+describe "A view that includes a partial using :collection and :spacer_template", :type => :view  do
+  it "should render the partial w/ spacer_tamplate" do
+    render "view_spec/template_with_partial_using_collection"
+    response.should have_tag('div',/method_in_partial/)
+    response.should have_tag('div',/ApplicationHelper/)
+    response.should have_tag('div',/ViewSpecHelper/)
+    response.should have_tag('hr#spacer')
+  end
+
+  it "should render the partial" do
+    template.expect_render(:partial => 'partial',
+               :collection => ['Alice', 'Bob'],
+               :spacer_template => 'spacer')
+    render "view_spec/template_with_partial_using_collection"
+  end
+
+end
+
+describe "A view that includes a partial using an array as partial_path", :type => :view do
+  before(:each) do
+    module ActionView::Partials
+      def render_template_with_partial_with_array_support(partial_path, local_assigns = nil, deprecated_local_assigns = nil)
+        if partial_path.is_a?(Array)
+          "Array Partial"
+        else
+          render_partial_without_array_support(partial_path, local_assigns, deprecated_local_assigns)
+        end
+      end
+
+      alias :render_partial_without_array_support :render_partial
+      alias :render_partial :render_template_with_partial_with_array_support
+    end
+
+    @array = ['Alice', 'Bob']
+    assigns[:array] = @array
+  end
+
+  after(:each) do
+    module ActionView::Partials
+      alias :render_template_with_partial_with_array_support :render_partial
+      alias :render_partial :render_partial_without_array_support
+      undef render_template_with_partial_with_array_support
+    end
+  end
+
+  it "should render have the array passed through to render_partial without modification" do
+    render "view_spec/template_with_partial_with_array" 
+    response.body.should match(/^Array Partial$/)
+  end
+end
+
+describe "Different types of renders (not :template)", :type => :view do
+  it "should render partial with local" do
+    render :partial => "view_spec/partial_with_local_variable", :locals => {:x => "Ender"}
+    response.should have_tag('div', :content => "Ender")
+  end
+end
+
+describe "A view", :type => :view do
+  before(:each) do
+    session[:key] = "session"
+    params[:key] = "params"
+    flash[:key] = "flash"
+    render "view_spec/accessor"
+  end
+
+  it "should have access to session data" do
+    response.should have_tag("div#session", "session")
+  end
+
+  specify "should have access to params data" do
+    response.should have_tag("div#params", "params")
+  end
+
+  it "should have access to flash data" do
+    response.should have_tag("div#flash", "flash")
+  end
+end
+
+describe "A view with a form_tag", :type => :view do
+  it "should render the right action" do
+    render "view_spec/entry_form"
+    response.should have_tag("form[action=?]","/view_spec/entry_form")
+  end
+end
+
+describe "An instantiated ViewExampleGroupController", :type => :view do
+  before do
+    render "view_spec/foo/show"
+  end
+  
+  it "should return the name of the real controller that it replaces" do
+    @controller.controller_name.should == 'foo'
+  end
+  
+  it "should return the path of the real controller that it replaces" do
+    @controller.controller_path.should == 'view_spec/foo'
+  end
+end
+
+module Spec
+  module Rails
+    module Example
+      describe ViewExampleGroup do
+        it "should clear its name from the description" do
+          group = describe("foo", :type => :view) do
+            $nested_group = describe("bar") do
+            end
+          end
+          group.description.to_s.should == "foo"
+          $nested_group.description.to_s.should == "foo bar"
+        end
+
+        it "should clear ActionView::Base.base_view_path on teardown" do
+          ViewExampleGroup.class_eval do
+            alias_method(:ensure_that_base_view_path_is_not_set_across_example_groups_orig,
+              :ensure_that_base_view_path_is_not_set_across_example_groups)
+            define_method(:ensure_that_base_view_path_is_not_set_across_example_groups){
+              $base_view_path_cleared = true
+              ensure_that_base_view_path_is_not_set_across_example_groups_orig
+            }
+          end
+          describe("base_view_path_cleared flag", :type => :view) do
+            it { $base_view_path_cleared.should be_true }
+          end
+        end
+      end
+    end
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_controller_rescue_action_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_controller_rescue_action_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_controller_rescue_action_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_controller_rescue_action_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,54 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+module ActionController
+  describe "Rescue", "#rescue_action in default mode" do
+    before(:each) do
+      @fixture = Object.new
+      @fixture.extend ActionController::Rescue
+      class << @fixture
+        public :rescue_action
+      end
+    end
+
+    it "should raise the passed in exception so examples fail fast" do
+      proc {@fixture.rescue_action(RuntimeError.new("Foobar"))}.should raise_error(RuntimeError, "Foobar")
+    end
+  end
+
+  class RescueOverriddenController < ActionController::Base
+    def rescue_action(error)
+      "successfully overridden"
+    end
+  end
+
+  describe "Rescue", "#rescue_action, when overridden" do
+    before(:each) do
+      @fixture = RescueOverriddenController.new
+    end
+
+    it "should do whatever the overridden method does" do
+      @fixture.rescue_action(RuntimeError.new("Foobar")).should == "successfully overridden"
+    end
+  end
+
+  class SearchController < ActionController::Base
+  end
+
+  describe "Rescue", "#rescue_action when told to use rails error handling" do
+    before(:each) do
+      @controller = SearchController.new
+      @controller.use_rails_error_handling!
+      class << @controller
+        public :rescue_action
+      end
+    end
+
+    it "should use Rails exception handling" do
+      exception = RuntimeError.new("The Error")
+      exception.stub!(:backtrace).and_return(caller)
+      @controller.should_receive(:rescue_action_locally).with(exception)
+
+      @controller.rescue_action(exception)
+    end
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_view_base_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_view_base_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_view_base_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_view_base_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,48 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+require 'spec/mocks/errors'
+
+describe ActionView::Base, "with RSpec extensions:", :type => :view do 
+  
+  describe "expect_render" do
+    it "should not raise when render has been received" do
+      template.expect_render(:partial => "name")
+      template.render :partial => "name"
+    end
+  
+    it "should raise when render has NOT been received" do
+      template.expect_render(:partial => "name")
+      lambda {
+        template.verify_rendered
+      }.should raise_error
+    end
+    
+    it "should return something (like a normal mock)" do
+      template.expect_render(:partial => "name").and_return("Little Johnny")
+      result = template.render :partial => "name"
+      result.should == "Little Johnny"
+    end
+  end
+  
+  describe "stub_render" do
+    it "should not raise when stubbing and render has been received" do
+      template.stub_render(:partial => "name")
+      template.render :partial => "name"
+    end
+  
+    it "should not raise when stubbing and render has NOT been received" do
+      template.stub_render(:partial => "name")
+    end
+  
+    it "should not raise when stubbing and render has been received with different options" do
+      template.stub_render(:partial => "name")
+      template.render :partial => "view_spec/spacer"
+    end
+
+    it "should not raise when stubbing and expecting and render has been received" do
+      template.stub_render(:partial => "name")
+      template.expect_render(:partial => "name")
+      template.render(:partial => "name")
+    end
+  end
+
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/active_record_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/active_record_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/active_record_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/extensions/active_record_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "A model" do
+  fixtures :things
+  it "should tell you its required fields" do
+    Thing.new.should have(1).error_on(:name)
+  end
+  
+  it "should tell you how many records it has" do
+    Thing.should have(:no).records
+    Thing.create(:name => "THE THING")
+    Thing.should have(1).record
+  end
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/assert_select_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/assert_select_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/assert_select_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/assert_select_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,783 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+# assert_select plugins for Rails
+#
+# Copyright (c) 2006 Assaf Arkin, under Creative Commons Attribution and/or MIT License
+# Developed for http://co.mments.com
+# Code and documention: http://labnotes.org
+
+class AssertSelectController < ActionController::Base
+
+  def response=(content)
+    @content = content
+  end
+
+  #NOTE - this is commented because response is implemented in lib/spec/rails/context/controller
+  # def response(&block)
+  #   @update = block
+  # end
+  # 
+  def html()
+    render :text=>@content, :layout=>false, :content_type=>Mime::HTML
+    @content = nil
+  end
+
+  def rjs()
+    update = @update
+    render :update do |page|
+      update.call page
+    end
+    @update = nil
+  end
+
+  def xml()
+    render :text=>@content, :layout=>false, :content_type=>Mime::XML
+    @content = nil
+  end
+
+  def rescue_action(e)
+    raise e
+  end
+
+end
+
+class AssertSelectMailer < ActionMailer::Base
+
+  def test(html)
+    recipients "test <te...@test.host>"
+    from "test@test.host"
+    subject "Test e-mail"
+    part :content_type=>"text/html", :body=>html
+  end
+
+end
+
+module AssertSelectSpecHelpers
+  def render_html(html)
+    @controller.response = html
+    get :html
+  end
+
+  def render_rjs(&block)
+    clear_response
+    @controller.response &block
+    get :rjs
+  end
+
+  def render_xml(xml)
+    @controller.response = xml
+    get :xml
+  end
+  
+  def first_non_rspec_line_in_backtrace_of(error)
+    rspec_path = File.join('rspec', 'lib', 'spec')
+    error.backtrace.reject { |line|
+      line =~ /#{rspec_path}/
+    }.first
+  end
+
+  private
+    # necessary for 1.2.1
+    def clear_response
+      render_html("")
+    end
+end
+
+unless defined?(SpecFailed)
+  SpecFailed = Spec::Expectations::ExpectationNotMetError 
+end
+
+describe "should have_tag", :type => :controller do
+  include AssertSelectSpecHelpers
+  controller_name :assert_select
+  integrate_views
+
+  it "should find specific numbers of elements" do
+    render_html %Q{<div id="1"></div><div id="2"></div>}
+    response.should have_tag( "div" )
+    response.should have_tag("div", 2)
+    lambda { response.should_not have_tag("div") }.should raise_error(SpecFailed, "should not have tag(\"div\"), but did")
+
+    lambda { response.should have_tag("div", 3) }.should raise_error(SpecFailed)
+    lambda { response.should have_tag("p") }.should raise_error(SpecFailed)
+  end
+
+  it "should expect to find elements when using true" do
+    render_html %Q{<div id="1"></div><div id="2"></div>}
+    response.should have_tag( "div", true )
+    lambda { response.should have_tag( "p", true )}.should raise_error(SpecFailed)
+  end
+
+  it "should expect to not find elements when using false" do
+    render_html %Q{<div id="1"></div><div id="2"></div>}
+    response.should have_tag( "p", false )
+    lambda { response.should have_tag( "div", false )}.should raise_error(SpecFailed)
+  end
+
+
+  it "should match submitted text using text or regexp" do
+    render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
+    response.should have_tag("div", "foo")
+    response.should have_tag("div", /(foo|bar)/)
+    response.should have_tag("div", :text=>"foo")
+    response.should have_tag("div", :text=>/(foo|bar)/)
+
+    lambda { response.should have_tag("div", "bar") }.should raise_error(SpecFailed)
+    lambda { response.should have_tag("div", :text=>"bar") }.should raise_error(SpecFailed)
+    lambda { response.should have_tag("p", :text=>"foo") }.should raise_error(SpecFailed)
+
+    lambda { response.should have_tag("div", /foobar/) }.should raise_error(SpecFailed)
+    lambda { response.should have_tag("div", :text=>/foobar/) }.should raise_error(SpecFailed)
+    lambda { response.should have_tag("p", :text=>/foo/) }.should raise_error(SpecFailed)
+  end
+  
+  it "should use submitted message" do
+    render_html %Q{nothing here}
+    lambda {
+      response.should have_tag("div", {}, "custom message")
+    }.should raise_error(SpecFailed, /custom message/)
+  end
+
+  it "should match submitted html" do
+    render_html %Q{<p>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</p>}
+    text = "\"This is not a big problem,\" he said."
+    html = "<em>\"This is <strong>not</strong> a big problem,\"</em> he said."
+    response.should have_tag("p", text)
+    lambda { response.should have_tag("p", html) }.should raise_error(SpecFailed)
+    response.should have_tag("p", :html=>html)
+    lambda { response.should have_tag("p", :html=>text) }.should raise_error(SpecFailed)
+
+    # # No stripping for pre.
+    render_html %Q{<pre>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</pre>}
+    text = "\n\"This is not a big problem,\" he said.\n"
+    html = "\n<em>\"This is <strong>not</strong> a big problem,\"</em> he said.\n"
+    response.should have_tag("pre", text)
+    lambda { response.should have_tag("pre", html) }.should raise_error(SpecFailed)
+    response.should have_tag("pre", :html=>html)
+    lambda { response.should have_tag("pre", :html=>text) }.should raise_error(SpecFailed)
+  end
+
+  it "should match number of instances" do
+    render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
+    response.should have_tag("div", 2)
+    lambda { response.should have_tag("div", 3) }.should raise_error(SpecFailed)
+    response.should have_tag("div", 1..2)
+    lambda { response.should have_tag("div", 3..4) }.should raise_error(SpecFailed)
+    response.should have_tag("div", :count=>2)
+    lambda { response.should have_tag("div", :count=>3) }.should raise_error(SpecFailed)
+    response.should have_tag("div", :minimum=>1)
+    response.should have_tag("div", :minimum=>2)
+    lambda { response.should have_tag("div", :minimum=>3) }.should raise_error(SpecFailed)
+    response.should have_tag("div", :maximum=>2)
+    response.should have_tag("div", :maximum=>3)
+    lambda { response.should have_tag("div", :maximum=>1) }.should raise_error(SpecFailed)
+    response.should have_tag("div", :minimum=>1, :maximum=>2)
+    lambda { response.should have_tag("div", :minimum=>3, :maximum=>4) }.should raise_error(SpecFailed)
+  end
+
+  it "substitution values" do
+    render_html %Q{<div id="1">foo</div><div id="2">foo</div><span id="3"></span>}
+    response.should have_tag("div#?", /\d+/) do |elements| #using do/end
+      elements.size.should == 2
+    end
+    response.should have_tag("div#?", /\d+/) { |elements| #using {}
+      elements.size.should == 2
+    }
+    lambda {
+      response.should have_tag("div#?", /\d+/) do |elements|
+        elements.size.should == 3
+      end
+    }.should raise_error(SpecFailed, "expected: 3,\n     got: 2 (using ==)")
+    
+    lambda {
+      response.should have_tag("div#?", /\d+/) { |elements|
+        elements.size.should == 3
+      }
+    }.should raise_error(SpecFailed, "expected: 3,\n     got: 2 (using ==)")
+
+    response.should have_tag("div#?", /\d+/) do |elements|
+      elements.size.should == 2
+      with_tag("#1")
+      with_tag("#2")
+      without_tag("#3")
+    end 
+  end
+  
+  #added for RSpec
+  it "nested tags in form" do
+    render_html %Q{
+      <form action="test">
+        <input type="text" name="email">
+      </form>
+      <form action="other">
+        <input type="text" name="other_input">
+      </form>
+    }
+    response.should have_tag("form[action=test]") { |form|
+      with_tag("input[type=text][name=email]")
+    }
+    response.should have_tag("form[action=test]") { |form|
+      with_tag("input[type=text][name=email]")
+    }
+    
+    lambda {
+      response.should have_tag("form[action=test]") { |form|
+        with_tag("input[type=text][name=other_input]")
+      }
+    }.should raise_error(SpecFailed)
+    
+    lambda {
+      response.should have_tag("form[action=test]") {
+        with_tag("input[type=text][name=other_input]")
+      }
+    }.should raise_error(SpecFailed)
+  end
+  
+  it "should report the correct line number for a nested failed expectation" do
+    render_html %Q{
+      <form action="test">
+        <input type="text" name="email">
+      </form>
+    }
+    begin
+      response.should have_tag("form[action=test]") {
+        @expected_error_line = __LINE__; should have_tag("input[type=text][name=other_input]")
+      }
+    rescue => e
+      first_non_rspec_line_in_backtrace_of(e).should =~ 
+        /#{File.basename(__FILE__)}:#{@expected_error_line}/
+    else
+      fail
+    end
+  end
+
+  it "should report the correct line number for a nested raised exception" do
+    render_html %Q{
+      <form action="test">
+        <input type="text" name="email">
+      </form>
+    }
+    begin
+      response.should have_tag("form[action=test]") {
+        @expected_error_line = __LINE__; raise "Failed!"
+      }
+    rescue => e
+      first_non_rspec_line_in_backtrace_of(e).should =~ 
+        /#{File.basename(__FILE__)}:#{@expected_error_line}/
+    else
+      fail
+    end
+  end
+
+  it "should report the correct line number for a nested failed test/unit assertion" do
+    pending "Doesn't work at the moment. Do we want to support this?" do
+      render_html %Q{
+        <form action="test">
+          <input type="text" name="email">
+        </form>
+      }
+      begin
+        response.should have_tag("form[action=test]") {
+          @expected_error_line = __LINE__; assert false
+        }
+      rescue => e
+        first_non_rspec_line_in_backtrace_of(e).should =~
+          /#{File.basename(__FILE__)}:#{@expected_error_line}/
+      else
+        fail
+      end
+    end
+  end
+
+  
+  it "beatles" do
+    unless defined?(BEATLES)
+      BEATLES = [
+        ["John", "Guitar"],
+        ["George", "Guitar"],
+        ["Paul", "Bass"],
+        ["Ringo", "Drums"]
+      ]
+    end
+
+    render_html %Q{
+      <div id="beatles">
+        <div class="beatle">
+          <h2>John</h2><p>Guitar</p>
+        </div>
+        <div class="beatle">
+          <h2>George</h2><p>Guitar</p>
+        </div>
+        <div class="beatle">
+          <h2>Paul</h2><p>Bass</p>
+        </div>
+        <div class="beatle">
+          <h2>Ringo</h2><p>Drums</p>
+        </div>
+      </div>          
+    }
+    response.should have_tag("div#beatles>div[class=\"beatle\"]", 4)
+
+    response.should have_tag("div#beatles>div.beatle") {
+      BEATLES.each { |name, instrument|
+        with_tag("div.beatle>h2", name)
+        with_tag("div.beatle>p", instrument)
+        without_tag("div.beatle>span")
+      }
+    }
+  end
+
+  it "assert_select_text_match" do
+    render_html %Q{<div id="1"><span>foo</span></div><div id="2"><span>bar</span></div>}
+    response.should have_tag("div") do |divs|
+      with_tag("div", "foo")
+      with_tag("div", "bar")
+      with_tag("div", /\w*/)
+      with_tag("div", /\w*/, :count=>2)
+      without_tag("div", :text=>"foo", :count=>2)
+      with_tag("div", :html=>"<span>bar</span>")
+      with_tag("div", :html=>"<span>bar</span>")
+      with_tag("div", :html=>/\w*/)
+      with_tag("div", :html=>/\w*/, :count=>2)
+      without_tag("div", :html=>"<span>foo</span>", :count=>2)
+    end
+  end
+
+
+  it "assert_select_from_rjs with one item" do
+    render_rjs do |page|
+      page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
+    end
+    response.should have_tag("div") { |elements|
+      elements.size.should == 2
+      with_tag("#1")
+      with_tag("#2")
+    }
+    
+    lambda {
+      response.should have_tag("div") { |elements|
+        elements.size.should == 2
+        with_tag("#1")
+        with_tag("#3")
+      }
+    }.should raise_error(SpecFailed)
+
+    lambda {
+      response.should have_tag("div") { |elements|
+        elements.size.should == 2
+        with_tag("#1")
+        without_tag("#2")
+      }
+    }.should raise_error(SpecFailed, "should not have tag(\"#2\"), but did")
+
+    lambda {
+      response.should have_tag("div") { |elements|
+        elements.size.should == 3
+        with_tag("#1")
+        with_tag("#2")
+      }
+    }.should raise_error(SpecFailed)
+
+
+    response.should have_tag("div#?", /\d+/) { |elements|
+      with_tag("#1")
+      with_tag("#2")
+    }
+  end
+  
+  it "assert_select_from_rjs with multiple items" do
+    render_rjs do |page|
+      page.replace_html "test", "<div id=\"1\">foo</div>"
+      page.replace_html "test2", "<div id=\"2\">foo</div>"
+    end
+    response.should have_tag("div")
+    response.should have_tag("div") { |elements|
+      elements.size.should == 2
+      with_tag("#1")
+      with_tag("#2")
+    }
+
+    lambda {
+      response.should have_tag("div") { |elements|
+        with_tag("#3")
+      }
+    }.should raise_error(SpecFailed)
+  end
+end
+
+describe "css_select", :type => :controller do
+  include AssertSelectSpecHelpers
+  controller_name :assert_select
+  integrate_views
+
+  it "can select tags from html" do
+    render_html %Q{<div id="1"></div><div id="2"></div>}
+    css_select("div").size.should == 2
+    css_select("p").size.should == 0
+  end
+
+
+  it "can select nested tags from html" do
+    render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
+    response.should have_tag("div#?", /\d+/) { |elements|
+      css_select(elements[0], "div").should have(1).element
+      css_select(elements[1], "div").should have(1).element
+    }
+    response.should have_tag("div") {
+      css_select("div").should have(2).elements
+      css_select("div").each { |element|
+        # Testing as a group is one thing
+        css_select("#1,#2").should have(2).elements
+        # Testing individually is another
+        css_select("#1").should have(1).element
+        css_select("#2").should have(1).element
+      }
+    }
+  end
+
+  it "can select nested tags from rjs (one result)" do
+    render_rjs do |page|
+      page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
+    end
+    css_select("div").should have(2).elements
+    css_select("#1").should have(1).element
+    css_select("#2").should have(1).element
+  end
+
+  it "can select nested tags from rjs (two results)" do
+    render_rjs do |page|
+      page.replace_html "test", "<div id=\"1\">foo</div>"
+      page.replace_html "test2", "<div id=\"2\">foo</div>"
+    end
+    css_select("div").should have(2).elements
+    css_select("#1").should have(1).element
+    css_select("#2").should have(1).element
+  end
+  
+end
+
+describe "have_rjs behaviour_type", :type => :controller do
+  include AssertSelectSpecHelpers
+  controller_name :assert_select
+  integrate_views
+
+  before(:each) do
+    render_rjs do |page|
+      page.replace "test1", "<div id=\"1\">foo</div>"
+      page.replace_html "test2", "<div id=\"2\">bar</div><div id=\"3\">none</div>"
+      page.insert_html :top, "test3", "<div id=\"4\">loopy</div>"
+      page.hide "test4"
+      page["test5"].hide
+    end
+  end
+  
+  it "should pass if any rjs exists" do
+    response.should have_rjs
+  end
+  
+  it "should fail if no rjs exists" do
+    render_rjs do |page|
+    end
+    lambda do
+      response.should have_rjs
+    end.should raise_error(SpecFailed)
+  end
+  
+  it "should find all rjs from multiple statements" do
+    response.should have_rjs do
+      with_tag("#1")
+      with_tag("#2")
+      with_tag("#3")
+      # with_tag("#4")
+      # with_tag("#5")
+    end
+  end
+
+  it "should find by id" do
+    response.should have_rjs("test1") { |rjs|
+      rjs.size.should == 1
+      with_tag("div", 1)
+      with_tag("div#1", "foo")
+    }
+    
+    lambda do
+      response.should have_rjs("test1") { |rjs|
+        rjs.size.should == 1
+        without_tag("div#1", "foo")
+      }
+    end.should raise_error(SpecFailed, "should not have tag(\"div#1\", \"foo\"), but did")
+
+    response.should have_rjs("test2") { |rjs|
+      rjs.size.should == 2
+      with_tag("div", 2)
+      with_tag("div#2", "bar")
+      with_tag("div#3", "none")
+    }
+    # response.should have_rjs("test4")
+    # response.should have_rjs("test5")
+  end
+  
+  # specify "should find rjs using :hide" do
+  #   response.should have_rjs(:hide)
+  #   response.should have_rjs(:hide, "test4")
+  #   response.should have_rjs(:hide, "test5")
+  #   lambda do
+  #     response.should have_rjs(:hide, "test3")
+  #   end.should raise_error(SpecFailed)
+  # end
+
+  it "should find rjs using :replace" do
+    response.should have_rjs(:replace) { |rjs|
+      with_tag("div", 1)
+      with_tag("div#1", "foo")
+    }
+    response.should have_rjs(:replace, "test1") { |rjs|
+      with_tag("div", 1)
+      with_tag("div#1", "foo")
+    }
+    lambda {
+      response.should have_rjs(:replace, "test2")
+    }.should raise_error(SpecFailed)
+
+    lambda {
+      response.should have_rjs(:replace, "test3")
+    }.should raise_error(SpecFailed)
+  end
+
+  it "should find rjs using :replace_html" do
+    response.should have_rjs(:replace_html) { |rjs|
+      with_tag("div", 2)
+      with_tag("div#2", "bar")
+      with_tag("div#3", "none")
+    }
+
+    response.should have_rjs(:replace_html, "test2") { |rjs|
+      with_tag("div", 2)
+      with_tag("div#2", "bar")
+      with_tag("div#3", "none")
+    }
+
+    lambda {
+      response.should have_rjs(:replace_html, "test1")
+    }.should raise_error(SpecFailed)
+
+    lambda {
+      response.should have_rjs(:replace_html, "test3")
+    }.should raise_error(SpecFailed)
+  end
+    
+  it "should find rjs using :insert_html (non-positioned)" do
+    response.should have_rjs(:insert_html) { |rjs|
+      with_tag("div", 1)
+      with_tag("div#4", "loopy")
+    }
+
+    response.should have_rjs(:insert_html, "test3") { |rjs|
+      with_tag("div", 1)
+      with_tag("div#4", "loopy")
+    }
+
+    lambda {
+      response.should have_rjs(:insert_html, "test1")
+    }.should raise_error(SpecFailed)
+
+    lambda {
+      response.should have_rjs(:insert_html, "test2")
+    }.should raise_error(SpecFailed)
+  end
+
+  it "should find rjs using :insert (positioned)" do
+    render_rjs do |page|
+      page.insert_html :top, "test1", "<div id=\"1\">foo</div>"
+      page.insert_html :bottom, "test2", "<div id=\"2\">bar</div>"
+      page.insert_html :before, "test3", "<div id=\"3\">none</div>"
+      page.insert_html :after, "test4", "<div id=\"4\">loopy</div>"
+    end
+    response.should have_rjs(:insert, :top) do
+      with_tag("div", 1)
+      with_tag("#1")
+    end
+    response.should have_rjs(:insert, :top, "test1") do
+      with_tag("div", 1)
+      with_tag("#1")
+    end
+    lambda {
+      response.should have_rjs(:insert, :top, "test2")
+    }.should raise_error(SpecFailed)
+    response.should have_rjs(:insert, :bottom) {|rjs|
+      with_tag("div", 1)
+      with_tag("#2")
+    }
+    response.should have_rjs(:insert, :bottom, "test2") {|rjs|
+      with_tag("div", 1)
+      with_tag("#2")
+    }
+    response.should have_rjs(:insert, :before) {|rjs|
+      with_tag("div", 1)
+      with_tag("#3")
+    }
+    response.should have_rjs(:insert, :before, "test3") {|rjs|
+      with_tag("div", 1)
+      with_tag("#3")
+    }
+    response.should have_rjs(:insert, :after) {|rjs|
+      with_tag("div", 1)
+      with_tag("#4")
+    }
+    response.should have_rjs(:insert, :after, "test4") {|rjs|
+      with_tag("div", 1)
+      with_tag("#4")
+    }
+  end
+end
+
+describe "send_email behaviour_type", :type => :controller do
+  include AssertSelectSpecHelpers
+  controller_name :assert_select
+  integrate_views
+
+  before(:each) do
+    ActionMailer::Base.delivery_method = :test
+    ActionMailer::Base.perform_deliveries = true
+    ActionMailer::Base.deliveries = []
+  end
+
+  after(:each) do
+    ActionMailer::Base.deliveries.clear
+  end
+
+  it "should fail with nothing sent" do
+    response.should_not send_email
+    lambda {
+      response.should send_email{}
+    }.should raise_error(SpecFailed, /No e-mail in delivery list./)
+  end
+  
+  it "should pass otherwise" do
+    AssertSelectMailer.deliver_test "<div><p>foo</p><p>bar</p></div>"
+    response.should send_email
+    lambda {
+      response.should_not send_email
+    }.should raise_error(SpecFailed)
+    response.should send_email{}
+    response.should send_email {
+      with_tag("div:root") {
+        with_tag("p:first-child", "foo")
+        with_tag("p:last-child", "bar")
+      }
+    }
+    
+    lambda {
+      response.should_not send_email
+    }.should raise_error(SpecFailed, "should not send email, but did")
+  end
+
+end
+
+# describe "An rjs call to :visual_effect, a 'should have_rjs' spec with",
+#   :type => :view do
+#     
+#   before do
+#     render 'rjs_spec/visual_effect'
+#   end
+# 
+#   it "should pass with the correct element name" do
+#     response.should have_rjs(:effect, :fade, 'mydiv')
+#   end
+#   
+#   it "should fail the wrong element name" do
+#     lambda {
+#       response.should have_rjs(:effect, :fade, 'wrongname')
+#     }.should raise_error(SpecFailed)
+#   end
+#   
+#   it "should fail with the correct element but the wrong command" do
+#     lambda {
+#       response.should have_rjs(:effect, :puff, 'mydiv')
+#     }.should raise_error(SpecFailed)
+#   end
+#   
+# end
+#   
+# describe "An rjs call to :visual_effect for a toggle, a 'should have_rjs' spec with",
+#   :type => :view do
+#     
+#   before do
+#     render 'rjs_spec/visual_toggle_effect'
+#   end
+#   
+#   it "should pass with the correct element name" do
+#     response.should have_rjs(:effect, :toggle_blind, 'mydiv')
+#   end
+#   
+#   it "should fail with the wrong element name" do
+#     lambda {
+#       response.should have_rjs(:effect, :toggle_blind, 'wrongname')
+#     }.should raise_error(SpecFailed)
+#   end
+#   
+#   it "should fail the correct element but the wrong command" do
+#     lambda {
+#       response.should have_rjs(:effect, :puff, 'mydiv')
+#     }.should raise_error(SpecFailed)
+#   end
+#   
+# end
+
+describe "string.should have_tag", :type => :helper do
+  include AssertSelectSpecHelpers
+
+  it "should find root element" do
+    "<p>a paragraph</p>".should have_tag("p", "a paragraph")
+  end
+
+  it "should not find non-existent element" do
+    lambda do
+      "<p>a paragraph</p>".should have_tag("p", "wrong text")
+    end.should raise_error(SpecFailed)
+  end
+
+  it "should find child element" do
+    "<div><p>a paragraph</p></div>".should have_tag("p", "a paragraph")
+  end
+
+  it "should find nested element" do
+    "<div><p>a paragraph</p></div>".should have_tag("div") do
+      with_tag("p", "a paragraph")
+    end
+  end
+
+  it "should not find wrong nested element" do
+    lambda do
+      "<div><p>a paragraph</p></div>".should have_tag("div") do
+        with_tag("p", "wrong text")
+      end
+    end.should raise_error(SpecFailed)
+  end
+end
+
+describe "have_tag", :type => :controller do
+  include AssertSelectSpecHelpers
+  controller_name :assert_select
+  integrate_views
+
+  it "should work exactly the same as assert_select" do
+    render_html %Q{
+      <div id="wrapper">foo
+        <div class="piece">
+          <h3>Text</h3>
+        </div>
+        <div class="piece">
+          <h3>Another</h3>
+        </div>      
+      </div>
+    }
+
+    assert_select "#wrapper .piece h3", :text => "Text"
+    assert_select "#wrapper .piece h3", :text => "Another"
+
+    response.should have_tag("#wrapper .piece h3", :text => "Text")
+    response.should have_tag("#wrapper .piece h3", :text => "Another")
+  end
+end
+

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/description_generation_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/description_generation_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/description_generation_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/description_generation_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,37 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+class DescriptionGenerationSpecController < ActionController::Base
+  def render_action
+  end
+
+  def redirect_action
+    redirect_to :action => :render_action
+  end
+end
+
+describe "Description generation", :type => :controller do
+  controller_name :description_generation_spec
+  
+  after(:each) do
+    Spec::Matchers.clear_generated_description
+  end
+
+  it "should generate description for render_template" do
+    get 'render_action'
+    response.should render_template("render_action")
+    Spec::Matchers.generated_description.should == "should render template \"render_action\""
+  end
+
+  it "should generate description for render_template with full path" do
+    get 'render_action'
+    response.should render_template("description_generation_spec/render_action")
+    Spec::Matchers.generated_description.should == "should render template \"description_generation_spec/render_action\""
+  end
+
+  it "should generate description for redirect_to" do
+    get 'redirect_action'
+    response.should redirect_to("http://test.host/description_generation_spec/render_action")
+    Spec::Matchers.generated_description.should == "should redirect to \"http://test.host/description_generation_spec/render_action\""
+  end
+
+end

Added: ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/errors_on_spec.rb
URL: http://svn.apache.org/viewvc/ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/errors_on_spec.rb?rev=652957&view=auto
==============================================================================
--- ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/errors_on_spec.rb (added)
+++ ode/sandbox/singleshot/vendor/plugins/rspec_on_rails/spec/rails/matchers/errors_on_spec.rb Fri May  2 17:14:01 2008
@@ -0,0 +1,13 @@
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe "error_on" do
+  it "should provide a message including the name of what the error is on" do
+    have(1).error_on(:whatever).description.should == "should have 1 error on :whatever"
+  end
+end
+
+describe "errors_on" do
+  it "should provide a message including the name of what the error is on" do
+    have(2).errors_on(:whatever).description.should == "should have 2 errors on :whatever"
+  end
+end