From 3142502964f94d6144312ae2c368b4c4589fa25a Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 3 Sep 2006 19:54:21 +0000 Subject: Added assert_select* for CSS selector-based testing (deprecates assert_tag) #5936 [assaf.arkin@gmail.com] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4929 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/test/controller/assert_select_test.rb | 490 +++++++++++++++++++++++ 1 file changed, 490 insertions(+) create mode 100644 actionpack/test/controller/assert_select_test.rb (limited to 'actionpack/test/controller/assert_select_test.rb') diff --git a/actionpack/test/controller/assert_select_test.rb b/actionpack/test/controller/assert_select_test.rb new file mode 100644 index 0000000000..2117c852c0 --- /dev/null +++ b/actionpack/test/controller/assert_select_test.rb @@ -0,0 +1,490 @@ +#-- +# Copyright (c) 2006 Assaf Arkin (http://labnotes.org) +# Under MIT and/or CC By license. +#++ + +require File.dirname(__FILE__) + '/../abstract_unit' +require File.dirname(__FILE__) + '/fake_controllers' +require "action_mailer" + +class AssertSelectTest < Test::Unit::TestCase + class AssertSelectController < ActionController::Base + def response_with=(content) + @content = content + end + + def response_with(&block) + @update = block + end + + def html() + render :text=>@content, :layout=>false, :content_type=>Mime::HTML + @content = nil + end + + def rjs() + 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 " + from "test@test.host" + subject "Test e-mail" + part :content_type=>"text/html", :body=>html + end + end + + AssertionFailedError = Test::Unit::AssertionFailedError + + def setup + @controller = AssertSelectController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + ActionMailer::Base.delivery_method = :test + ActionMailer::Base.perform_deliveries = true + ActionMailer::Base.deliveries = [] + end + + + def teardown + ActionMailer::Base.deliveries.clear + 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_html + render_html %Q{

\n"This is not a big problem," he said.\n

} + text = "\"This is not a big problem,\" he said." + html = "\"This is not a big problem,\" he said." + assert_nothing_raised { assert_select "p", text } + assert_raises(AssertionFailedError) { assert_select "p", html } + assert_nothing_raised { assert_select "p", :html=>html } + assert_raises(AssertionFailedError) { assert_select "p", :html=>text } + # No stripping for pre. + render_html %Q{
\n"This is not a big problem," he said.\n
} + text = "\n\"This is not a big problem,\" he said.\n" + html = "\n\"This is not a big problem,\" he said.\n" + assert_nothing_raised { assert_select "pre", text } + assert_raises(AssertionFailedError) { assert_select "pre", html } + assert_nothing_raised { assert_select "pre", :html=>html } + assert_raises(AssertionFailedError) { assert_select "pre", :html=>text } + 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
\n
foo
" + 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
\n
foo
" + 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
\n
foo
" + 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 + + + def test_feed_item_encoded + render_xml <<-EOF + + + + + Test 1

+ ]]> +
+
+ + + Test 2

+ ]]> +
+
+
+
+EOF + assert_select "channel item description" do + # Test element regardless of wrapper. + assert_select_encoded do + assert_select "p", :count=>2, :text=>/Test/ + end + # Test through encoded wrapper. + assert_select_encoded do + assert_select "encoded p", :count=>2, :text=>/Test/ + end + # Use :root instead (recommended) + assert_select_encoded do + assert_select ":root p", :count=>2, :text=>/Test/ + end + # Test individually. + assert_select "description" do |elements| + assert_select_encoded elements[0] do + assert_select "p", "Test 1" + end + assert_select_encoded elements[1] do + assert_select "p", "Test 2" + end + end + end + + # Test that we only un-encode element itself. + assert_select "channel item" do + assert_select_encoded do + assert_select "p", 0 + end + end + end + + + # + # Test assert_select_email + # + + def test_assert_select_email + assert_raises(AssertionFailedError) { assert_select_email {} } + AssertSelectMailer.deliver_test "

foo

bar

" + assert_select_email do + assert_select "div:root" do + assert_select "p:first-child", "foo" + assert_select "p:last-child", "bar" + end + end + end + + + protected + def render_html(html) + @controller.response_with = html + get :html + end + + def render_rjs(&block) + @controller.response_with &block + get :rjs + end + + def render_xml(xml) + @controller.response_with = xml + get :xml + end +end \ No newline at end of file -- cgit v1.2.3