# 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
unless defined?(RAILS_ROOT)
RAILS_ROOT = ENV["RAILS_ROOT"]
end
require File.join(RAILS_ROOT, "test", "test_helper")
require File.join(File.dirname(__FILE__), "..", "init")
class AssertSelectController < ActionController::Base
def response=(html)
@html = html
end
def response(&block)
@update = block
end
def html()
render :text=>@html, :layout=>false, :content_type=>Mime::HTML
@html = nil
end
def rjs()
render :update do |page|
@update.call page
end
@update = nil
end
def rescue_action(e)
raise e
end
end
class AssertSelectTest < Test::Unit::TestCase
AssertionFailedError = Test::Unit::AssertionFailedError
def setup
@controller = AssertSelectController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
def teardown
end
#
# Test assert select.
#
def test_assert_select
render_html %Q{
}
assert_select "div", 2
assert_raises(AssertionFailedError) { assert_select "div", 3 }
assert_raises(AssertionFailedError){ assert_select "p" }
end
def test_equality_true_false
render_html %Q{}
assert_nothing_raised { assert_select "div" }
assert_raises(AssertionFailedError) { assert_select "p" }
assert_nothing_raised { assert_select "div", true }
assert_raises(AssertionFailedError) { assert_select "p", true }
assert_raises(AssertionFailedError) { assert_select "div", false }
assert_nothing_raised { assert_select "p", false }
end
def test_equality_string_and_regexp
render_html %Q{foo
foo
}
assert_nothing_raised { assert_select "div", "foo" }
assert_raises(AssertionFailedError) { assert_select "div", "bar" }
assert_nothing_raised { assert_select "div", :text=>"foo" }
assert_raises(AssertionFailedError) { assert_select "div", :text=>"bar" }
assert_nothing_raised { assert_select "div", /(foo|bar)/ }
assert_raises(AssertionFailedError) { assert_select "div", /foobar/ }
assert_nothing_raised { assert_select "div", :text=>/(foo|bar)/ }
assert_raises(AssertionFailedError) { assert_select "div", :text=>/foobar/ }
assert_raises(AssertionFailedError) { assert_select "p", :text=>/foobar/ }
end
def test_equality_of_instances
render_html %Q{foo
foo
}
assert_nothing_raised { assert_select "div", 2 }
assert_raises(AssertionFailedError) { assert_select "div", 3 }
assert_nothing_raised { assert_select "div", 1..2 }
assert_raises(AssertionFailedError) { assert_select "div", 3..4 }
assert_nothing_raised { assert_select "div", :count=>2 }
assert_raises(AssertionFailedError) { assert_select "div", :count=>3 }
assert_nothing_raised { assert_select "div", :minimum=>1 }
assert_nothing_raised { assert_select "div", :minimum=>2 }
assert_raises(AssertionFailedError) { assert_select "div", :minimum=>3 }
assert_nothing_raised { assert_select "div", :maximum=>2 }
assert_nothing_raised { assert_select "div", :maximum=>3 }
assert_raises(AssertionFailedError) { assert_select "div", :maximum=>1 }
assert_nothing_raised { assert_select "div", :minimum=>1, :maximum=>2 }
assert_raises(AssertionFailedError) { assert_select "div", :minimum=>3, :maximum=>4 }
end
def test_substitution_values
render_html %Q{foo
foo
}
assert_select "div#?", /\d+/ do |elements|
assert_equal 2, elements.size
end
assert_select "div" do
assert_select "div#?", /\d+/ do |elements|
assert_equal 2, elements.size
assert_select "#1"
assert_select "#2"
end
end
end
def test_nested_assert_select
render_html %Q{foo
foo
}
assert_select "div" do |elements|
assert_equal 2, elements.size
assert_select elements[0], "#1"
assert_select elements[1], "#2"
end
assert_select "div" do
assert_select "div" do |elements|
assert_equal 2, elements.size
# Testing in a group is one thing
assert_select "#1,#2"
# Testing individually is another.
assert_select "#1"
assert_select "#2"
assert_select "#3", false
end
end
end
def test_assert_select_from_rjs
render_rjs do |page|
page.replace_html "test", "foo
\nfoo
"
end
assert_select "div" do |elements|
assert elements.size == 2
assert_select "#1"
assert_select "#2"
end
assert_select "div#?", /\d+/ do |elements|
assert_select "#1"
assert_select "#2"
end
# With multiple results.
render_rjs do |page|
page.replace_html "test", "foo
"
page.replace_html "test2", "foo
"
end
assert_select "div" do |elements|
assert elements.size == 2
assert_select "#1"
assert_select "#2"
end
end
#
# Test css_select.
#
def test_css_select
render_html %Q{}
assert 2, css_select("div").size
assert 0, css_select("p").size
end
def test_nested_css_select
render_html %Q{foo
foo
}
assert_select "div#?", /\d+/ do |elements|
assert_equal 1, css_select(elements[0], "div").size
assert_equal 1, css_select(elements[1], "div").size
end
assert_select "div" do
assert_equal 2, css_select("div").size
css_select("div").each do |element|
# Testing as a group is one thing
assert !css_select("#1,#2").empty?
# Testing individually is another
assert !css_select("#1").empty?
assert !css_select("#2").empty?
end
end
end
def test_css_select_from_rjs
# With one result.
render_rjs do |page|
page.replace_html "test", "foo
\nfoo
"
end
assert_equal 2, css_select("div").size
assert_equal 1, css_select("#1").size
assert_equal 1, css_select("#2").size
# With multiple results.
render_rjs do |page|
page.replace_html "test", "foo
"
page.replace_html "test2", "foo
"
end
assert_equal 2, css_select("div").size
assert_equal 1, css_select("#1").size
assert_equal 1, css_select("#2").size
end
#
# Test assert_select_rjs.
#
def test_assert_select_rjs
# Test that we can pick up all statements in the result.
render_rjs do |page|
page.replace "test", "foo
"
page.replace_html "test2", "foo
"
page.insert_html :top, "test3", "foo
"
end
found = false
assert_select_rjs do
assert_select "#1"
assert_select "#2"
assert_select "#3"
found = true
end
assert found
# Test that we fail if there is nothing to pick.
render_rjs do |page|
end
assert_raises(AssertionFailedError) { assert_select_rjs }
end
def test_assert_select_rjs_with_id
# Test that we can pick up all statements in the result.
render_rjs do |page|
page.replace "test1", "foo
"
page.replace_html "test2", "foo
"
page.insert_html :top, "test3", "foo
"
end
assert_select_rjs "test1" do
assert_select "div", 1
assert_select "#1"
end
assert_select_rjs "test2" do
assert_select "div", 1
assert_select "#2"
end
assert_select_rjs "test3" do
assert_select "div", 1
assert_select "#3"
end
assert_raises(AssertionFailedError) { assert_select_rjs "test4" }
end
def test_assert_select_rjs_for_replace
render_rjs do |page|
page.replace "test1", "foo
"
page.replace_html "test2", "foo
"
page.insert_html :top, "test3", "foo
"
end
# Replace.
assert_select_rjs :replace do
assert_select "div", 1
assert_select "#1"
end
assert_select_rjs :replace, "test1" do
assert_select "div", 1
assert_select "#1"
end
assert_raises(AssertionFailedError) { assert_select_rjs :replace, "test2" }
# Replace HTML.
assert_select_rjs :replace_html do
assert_select "div", 1
assert_select "#2"
end
assert_select_rjs :replace_html, "test2" do
assert_select "div", 1
assert_select "#2"
end
assert_raises(AssertionFailedError) { assert_select_rjs :replace_html, "test1" }
end
def test_assert_select_rjs_for_insert
render_rjs do |page|
page.replace "test1", "foo
"
page.replace_html "test2", "foo
"
page.insert_html :top, "test3", "foo
"
end
# Non-positioned.
assert_select_rjs :insert_html do
assert_select "div", 1
assert_select "#3"
end
assert_select_rjs :insert_html, "test3" do
assert_select "div", 1
assert_select "#3"
end
assert_raises(AssertionFailedError) { assert_select_rjs :insert_html, "test1" }
# Positioned.
render_rjs do |page|
page.insert_html :top, "test1", "foo
"
page.insert_html :bottom, "test2", "foo
"
page.insert_html :before, "test3", "foo
"
page.insert_html :after, "test4", "foo
"
end
assert_select_rjs :insert, :top do
assert_select "div", 1
assert_select "#1"
end
assert_select_rjs :insert, :bottom do
assert_select "div", 1
assert_select "#2"
end
assert_select_rjs :insert, :before do
assert_select "div", 1
assert_select "#3"
end
assert_select_rjs :insert, :after do
assert_select "div", 1
assert_select "#4"
end
assert_select_rjs :insert_html do
assert_select "div", 4
end
end
def test_nested_assert_select_rjs
# Simple selection from a single result.
render_rjs do |page|
page.replace_html "test", "foo
\nfoo
"
end
assert_select_rjs "test" do |elements|
assert_equal 2, elements.size
assert_select "#1"
assert_select "#2"
end
# Deal with two results.
render_rjs do |page|
page.replace_html "test", "foo
"
page.replace_html "test2", "foo
"
end
assert_select_rjs "test" do |elements|
assert_equal 1, elements.size
assert_select "#1"
end
assert_select_rjs "test2" do |elements|
assert_equal 1, elements.size
assert_select "#2"
end
end
protected
def render_html(html)
@controller.response = html
get :html
end
def render_rjs(&block)
@controller.response &block
get :rjs
end
end