Added Rspec and Webrat plugins and started porting Selenium on Rails tests to Rspec Plain Text Stories driving Webrat driving Selenium.

This commit is contained in:
Luke Melia 2008-06-18 02:57:57 -04:00 committed by Simon Rozet
parent 7b432a74ed
commit 2c09db45c5
602 changed files with 47788 additions and 29 deletions

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,60 @@
require File.dirname(__FILE__) + '/../../spec_helper'
describe "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
it "should sets an instance var" do
@proxy['foo'] = 'bar'
@object.instance_eval { @foo }.should == 'bar'
end
end

View file

@ -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

View file

@ -0,0 +1,62 @@
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
error = defined?(ActionController::MissingTemplate) ? ActionController::MissingTemplate : ActionView::MissingTemplate
lambda { get 'some_action' }.should raise_error(error)
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
describe "nested" do
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
describe "with integrate_views turned off" do
integrate_views false
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
end
end
end

View file

@ -0,0 +1,206 @@
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 keep the same data in the session before and after the action" do
session[:foo] = :bar
get 'action_with_template'
session[:foo].should == :bar
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'
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_which_sets_flash'
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
session[:session_key] = "session value"
lambda do
get 'action_which_gets_session', :expected => "session value"
end.should_not raise_error
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
controller.extend Spec::Mocks::Methods
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
describe "A controller spec with controller_name set", :type => :controller do
controller_name :controller_spec
describe "nested" do
it "should inherit the controller name" do
get 'action_with_template'
response.should be_success
end
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

View file

@ -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

View file

@ -0,0 +1,161 @@
require File.dirname(__FILE__) + '/../../spec_helper'
Spec::Runner.configuration.global_fixtures = :people
describe ExplicitHelper, :type => :helper do
include ExplicitHelper
it "should not require naming the helper if describe is passed a type" do
method_in_explicit_helper.should match(/text from a method/)
helper.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 "DEPRECATED should have direct access to methods defined in helpers" do
method_in_explicit_helper.should =~ /text from a method/
end
it "should expose the helper with the #helper method" do
helper.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"
helper.named_url.should == "http://test.host/rspec_on_rails_specs"
helper.named_path.should == "/rspec_on_rails_specs"
end
it "should fail if the helper method deson't exist" do
lambda { non_existent_helper_method }.should raise_error(NameError)
lambda { helper.non_existent_helper_method }.should raise_error(NameError)
end
it "should have access to session" do
session[:foo] = 'bar'
session_foo.should == 'bar'
helper.session_foo.should == 'bar'
end
it "should have access to params" do
params[:foo] = 'bar'
params_foo.should == 'bar'
helper.params_foo.should == 'bar'
end
it "should have access to request" do
request.stub!(:thing).and_return('bar')
request_thing.should == 'bar'
helper.request_thing.should == 'bar'
end
it "should have access to flash" do
flash[:thing] = 'camera'
flash_thing.should == 'camera'
helper.flash_thing.should == 'camera'
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 "methods from standard helpers", :type => :helper do
helper_name :explicit
it "should be exposed to the helper" do
helper.link_to("Foo","http://bar").should have_tag("a")
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)
helper.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
helper.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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,272 @@
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
it "should have a controller param" do
response.should have_tag("div#controller", "view_spec")
end
it "should have an action param" do
response.should have_tag("div#action", "accessor")
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
describe "render :inline => ...", :type => :view do
it "should render ERB right in the spec" do
render :inline => %|<%= text_field_tag('field_name', 'Value') %>|
response.should have_tag("input[type=?][name=?][value=?]","text","field_name","Value")
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
group = describe("base_view_path_cleared flag", :type => :view) {}
example = group.it{}
ActionView::Base.should_receive(:base_view_path=).with(nil)
group.run_after_each(example)
end
end
end
end
end

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,806 @@
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 <test@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
describe 'selecting in HTML that contains a mock with null_object' do
module HTML
class Document
def initialize_with_strict_error_checking(text, strict=false, xml=false)
initialize_without_strict_error_checking(text, true, xml)
end
alias_method :initialize_without_strict_error_checking, :initialize
alias_method :initialize, :initialize_with_strict_error_checking
end
end
describe 'modified HTML::Document' do
it 'should raise error on valid HTML even though false is specified' do
lambda {HTML::Document.new("<b>#<Spec::Mocks::Mock:0x267b4f0></b>", false, false)}.should raise_error
end
end
it 'should not print errors from assert_select' do
mock = mock("Dog", :null_object => true)
html = "<b>#{mock.colour}</b>"
lambda {html.should have_tag('b')}.should_not raise_error
end
end

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,62 @@
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
describe "have_text" do
describe "where target is a Regexp" do
it 'should should match submitted text using a regexp' do
string = 'foo'
string.should have_text(/fo*/)
end
end
describe "where target is a String" do
it 'should match submitted text using a string' do
string = 'foo'
string.should have_text('foo')
end
end
end
describe "have_text",
:type => :controller do
['isolation','integration'].each do |mode|
if mode == 'integration'
integrate_views
end
describe "where target is a response (in #{mode} mode)" do
controller_name :render_spec
it "should pass with exactly matching text" do
post 'text_action'
response.should have_text("this is the text for this action")
end
it "should pass with matching text (using Regexp)" do
post 'text_action'
response.should have_text(/is the text/)
end
it "should fail with matching text" do
post 'text_action'
lambda {
response.should have_text("this is NOT the text for this action")
}.should fail_with("expected \"this is NOT the text for this action\", got \"this is the text for this action\"")
end
it "should fail when a template is rendered" do
post 'some_action'
lambda {
response.should have_text("this is the text for this action")
}.should fail_with(/expected \"this is the text for this action\", got .*/)
end
it "should pass using should_not with incorrect text" do
post 'text_action'
response.should_not have_text("the accordian guy")
end
end
end
end

View file

@ -0,0 +1,70 @@
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
describe "include_text" do
describe "where target is a String" do
it 'should match submitted text using a string' do
string = 'foo'
string.should include_text('foo')
end
it 'should match if the text is contained' do
string = 'I am a big piece of text'
string.should include_text('big piece')
end
it 'should not match if text is not contained' do
string = 'I am a big piece of text'
string.should_not include_text('corey')
end
end
end
describe "include_text", :type => :controller do
['isolation','integration'].each do |mode|
if mode == 'integration'
integrate_views
end
describe "where target is a response (in #{mode} mode)" do
controller_name :render_spec
it "should pass with exactly matching text" do
post 'text_action'
response.should include_text("this is the text for this action")
end
it 'should pass with substring matching text' do
post 'text_action'
response.should include_text('text for this')
end
it "should fail with matching text" do
post 'text_action'
lambda {
response.should include_text("this is NOT the text for this action")
}.should fail_with("expected to find \"this is NOT the text for this action\" in \"this is the text for this action\"")
end
it "should fail when a template is rendered" do
post 'some_action'
failure_message = case mode
when 'isolation'
/expected to find \"this is the text for this action\" in \"render_spec\/some_action\"/
when 'integration'
/expected to find \"this is the text for this action\" in \"\"/
end
lambda {
response.should include_text("this is the text for this action")
}.should fail_with(failure_message)
end
it "should pass using should_not with incorrect text" do
post 'text_action'
response.should_not include_text("the accordian guy")
end
end
end
end

View file

@ -0,0 +1,209 @@
require File.dirname(__FILE__) + '/../../spec_helper'
['isolation','integration'].each do |mode|
describe "redirect_to behaviour", :type => :controller do
if mode == 'integration'
integrate_views
end
controller_name :redirect_spec
it "redirected to another action" do
get 'action_with_redirect_to_somewhere'
response.should redirect_to(:action => 'somewhere')
end
it "redirected to another controller and action" do
get 'action_with_redirect_to_other_somewhere'
response.should redirect_to(:controller => 'render_spec', :action => 'text_action')
end
it "redirected to another action (with 'and return')" do
get 'action_with_redirect_to_somewhere_and_return'
response.should redirect_to(:action => 'somewhere')
end
it "redirected from an SSL action to a non-SSL action" do
request.stub!(:ssl?).and_return true
get 'action_with_redirect_to_somewhere'
response.should redirect_to(:action => 'somewhere')
end
it "redirected to correct path with leading /" do
get 'action_with_redirect_to_somewhere'
response.should redirect_to('/redirect_spec/somewhere')
end
it "redirected to correct path without leading /" do
get 'action_with_redirect_to_somewhere'
response.should redirect_to('redirect_spec/somewhere')
end
it "redirected to correct internal URL" do
get 'action_with_redirect_to_somewhere'
response.should redirect_to("http://test.host/redirect_spec/somewhere")
end
it "redirected to correct external URL" do
get 'action_with_redirect_to_rspec_site'
response.should redirect_to("http://rspec.rubyforge.org")
end
it "redirected :back" do
request.env['HTTP_REFERER'] = "http://test.host/previous/page"
get 'action_with_redirect_back'
response.should redirect_to(:back)
end
it "redirected :back and should redirect_to URL matches" do
request.env['HTTP_REFERER'] = "http://test.host/previous/page"
get 'action_with_redirect_back'
response.should redirect_to("http://test.host/previous/page")
end
it "redirected from within a respond_to block" do
get 'action_with_redirect_in_respond_to'
response.should redirect_to('redirect_spec/somewhere')
end
params_as_hash = {:action => "somewhere", :id => 1111, :param1 => "value1", :param2 => "value2"}
it "redirected to an internal URL containing a query string" do
get "action_with_redirect_which_creates_query_string"
response.should redirect_to(params_as_hash)
end
it "redirected to an internal URL containing a query string, one way it might be generated" do
get "action_with_redirect_with_query_string_order1"
response.should redirect_to(params_as_hash)
end
it "redirected to an internal URL containing a query string, another way it might be generated" do
get "action_with_redirect_with_query_string_order2"
response.should redirect_to(params_as_hash)
end
it "redirected to an internal URL which is unroutable but matched via a string" do
get "action_with_redirect_to_unroutable_url_inside_app"
response.should redirect_to("http://test.host/nonexistant/none")
end
end
describe "redirect_to with a controller spec in #{mode} mode and a custom request.host", :type => :controller do
if mode == 'integration'
integrate_views
end
controller_name :redirect_spec
before do
request.host = "some.custom.host"
end
it "should pass when redirected to another action" do
get 'action_with_redirect_to_somewhere'
response.should redirect_to(:action => 'somewhere')
end
end
describe "Given a controller spec in #{mode} mode", :type => :controller do
if mode == 'integration'
integrate_views
end
controller_name :redirect_spec
it "an action that redirects should not result in an error if no should redirect_to expectation is called" do
get 'action_with_redirect_to_somewhere'
end
it "an action that redirects should not result in an error if should_not redirect_to expectation was called, but not to that action" do
get 'action_with_redirect_to_somewhere'
response.should_not redirect_to(:action => 'another_destination')
end
it "an action that redirects should result in an error if should_not redirect_to expectation was called to that action" do
get 'action_with_redirect_to_somewhere'
lambda {
response.should_not redirect_to(:action => 'somewhere')
}.should fail_with("expected not to be redirected to {:action=>\"somewhere\"}, but was")
end
it "an action that does not redirects should not result in an error if should_not redirect_to expectation was called" do
get 'action_with_no_redirect'
response.should_not redirect_to(:action => 'any_destination')
end
end
describe "Given a controller spec in #{mode} mode, should redirect_to should fail when", :type => :controller do
if mode == 'integration'
integrate_views
end
controller_name :redirect_spec
it "redirected to wrong action" do
get 'action_with_redirect_to_somewhere'
lambda {
response.should redirect_to(:action => 'somewhere_else')
}.should fail_with("expected redirect to {:action=>\"somewhere_else\"}, got redirect to \"http://test.host/redirect_spec/somewhere\"")
end
it "redirected to incorrect path with leading /" do
get 'action_with_redirect_to_somewhere'
lambda {
response.should redirect_to('/redirect_spec/somewhere_else')
}.should fail_with('expected redirect to "/redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
end
it "redirected to incorrect path without leading /" do
get 'action_with_redirect_to_somewhere'
lambda {
response.should redirect_to('redirect_spec/somewhere_else')
}.should fail_with('expected redirect to "redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
end
it "redirected to incorrect internal URL (based on the action)" do
get 'action_with_redirect_to_somewhere'
lambda {
response.should redirect_to("http://test.host/redirect_spec/somewhere_else")
}.should fail_with('expected redirect to "http://test.host/redirect_spec/somewhere_else", got redirect to "http://test.host/redirect_spec/somewhere"')
end
it "redirected to wrong external URL" do
get 'action_with_redirect_to_rspec_site'
lambda {
response.should redirect_to("http://test.unit.rubyforge.org")
}.should fail_with('expected redirect to "http://test.unit.rubyforge.org", got redirect to "http://rspec.rubyforge.org"')
end
it "redirected to incorrect internal URL (based on the directory path)" do
get 'action_with_redirect_to_somewhere'
lambda {
response.should redirect_to("http://test.host/non_existent_controller/somewhere")
}.should fail_with('expected redirect to "http://test.host/non_existent_controller/somewhere", got redirect to "http://test.host/redirect_spec/somewhere"')
end
it "expected redirect :back, but redirected to a new URL" do
get 'action_with_no_redirect'
lambda {
response.should redirect_to(:back)
}.should fail_with('expected redirect to :back, got no redirect')
end
it "no redirect at all" do
get 'action_with_no_redirect'
lambda {
response.should redirect_to(:action => 'nowhere')
}.should fail_with("expected redirect to {:action=>\"nowhere\"}, got no redirect")
end
it "redirected to an internal URL which is unroutable and matched via a hash" do
get "action_with_redirect_to_unroutable_url_inside_app"
route = {:controller => "nonexistant", :action => "none"}
lambda {
response.should redirect_to(route)
}.should raise_error(ActionController::RoutingError, /(no route found to match|No route matches) \"\/nonexistant\/none\" with \{\}/)
end
end
end

View file

@ -0,0 +1,169 @@
require File.dirname(__FILE__) + '/../../spec_helper'
['isolation','integration'].each do |mode|
describe "response.should render_template (in #{mode} mode)",
:type => :controller do
controller_name :render_spec
if mode == 'integration'
integrate_views
end
it "should match a simple path" do
post 'some_action'
response.should render_template('some_action')
end
it "should match a less simple path" do
post 'some_action'
response.should render_template('render_spec/some_action')
end
it "should match a less simple path to another controller" do
post 'action_which_renders_template_from_other_controller'
response.should render_template('controller_spec/action_with_template')
end
it "should match a symbol" do
post 'some_action'
response.should render_template(:some_action)
end
it "should match an rjs template" do
xhr :post, 'some_action'
if Rails::VERSION::STRING < "2.0.0"
response.should render_template('render_spec/some_action.rjs')
else
response.should render_template('render_spec/some_action')
end
end
it "should match a partial template (simple path)" do
get 'action_with_partial'
response.should render_template("_a_partial")
end
it "should match a partial template (complex path)" do
get 'action_with_partial'
response.should render_template("render_spec/_a_partial")
end
it "should fail when the wrong template is rendered" do
post 'some_action'
lambda do
response.should render_template('non_existent_template')
end.should fail_with("expected \"non_existent_template\", got \"render_spec/some_action\"")
end
it "should fail without full path when template is associated with a different controller" do
post 'action_which_renders_template_from_other_controller'
lambda do
response.should render_template('action_with_template')
end.should fail_with(%Q|expected "action_with_template", got "controller_spec/action_with_template"|)
end
it "should fail with incorrect full path when template is associated with a different controller" do
post 'action_which_renders_template_from_other_controller'
lambda do
response.should render_template('render_spec/action_with_template')
end.should fail_with(%Q|expected "render_spec/action_with_template", got "controller_spec/action_with_template"|)
end
it "should fail on the wrong extension (given rhtml)" do
get 'some_action'
lambda {
response.should render_template('render_spec/some_action.rjs')
}.should fail_with("expected \"render_spec/some_action.rjs\", got \"render_spec/some_action\"")
end
it "should fail when TEXT is rendered" do
post 'text_action'
lambda do
response.should render_template('some_action')
end.should fail_with("expected \"some_action\", got nil")
end
end
describe "response.should_not render_template (in #{mode} mode)",
:type => :controller do
controller_name :render_spec
if mode == 'integration'
integrate_views
end
it "should pass when the action renders nothing" do
post 'action_that_renders_nothing'
response.should_not render_template('action_that_renders_nothing')
end
it "should pass when the action renders nothing (symbol)" do
post 'action_that_renders_nothing'
response.should_not render_template(:action_that_renders_nothing)
end
it "should pass when the action does not render the template" do
post 'some_action'
response.should_not render_template('some_other_template')
end
it "should pass when the action does not render the template (symbol)" do
post 'some_action'
response.should_not render_template(:some_other_template)
end
it "should pass when the action does not render the template (named with controller)" do
post 'some_action'
response.should_not render_template('render_spec/some_other_template')
end
it "should pass when the action renders the template with a different controller" do
post 'action_which_renders_template_from_other_controller'
response.should_not render_template('action_with_template')
end
it "should pass when the action renders the template (named with controller) with a different controller" do
post 'action_which_renders_template_from_other_controller'
response.should_not render_template('render_spec/action_with_template')
end
it "should pass when TEXT is rendered" do
post 'text_action'
response.should_not render_template('some_action')
end
it "should fail when the action renders the template" do
post 'some_action'
lambda do
response.should_not render_template('some_action')
end.should fail_with("expected not to render \"some_action\", but did")
end
it "should fail when the action renders the template (symbol)" do
post 'some_action'
lambda do
response.should_not render_template(:some_action)
end.should fail_with("expected not to render \"some_action\", but did")
end
it "should fail when the action renders the template (named with controller)" do
post 'some_action'
lambda do
response.should_not render_template('render_spec/some_action')
end.should fail_with("expected not to render \"render_spec/some_action\", but did")
end
it "should fail when the action renders the partial" do
post 'action_with_partial'
lambda do
response.should_not render_template('_a_partial')
end.should fail_with("expected not to render \"_a_partial\", but did")
end
it "should fail when the action renders the partial (named with controller)" do
post 'action_with_partial'
lambda do
response.should_not render_template('render_spec/_a_partial')
end.should fail_with("expected not to render \"render_spec/_a_partial\", but did")
end
end
end

View file

@ -0,0 +1,10 @@
class MockableModel < ActiveRecord::Base
has_one :associated_model
end
class SubMockableModel < MockableModel
end
class AssociatedModel < ActiveRecord::Base
belongs_to :mockable_model
end

View file

@ -0,0 +1,64 @@
require File.dirname(__FILE__) + '/../../spec_helper'
require File.dirname(__FILE__) + '/ar_classes'
describe "mock_model" do
before(:each) do
@model = mock_model(SubMockableModel)
end
it "should say it is_a? if it is" do
@model.is_a?(SubMockableModel).should be(true)
end
it "should say it is_a? if it's ancestor is" do
@model.is_a?(MockableModel).should be(true)
end
it "should say it is kind_of? if it is" do
@model.kind_of?(SubMockableModel).should be(true)
end
it "should say it is kind_of? if it's ancestor is" do
@model.kind_of?(MockableModel).should be(true)
end
it "should say it is instance_of? if it is" do
@model.instance_of?(SubMockableModel).should be(true)
end
it "should not say it instance_of? if it isn't, even if it's ancestor is" do
@model.instance_of?(MockableModel).should be(false)
end
end
describe "mock_model with stubbed id", :type => :view do
before(:each) do
@model = mock_model(MockableModel, :id => 1)
end
it "should be named using the stubbed id value" do
@model.instance_variable_get(:@name).should == "MockableModel_1"
end
end
describe "mock_model with null_object", :type => :view do
before(:each) do
@model = mock_model(MockableModel, :null_object => true, :mocked_method => "mocked")
end
it "should be able to mock methods" do
@model.mocked_method.should == "mocked"
end
it "should return itself to unmocked methods" do
@model.unmocked_method.should equal(@model)
end
end
describe "mock_model as association", :type => :view do
before(:each) do
@real = AssociatedModel.create!
@mock_model = mock_model(MockableModel)
@real.mockable_model = @mock_model
end
it "should pass associated_model == mock" do
@mock_model.should == @real.mockable_model
end
it "should pass mock == associated_model" do
@real.mockable_model.should == @mock_model
end
end

View file

@ -0,0 +1,79 @@
require File.dirname(__FILE__) + '/../../spec_helper'
require File.dirname(__FILE__) + '/ar_classes'
describe "stub_model" do
describe "defaults" do
it "should have an id" do
stub_model(MockableModel).id.should be > 0
end
it "should say it is not a new record" do
stub_model(MockableModel).should_not be_new_record
end
end
it "should accept a stub id" do
stub_model(MockableModel, :id => 37).id.should == 37
end
it "should say it is a new record when id is set to nil" do
stub_model(MockableModel, :id => nil).should be_new_record
end
it "should accept any arbitrary stub" do
stub_model(MockableModel, :foo => "bar").foo.should == "bar"
end
it "should accept a stub for save" do
stub_model(MockableModel, :save => false).save.should be(false)
end
describe "#as_new_record" do
it "should say it is a new record" do
stub_model(MockableModel).as_new_record.should be_new_record
end
it "should have a nil id" do
stub_model(MockableModel).as_new_record.id.should be(nil)
end
end
it "should raise when hitting the db" do
lambda do
model = stub_model(MockableModel, :changed => true, :attributes_with_quotes => {'this' => 'that'})
model.save
end.should raise_error(Spec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
end
it "should increment the id" do
first = stub_model(MockableModel)
second = stub_model(MockableModel)
second.id.should == (first.id + 1)
end
end
describe "stub_model as association" do
before(:each) do
@real = AssociatedModel.create!
@stub_model = stub_model(MockableModel)
@real.mockable_model = @stub_model
end
it "should pass associated_model == mock" do
@stub_model.should == @real.mockable_model
end
it "should pass mock == associated_model" do
@real.mockable_model.should == @stub_model
end
end
describe "stub_model with a block" do
it "should yield the model" do
model = stub_model(MockableModel) do |block_arg|
@block_arg = block_arg
end
model.should be(@block_arg)
end
end

View file

@ -0,0 +1,8 @@
require File.dirname(__FILE__) + '/../spec_helper'
describe "A sample spec", :type => :model do
fixtures :animals
it "should pass" do
animals(:pig).name.should == "Piggy"
end
end

View file

@ -0,0 +1,8 @@
require File.dirname(__FILE__) + '/../spec_helper'
describe "A sample spec", :type => :model do
fixtures :animals
it "should pass" do
animals(:pig).name.should == "Pig"
end
end

View file

@ -0,0 +1,96 @@
require File.dirname(__FILE__) + '/../spec_helper'
describe "script/spec_server file", :shared => true do
attr_accessor :tmbundle_install_directory
attr_reader :animals_yml_path, :original_animals_content
before do
@animals_yml_path = File.expand_path("#{RAILS_ROOT}/spec/fixtures/animals.yml")
@original_animals_content = File.read(animals_yml_path)
end
after do
File.open(animals_yml_path, "w") do |f|
f.write original_animals_content
end
end
after(:each) do
system "lsof -i tcp:8989 | sed /COMMAND/d | awk '{print $2}' | xargs kill"
end
it "runs a spec" do
dir = File.dirname(__FILE__)
output = ""
Timeout.timeout(10) do
loop do
output = `#{RAILS_ROOT}/script/spec #{dir}/sample_spec.rb --drb 2>&1`
break unless output.include?("No server is running")
end
end
if $?.exitstatus != 0 || output !~ /0 failures/
flunk "command 'script/spec spec/sample_spec' failed\n#{output}"
end
fixtures = YAML.load(@original_animals_content)
fixtures['pig']['name'] = "Piggy"
File.open(animals_yml_path, "w") do |f|
f.write YAML.dump(fixtures)
end
Timeout.timeout(10) do
loop do
output = `#{RAILS_ROOT}/script/spec #{dir}/sample_modified_fixture.rb --drb 2>&1`
break unless output.include?("No server is running")
end
end
if $?.exitstatus != 0 || output !~ /0 failures/
flunk "command 'script/spec spec/sample_modified_fixture' failed\n#{output}"
end
end
def start_spec_server
dir = File.dirname(__FILE__)
Thread.start do
system "cd #{RAILS_ROOT}; script/spec_server"
end
file_content = ""
end
end
describe "script/spec_server file without TextMate bundle" do
it_should_behave_like "script/spec_server file"
before(:each) do
start_spec_server
end
end
describe "script/spec_server file with TextMate bundle" do
it_should_behave_like "script/spec_server file"
before(:each) do
dir = File.dirname(__FILE__)
@tmbundle_install_directory = File.expand_path("#{Dir.tmpdir}/Library/Application Support/TextMate/Bundles")
@bundle_name = "RSpec.tmbundle"
FileUtils.mkdir_p(tmbundle_install_directory)
bundle_dir = File.expand_path("#{dir}/../../../../../../#{@bundle_name}")
File.directory?(bundle_dir).should be_true
unless system(%Q|ln -s #{bundle_dir} "#{tmbundle_install_directory}"|)
raise "Creating link to Textmate Bundle"
end
start_spec_server
end
after(:each) do
bundle_file_to_remove = "#{tmbundle_install_directory}/#{@bundle_name}"
if bundle_file_to_remove == "/"
raise "bundle file path resolved to '/' - could not call rm"
end
unless system(%Q|rm "#{bundle_file_to_remove}"|)
raise "Removing Textmate bundle link failed"
end
end
end

View file

@ -0,0 +1,11 @@
require File.dirname(__FILE__) + '/../spec_helper'
describe "script/spec file" do
it "should run a spec" do
dir = File.dirname(__FILE__)
output = `#{RAILS_ROOT}/script/spec #{dir}/sample_spec.rb`
unless $?.exitstatus == 0
flunk "command 'script/spec spec/sample_spec' failed\n#{output}"
end
end
end