PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/rails/actionpack/test/controller/assert_select_test.rb

http://github.com/benburkert/cruisecontrolrb
Ruby | 576 lines | 461 code | 73 blank | 42 comment | 2 complexity | 98c3c8c753d41402918f5615aca0edc0 MD5 | raw file
Possible License(s): Apache-2.0
  1. #--
  2. # Copyright (c) 2006 Assaf Arkin (http://labnotes.org)
  3. # Under MIT and/or CC By license.
  4. #++
  5. require File.dirname(__FILE__) + '/../abstract_unit'
  6. require File.dirname(__FILE__) + '/fake_controllers'
  7. unless defined?(ActionMailer)
  8. begin
  9. $:.unshift(File.dirname(__FILE__) + "/../../../actionmailer/lib")
  10. require 'action_mailer'
  11. rescue LoadError
  12. require 'rubygems'
  13. gem 'actionmailer'
  14. end
  15. end
  16. class AssertSelectTest < Test::Unit::TestCase
  17. class AssertSelectController < ActionController::Base
  18. def response_with=(content)
  19. @content = content
  20. end
  21. def response_with(&block)
  22. @update = block
  23. end
  24. def html()
  25. render :text=>@content, :layout=>false, :content_type=>Mime::HTML
  26. @content = nil
  27. end
  28. def rjs()
  29. render :update do |page|
  30. @update.call page
  31. end
  32. @update = nil
  33. end
  34. def xml()
  35. render :text=>@content, :layout=>false, :content_type=>Mime::XML
  36. @content = nil
  37. end
  38. def rescue_action(e)
  39. raise e
  40. end
  41. end
  42. class AssertSelectMailer < ActionMailer::Base
  43. def test(html)
  44. recipients "test <test@test.host>"
  45. from "test@test.host"
  46. subject "Test e-mail"
  47. part :content_type=>"text/html", :body=>html
  48. end
  49. end
  50. AssertionFailedError = Test::Unit::AssertionFailedError
  51. def setup
  52. @controller = AssertSelectController.new
  53. @request = ActionController::TestRequest.new
  54. @response = ActionController::TestResponse.new
  55. ActionMailer::Base.delivery_method = :test
  56. ActionMailer::Base.perform_deliveries = true
  57. ActionMailer::Base.deliveries = []
  58. end
  59. def teardown
  60. ActionMailer::Base.deliveries.clear
  61. end
  62. #
  63. # Test assert select.
  64. #
  65. def test_assert_select
  66. render_html %Q{<div id="1"></div><div id="2"></div>}
  67. assert_select "div", 2
  68. assert_raises(AssertionFailedError) { assert_select "div", 3 }
  69. assert_raises(AssertionFailedError){ assert_select "p" }
  70. end
  71. def test_equality_true_false
  72. render_html %Q{<div id="1"></div><div id="2"></div>}
  73. assert_nothing_raised { assert_select "div" }
  74. assert_raises(AssertionFailedError) { assert_select "p" }
  75. assert_nothing_raised { assert_select "div", true }
  76. assert_raises(AssertionFailedError) { assert_select "p", true }
  77. assert_raises(AssertionFailedError) { assert_select "div", false }
  78. assert_nothing_raised { assert_select "p", false }
  79. end
  80. def test_equality_string_and_regexp
  81. render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
  82. assert_nothing_raised { assert_select "div", "foo" }
  83. assert_raises(AssertionFailedError) { assert_select "div", "bar" }
  84. assert_nothing_raised { assert_select "div", :text=>"foo" }
  85. assert_raises(AssertionFailedError) { assert_select "div", :text=>"bar" }
  86. assert_nothing_raised { assert_select "div", /(foo|bar)/ }
  87. assert_raises(AssertionFailedError) { assert_select "div", /foobar/ }
  88. assert_nothing_raised { assert_select "div", :text=>/(foo|bar)/ }
  89. assert_raises(AssertionFailedError) { assert_select "div", :text=>/foobar/ }
  90. assert_raises(AssertionFailedError) { assert_select "p", :text=>/foobar/ }
  91. end
  92. def test_equality_of_html
  93. render_html %Q{<p>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</p>}
  94. text = "\"This is not a big problem,\" he said."
  95. html = "<em>\"This is <strong>not</strong> a big problem,\"</em> he said."
  96. assert_nothing_raised { assert_select "p", text }
  97. assert_raises(AssertionFailedError) { assert_select "p", html }
  98. assert_nothing_raised { assert_select "p", :html=>html }
  99. assert_raises(AssertionFailedError) { assert_select "p", :html=>text }
  100. # No stripping for pre.
  101. render_html %Q{<pre>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</pre>}
  102. text = "\n\"This is not a big problem,\" he said.\n"
  103. html = "\n<em>\"This is <strong>not</strong> a big problem,\"</em> he said.\n"
  104. assert_nothing_raised { assert_select "pre", text }
  105. assert_raises(AssertionFailedError) { assert_select "pre", html }
  106. assert_nothing_raised { assert_select "pre", :html=>html }
  107. assert_raises(AssertionFailedError) { assert_select "pre", :html=>text }
  108. end
  109. def test_equality_of_instances
  110. render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
  111. assert_nothing_raised { assert_select "div", 2 }
  112. assert_raises(AssertionFailedError) { assert_select "div", 3 }
  113. assert_nothing_raised { assert_select "div", 1..2 }
  114. assert_raises(AssertionFailedError) { assert_select "div", 3..4 }
  115. assert_nothing_raised { assert_select "div", :count=>2 }
  116. assert_raises(AssertionFailedError) { assert_select "div", :count=>3 }
  117. assert_nothing_raised { assert_select "div", :minimum=>1 }
  118. assert_nothing_raised { assert_select "div", :minimum=>2 }
  119. assert_raises(AssertionFailedError) { assert_select "div", :minimum=>3 }
  120. assert_nothing_raised { assert_select "div", :maximum=>2 }
  121. assert_nothing_raised { assert_select "div", :maximum=>3 }
  122. assert_raises(AssertionFailedError) { assert_select "div", :maximum=>1 }
  123. assert_nothing_raised { assert_select "div", :minimum=>1, :maximum=>2 }
  124. assert_raises(AssertionFailedError) { assert_select "div", :minimum=>3, :maximum=>4 }
  125. end
  126. def test_substitution_values
  127. render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
  128. assert_select "div#?", /\d+/ do |elements|
  129. assert_equal 2, elements.size
  130. end
  131. assert_select "div" do
  132. assert_select "div#?", /\d+/ do |elements|
  133. assert_equal 2, elements.size
  134. assert_select "#1"
  135. assert_select "#2"
  136. end
  137. end
  138. end
  139. def test_nested_assert_select
  140. render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
  141. assert_select "div" do |elements|
  142. assert_equal 2, elements.size
  143. assert_select elements[0], "#1"
  144. assert_select elements[1], "#2"
  145. end
  146. assert_select "div" do
  147. assert_select "div" do |elements|
  148. assert_equal 2, elements.size
  149. # Testing in a group is one thing
  150. assert_select "#1,#2"
  151. # Testing individually is another.
  152. assert_select "#1"
  153. assert_select "#2"
  154. assert_select "#3", false
  155. end
  156. end
  157. end
  158. def test_assert_select_text_match
  159. render_html %Q{<div id="1"><span>foo</span></div><div id="2"><span>bar</span></div>}
  160. assert_select "div" do
  161. assert_nothing_raised { assert_select "div", "foo" }
  162. assert_nothing_raised { assert_select "div", "bar" }
  163. assert_nothing_raised { assert_select "div", /\w*/ }
  164. assert_nothing_raised { assert_select "div", /\w*/, :count=>2 }
  165. assert_raises(AssertionFailedError) { assert_select "div", :text=>"foo", :count=>2 }
  166. assert_nothing_raised { assert_select "div", :html=>"<span>bar</span>" }
  167. assert_nothing_raised { assert_select "div", :html=>"<span>bar</span>" }
  168. assert_nothing_raised { assert_select "div", :html=>/\w*/ }
  169. assert_nothing_raised { assert_select "div", :html=>/\w*/, :count=>2 }
  170. assert_raises(AssertionFailedError) { assert_select "div", :html=>"<span>foo</span>", :count=>2 }
  171. end
  172. end
  173. # With single result.
  174. def test_assert_select_from_rjs_with_single_result
  175. render_rjs do |page|
  176. page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
  177. end
  178. assert_select "div" do |elements|
  179. assert elements.size == 2
  180. assert_select "#1"
  181. assert_select "#2"
  182. end
  183. assert_select "div#?", /\d+/ do |elements|
  184. assert_select "#1"
  185. assert_select "#2"
  186. end
  187. end
  188. # With multiple results.
  189. def test_assert_select_from_rjs_with_multiple_results
  190. render_rjs do |page|
  191. page.replace_html "test", "<div id=\"1\">foo</div>"
  192. page.replace_html "test2", "<div id=\"2\">foo</div>"
  193. end
  194. assert_select "div" do |elements|
  195. assert elements.size == 2
  196. assert_select "#1"
  197. assert_select "#2"
  198. end
  199. end
  200. #
  201. # Test css_select.
  202. #
  203. def test_css_select
  204. render_html %Q{<div id="1"></div><div id="2"></div>}
  205. assert 2, css_select("div").size
  206. assert 0, css_select("p").size
  207. end
  208. def test_nested_css_select
  209. render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
  210. assert_select "div#?", /\d+/ do |elements|
  211. assert_equal 1, css_select(elements[0], "div").size
  212. assert_equal 1, css_select(elements[1], "div").size
  213. end
  214. assert_select "div" do
  215. assert_equal 2, css_select("div").size
  216. css_select("div").each do |element|
  217. # Testing as a group is one thing
  218. assert !css_select("#1,#2").empty?
  219. # Testing individually is another
  220. assert !css_select("#1").empty?
  221. assert !css_select("#2").empty?
  222. end
  223. end
  224. end
  225. # With one result.
  226. def test_css_select_from_rjs_with_single_result
  227. render_rjs do |page|
  228. page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
  229. end
  230. assert_equal 2, css_select("div").size
  231. assert_equal 1, css_select("#1").size
  232. assert_equal 1, css_select("#2").size
  233. end
  234. # With multiple results.
  235. def test_css_select_from_rjs_with_multiple_results
  236. render_rjs do |page|
  237. page.replace_html "test", "<div id=\"1\">foo</div>"
  238. page.replace_html "test2", "<div id=\"2\">foo</div>"
  239. end
  240. assert_equal 2, css_select("div").size
  241. assert_equal 1, css_select("#1").size
  242. assert_equal 1, css_select("#2").size
  243. end
  244. #
  245. # Test assert_select_rjs.
  246. #
  247. # Test that we can pick up all statements in the result.
  248. def test_assert_select_rjs_picks_up_all_statements
  249. render_rjs do |page|
  250. page.replace "test", "<div id=\"1\">foo</div>"
  251. page.replace_html "test2", "<div id=\"2\">foo</div>"
  252. page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
  253. end
  254. found = false
  255. assert_select_rjs do
  256. assert_select "#1"
  257. assert_select "#2"
  258. assert_select "#3"
  259. found = true
  260. end
  261. assert found
  262. end
  263. # Test that we fail if there is nothing to pick.
  264. def test_assert_select_rjs_fails_if_nothing_to_pick
  265. render_rjs { }
  266. assert_raises(AssertionFailedError) { assert_select_rjs }
  267. end
  268. def test_assert_select_rjs_with_unicode
  269. # Test that non-ascii characters (which are converted into \uXXXX in RJS) are decoded correctly.
  270. render_rjs do |page|
  271. page.replace "test", "<div id=\"1\">\343\203\201\343\202\261\343\203\203\343\203\210</div>"
  272. end
  273. assert_select_rjs do
  274. assert_select "#1", :text => "\343\203\201\343\202\261\343\203\203\343\203\210"
  275. assert_select "#1", "\343\203\201\343\202\261\343\203\203\343\203\210"
  276. assert_select "#1", Regexp.new("\343\203\201..\343\203\210",0,'U')
  277. assert_raises(AssertionFailedError) { assert_select "#1", Regexp.new("\343\203\201.\343\203\210",0,'U') }
  278. end
  279. end
  280. def test_assert_select_rjs_with_id
  281. # Test that we can pick up all statements in the result.
  282. render_rjs do |page|
  283. page.replace "test1", "<div id=\"1\">foo</div>"
  284. page.replace_html "test2", "<div id=\"2\">foo</div>"
  285. page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
  286. end
  287. assert_select_rjs "test1" do
  288. assert_select "div", 1
  289. assert_select "#1"
  290. end
  291. assert_select_rjs "test2" do
  292. assert_select "div", 1
  293. assert_select "#2"
  294. end
  295. assert_select_rjs "test3" do
  296. assert_select "div", 1
  297. assert_select "#3"
  298. end
  299. assert_raises(AssertionFailedError) { assert_select_rjs "test4" }
  300. end
  301. def test_assert_select_rjs_for_replace
  302. render_rjs do |page|
  303. page.replace "test1", "<div id=\"1\">foo</div>"
  304. page.replace_html "test2", "<div id=\"2\">foo</div>"
  305. page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
  306. end
  307. # Replace.
  308. assert_select_rjs :replace do
  309. assert_select "div", 1
  310. assert_select "#1"
  311. end
  312. assert_select_rjs :replace, "test1" do
  313. assert_select "div", 1
  314. assert_select "#1"
  315. end
  316. assert_raises(AssertionFailedError) { assert_select_rjs :replace, "test2" }
  317. # Replace HTML.
  318. assert_select_rjs :replace_html do
  319. assert_select "div", 1
  320. assert_select "#2"
  321. end
  322. assert_select_rjs :replace_html, "test2" do
  323. assert_select "div", 1
  324. assert_select "#2"
  325. end
  326. assert_raises(AssertionFailedError) { assert_select_rjs :replace_html, "test1" }
  327. end
  328. def test_assert_select_rjs_for_chained_replace
  329. render_rjs do |page|
  330. page['test1'].replace "<div id=\"1\">foo</div>"
  331. page['test2'].replace_html "<div id=\"2\">foo</div>"
  332. page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
  333. end
  334. # Replace.
  335. assert_select_rjs :chained_replace do
  336. assert_select "div", 1
  337. assert_select "#1"
  338. end
  339. assert_select_rjs :chained_replace, "test1" do
  340. assert_select "div", 1
  341. assert_select "#1"
  342. end
  343. assert_raises(AssertionFailedError) { assert_select_rjs :chained_replace, "test2" }
  344. # Replace HTML.
  345. assert_select_rjs :chained_replace_html do
  346. assert_select "div", 1
  347. assert_select "#2"
  348. end
  349. assert_select_rjs :chained_replace_html, "test2" do
  350. assert_select "div", 1
  351. assert_select "#2"
  352. end
  353. assert_raises(AssertionFailedError) { assert_select_rjs :replace_html, "test1" }
  354. end
  355. # Non-positioned insert.
  356. def test_assert_select_rjs_for_nonpositioned_insert
  357. render_rjs do |page|
  358. page.replace "test1", "<div id=\"1\">foo</div>"
  359. page.replace_html "test2", "<div id=\"2\">foo</div>"
  360. page.insert_html :top, "test3", "<div id=\"3\">foo</div>"
  361. end
  362. assert_select_rjs :insert_html do
  363. assert_select "div", 1
  364. assert_select "#3"
  365. end
  366. assert_select_rjs :insert_html, "test3" do
  367. assert_select "div", 1
  368. assert_select "#3"
  369. end
  370. assert_raises(AssertionFailedError) { assert_select_rjs :insert_html, "test1" }
  371. end
  372. # Positioned insert.
  373. def test_assert_select_rjs_for_positioned_insert
  374. render_rjs do |page|
  375. page.insert_html :top, "test1", "<div id=\"1\">foo</div>"
  376. page.insert_html :bottom, "test2", "<div id=\"2\">foo</div>"
  377. page.insert_html :before, "test3", "<div id=\"3\">foo</div>"
  378. page.insert_html :after, "test4", "<div id=\"4\">foo</div>"
  379. end
  380. assert_select_rjs :insert, :top do
  381. assert_select "div", 1
  382. assert_select "#1"
  383. end
  384. assert_select_rjs :insert, :bottom do
  385. assert_select "div", 1
  386. assert_select "#2"
  387. end
  388. assert_select_rjs :insert, :before do
  389. assert_select "div", 1
  390. assert_select "#3"
  391. end
  392. assert_select_rjs :insert, :after do
  393. assert_select "div", 1
  394. assert_select "#4"
  395. end
  396. assert_select_rjs :insert_html do
  397. assert_select "div", 4
  398. end
  399. end
  400. # Simple selection from a single result.
  401. def test_nested_assert_select_rjs_with_single_result
  402. render_rjs do |page|
  403. page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
  404. end
  405. assert_select_rjs "test" do |elements|
  406. assert_equal 2, elements.size
  407. assert_select "#1"
  408. assert_select "#2"
  409. end
  410. end
  411. # Deal with two results.
  412. def test_nested_assert_select_rjs_with_two_results
  413. render_rjs do |page|
  414. page.replace_html "test", "<div id=\"1\">foo</div>"
  415. page.replace_html "test2", "<div id=\"2\">foo</div>"
  416. end
  417. assert_select_rjs "test" do |elements|
  418. assert_equal 1, elements.size
  419. assert_select "#1"
  420. end
  421. assert_select_rjs "test2" do |elements|
  422. assert_equal 1, elements.size
  423. assert_select "#2"
  424. end
  425. end
  426. def test_feed_item_encoded
  427. render_xml <<-EOF
  428. <rss version="2.0">
  429. <channel>
  430. <item>
  431. <description>
  432. <![CDATA[
  433. <p>Test 1</p>
  434. ]]>
  435. </description>
  436. </item>
  437. <item>
  438. <description>
  439. <![CDATA[
  440. <p>Test 2</p>
  441. ]]>
  442. </description>
  443. </item>
  444. </channel>
  445. </rss>
  446. EOF
  447. assert_select "channel item description" do
  448. # Test element regardless of wrapper.
  449. assert_select_encoded do
  450. assert_select "p", :count=>2, :text=>/Test/
  451. end
  452. # Test through encoded wrapper.
  453. assert_select_encoded do
  454. assert_select "encoded p", :count=>2, :text=>/Test/
  455. end
  456. # Use :root instead (recommended)
  457. assert_select_encoded do
  458. assert_select ":root p", :count=>2, :text=>/Test/
  459. end
  460. # Test individually.
  461. assert_select "description" do |elements|
  462. assert_select_encoded elements[0] do
  463. assert_select "p", "Test 1"
  464. end
  465. assert_select_encoded elements[1] do
  466. assert_select "p", "Test 2"
  467. end
  468. end
  469. end
  470. # Test that we only un-encode element itself.
  471. assert_select "channel item" do
  472. assert_select_encoded do
  473. assert_select "p", 0
  474. end
  475. end
  476. end
  477. #
  478. # Test assert_select_email
  479. #
  480. def test_assert_select_email
  481. assert_raises(AssertionFailedError) { assert_select_email {} }
  482. AssertSelectMailer.deliver_test "<div><p>foo</p><p>bar</p></div>"
  483. assert_select_email do
  484. assert_select "div:root" do
  485. assert_select "p:first-child", "foo"
  486. assert_select "p:last-child", "bar"
  487. end
  488. end
  489. end
  490. protected
  491. def render_html(html)
  492. @controller.response_with = html
  493. get :html
  494. end
  495. def render_rjs(&block)
  496. @controller.response_with &block
  497. get :rjs
  498. end
  499. def render_xml(xml)
  500. @controller.response_with = xml
  501. get :xml
  502. end
  503. end