ZenTest 3.11.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +17 -0
- data/History.txt +33 -0
- data/Manifest.txt +4 -19
- data/Rakefile +5 -0
- data/bin/multigem +4 -0
- data/bin/multiruby_setup +31 -28
- data/lib/autotest.rb +21 -17
- data/lib/autotest/emacs.rb +1 -0
- data/lib/autotest/growl.rb +1 -1
- data/lib/focus.rb +9 -0
- data/lib/multiruby.rb +62 -44
- data/lib/zentest.rb +5 -9
- data/test/test_autotest.rb +16 -5
- data/test/test_focus.rb +35 -0
- data/test/test_unit_diff.rb +4 -2
- data/test/test_zentest.rb +6 -12
- data/test/test_zentest_mapping.rb +4 -3
- metadata +9 -29
- data/bin/rails_test_audit +0 -80
- data/lib/autotest/screen.rb +0 -73
- data/lib/test/rails.rb +0 -295
- data/lib/test/rails/controller_test_case.rb +0 -382
- data/lib/test/rails/functional_test_case.rb +0 -79
- data/lib/test/rails/helper_test_case.rb +0 -64
- data/lib/test/rails/ivar_proxy.rb +0 -31
- data/lib/test/rails/pp_html_document.rb +0 -74
- data/lib/test/rails/rake_tasks.rb +0 -50
- data/lib/test/rails/render_tree.rb +0 -93
- data/lib/test/rails/test_case.rb +0 -28
- data/lib/test/rails/view_test_case.rb +0 -597
- data/lib/test/zentest_assertions.rb +0 -134
- data/test/test_help.rb +0 -36
- data/test/test_rails_autotest.rb +0 -229
- data/test/test_rails_controller_test_case.rb +0 -58
- data/test/test_rails_helper_test_case.rb +0 -48
- data/test/test_rails_view_test_case.rb +0 -275
- data/test/test_zentest_assertions.rb +0 -128
@@ -1,79 +0,0 @@
|
|
1
|
-
$TESTING_RTC = defined?($TESTING_RTC) && $TESTING_RTC
|
2
|
-
|
3
|
-
##
|
4
|
-
# FunctionalTestCase is an abstract class that sets up a controller instance
|
5
|
-
# for its subclasses.
|
6
|
-
|
7
|
-
class Test::Rails::FunctionalTestCase < Test::Rails::TestCase
|
8
|
-
|
9
|
-
self.use_transactional_fixtures = true
|
10
|
-
self.use_instantiated_fixtures = false
|
11
|
-
|
12
|
-
##
|
13
|
-
# Sets up instance variables to allow tests depending on a controller work.
|
14
|
-
#
|
15
|
-
# setup uses the instance variable @controller_class_name to determine which
|
16
|
-
# controller class to instantiate.
|
17
|
-
#
|
18
|
-
# setup also instantiates a new @request and @response object.
|
19
|
-
#
|
20
|
-
# If you need to perform extra setup actions, define #setup_extra and
|
21
|
-
# FunctionalTestCase will call it after performing the rest of its setup
|
22
|
-
# actions.
|
23
|
-
|
24
|
-
def setup
|
25
|
-
return if self.class.name =~ /TestCase$/ and not $TESTING_RTC
|
26
|
-
super
|
27
|
-
|
28
|
-
@controller_class = Object.path2class @controller_class_name
|
29
|
-
raise "Can't determine controller class for #{self.class}" if @controller_class.nil?
|
30
|
-
|
31
|
-
@controller = @controller_class.new
|
32
|
-
|
33
|
-
@session = ActionController::TestSession.new
|
34
|
-
|
35
|
-
@flash = ActionController::Flash::FlashHash.new
|
36
|
-
@session['flash'] = @flash
|
37
|
-
|
38
|
-
@request = ActionController::TestRequest.new
|
39
|
-
@request.session = @session
|
40
|
-
|
41
|
-
# HACK There's probably an official way to do this
|
42
|
-
@controller.instance_variable_set :@_session, @request.session
|
43
|
-
|
44
|
-
@response = ActionController::TestResponse.new
|
45
|
-
|
46
|
-
setup_extra if respond_to? :setup_extra
|
47
|
-
end
|
48
|
-
|
49
|
-
##
|
50
|
-
# Flash accessor. The flash can be assigned to before calling process or
|
51
|
-
# render and it will Just Work (yay!)
|
52
|
-
#
|
53
|
-
# view:
|
54
|
-
# <div class="error"><%= flash[:error] %></div>
|
55
|
-
#
|
56
|
-
# test:
|
57
|
-
# flash[:error] = 'You did a bad thing.'
|
58
|
-
# render
|
59
|
-
# assert_tag :tag => 'div', :attributes => { :class => 'error' },
|
60
|
-
# :content => 'You did a bad thing.'
|
61
|
-
|
62
|
-
attr_reader :flash
|
63
|
-
|
64
|
-
##
|
65
|
-
# Session accessor. The session can be assigned to before calling process
|
66
|
-
# or render and it will Just Work (yay!)
|
67
|
-
#
|
68
|
-
# test:
|
69
|
-
#
|
70
|
-
# def test_logout
|
71
|
-
# session[:user] = users(:herbert)
|
72
|
-
# post :logout
|
73
|
-
# assert_equal nil, session[:user]
|
74
|
-
# end
|
75
|
-
|
76
|
-
attr_reader :session
|
77
|
-
|
78
|
-
end
|
79
|
-
|
@@ -1,64 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# Stub controller for testing helpers.
|
3
|
-
|
4
|
-
class HelperTestCaseController < ApplicationController
|
5
|
-
|
6
|
-
attr_accessor :request
|
7
|
-
|
8
|
-
attr_accessor :url
|
9
|
-
|
10
|
-
##
|
11
|
-
# Re-raise errors
|
12
|
-
|
13
|
-
def rescue_action(e)
|
14
|
-
raise e
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
##
|
20
|
-
# HelperTestCase allows helpers to be easily tested.
|
21
|
-
#
|
22
|
-
# Original concept by Ryan Davis, original implementation by Geoff Grosenbach.
|
23
|
-
|
24
|
-
class Test::Rails::HelperTestCase < Test::Rails::FunctionalTestCase
|
25
|
-
|
26
|
-
self.use_transactional_fixtures = true
|
27
|
-
self.use_instantiated_fixtures = false
|
28
|
-
|
29
|
-
# Are other helpers needed?
|
30
|
-
|
31
|
-
include ActionView::Helpers::ActiveRecordHelper
|
32
|
-
include ActionView::Helpers::TagHelper
|
33
|
-
include ActionView::Helpers::FormTagHelper
|
34
|
-
include ActionView::Helpers::FormOptionsHelper
|
35
|
-
include ActionView::Helpers::FormHelper
|
36
|
-
include ActionView::Helpers::UrlHelper
|
37
|
-
include ActionView::Helpers::AssetTagHelper
|
38
|
-
include ActionView::Helpers::PrototypeHelper rescue nil # Rails 1.0 only
|
39
|
-
include ActionView::Helpers::TextHelper
|
40
|
-
|
41
|
-
##
|
42
|
-
# Automatically includes the helper module into the test sublcass.
|
43
|
-
|
44
|
-
def self.inherited(helper_testcase)
|
45
|
-
super
|
46
|
-
helper_name = helper_testcase.name.sub 'Test', ''
|
47
|
-
helper_module = Object.path2class helper_name
|
48
|
-
helper_testcase.send :include, helper_module
|
49
|
-
rescue NameError
|
50
|
-
raise "Unable to find helper #{helper_name}"
|
51
|
-
end
|
52
|
-
|
53
|
-
def setup
|
54
|
-
return if self.class.name =~ /TestCase$/
|
55
|
-
@controller_class_name = 'HelperTestCaseController'
|
56
|
-
super
|
57
|
-
@controller.request = @request
|
58
|
-
@controller.url = ActionController::UrlRewriter.new @request, {} # url_for
|
59
|
-
|
60
|
-
ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'test/rails'
|
2
|
-
|
3
|
-
##
|
4
|
-
# A wrapper that allows instance variables to be manipulated using +[]+ and
|
5
|
-
# +[]=+
|
6
|
-
|
7
|
-
class Test::Rails::IvarProxy
|
8
|
-
|
9
|
-
##
|
10
|
-
# Wraps +object+ allowing its instance variables to be manipulated.
|
11
|
-
|
12
|
-
def initialize(object)
|
13
|
-
@object = object
|
14
|
-
end
|
15
|
-
|
16
|
-
##
|
17
|
-
# Retrieves +ivar+ from the wrapped object.
|
18
|
-
|
19
|
-
def [](ivar)
|
20
|
-
@object.instance_variable_get "@#{ivar}"
|
21
|
-
end
|
22
|
-
|
23
|
-
##
|
24
|
-
# Sets +ivar+ to +val+ on the wrapped object.
|
25
|
-
|
26
|
-
def []=(ivar, val)
|
27
|
-
@object.instance_variable_set "@#{ivar}", val
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
@@ -1,74 +0,0 @@
|
|
1
|
-
class HTML::Document
|
2
|
-
def pretty_print(q)
|
3
|
-
q.object_address_group self do
|
4
|
-
q.breakable
|
5
|
-
q.seplist @root.children_without_newlines do |v| q.pp v end
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class HTML::Node
|
11
|
-
def children_without_newlines
|
12
|
-
@children.reject do |c|
|
13
|
-
HTML::Text == c.class and c.content_without_whitespace == "\n"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def pretty_print(q)
|
18
|
-
q.group 1, '[NODE ', ']' do
|
19
|
-
q.breakable
|
20
|
-
q.seplist children_without_newlines do |v| q.pp v end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class HTML::Tag
|
26
|
-
def pretty_print(q)
|
27
|
-
case @closing
|
28
|
-
when :close then
|
29
|
-
q.text "[close #{@name}]"
|
30
|
-
when :self then
|
31
|
-
pretty_print_tag 'empty', q
|
32
|
-
when nil then
|
33
|
-
pretty_print_tag 'open ', q
|
34
|
-
else
|
35
|
-
raise "Unknown closing #{@closing.inspect}"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def pretty_print_tag(type, q)
|
40
|
-
q.group 1, "(#{type} #{@name.inspect}", ')' do
|
41
|
-
unless @attributes.empty? then
|
42
|
-
q.breakable
|
43
|
-
q.pp @attributes
|
44
|
-
end
|
45
|
-
unless children_without_newlines.empty? then
|
46
|
-
q.breakable
|
47
|
-
q.group 1, '[', ']' do
|
48
|
-
q.seplist children_without_newlines do |v|
|
49
|
-
q.pp v
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class HTML::Text
|
58
|
-
def content_without_whitespace
|
59
|
-
@content.gsub(/^[ ]+/, '').sub(/[ ]+\Z/, '')
|
60
|
-
end
|
61
|
-
|
62
|
-
def pretty_print(q)
|
63
|
-
q.pp content_without_whitespace
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
class HTML::CDATA
|
68
|
-
def pretty_print(q)
|
69
|
-
q.group 1, '[', ']' do
|
70
|
-
q.pp @content
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'code_statistics'
|
2
|
-
|
3
|
-
def define_test_task(test_type)
|
4
|
-
desc "Run the #{test_type} tests in test/#{test_type}s"
|
5
|
-
Rake::TestTask.new "#{test_type}s" => [ 'db:test:prepare' ] do |t|
|
6
|
-
t.libs << 'test'
|
7
|
-
t.pattern = "test/#{test_type}s/**/*_test.rb"
|
8
|
-
t.verbose = true
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
namespace :test do
|
13
|
-
define_test_task 'helper'
|
14
|
-
define_test_task 'view'
|
15
|
-
define_test_task 'controller'
|
16
|
-
end
|
17
|
-
|
18
|
-
desc 'Run all tests'
|
19
|
-
task :test => %w[
|
20
|
-
test:units
|
21
|
-
test:controllers
|
22
|
-
test:helpers
|
23
|
-
test:views
|
24
|
-
test:functionals
|
25
|
-
test:integration
|
26
|
-
]
|
27
|
-
|
28
|
-
dirs = [
|
29
|
-
%w[Libraries lib/],
|
30
|
-
%w[Models app/models],
|
31
|
-
%w[Unit\ tests test/unit],
|
32
|
-
%w[Helpers app/helpers],
|
33
|
-
%w[Helper\ tests test/helpers],
|
34
|
-
%w[Components components],
|
35
|
-
%w[Controllers app/controllers],
|
36
|
-
%w[Controller\ tests test/controllers],
|
37
|
-
%w[View\ tests test/views],
|
38
|
-
%w[Functional\ tests test/functional],
|
39
|
-
%w[Integration\ tests test/integration],
|
40
|
-
%w[APIs app/apis],
|
41
|
-
]
|
42
|
-
|
43
|
-
dirs = dirs.map { |name, dir| [name, File.join(RAILS_ROOT, dir)] }
|
44
|
-
dirs = dirs.select { |name, dir| File.directory? dir }
|
45
|
-
|
46
|
-
STATS_DIRECTORIES.replace dirs
|
47
|
-
|
48
|
-
new_test_types = ['Controller tests', 'Helper tests', 'View tests']
|
49
|
-
CodeStatistics::TEST_TYPES.push(*new_test_types)
|
50
|
-
|
@@ -1,93 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# test/rails/render_tree.rb adds debug rendering to ActionView::Base#render.
|
3
|
-
#
|
4
|
-
# Debug rendering prints out a tree of calls to render allowing you to easily
|
5
|
-
# visualize where rendering occurs in unfamiliar code.
|
6
|
-
|
7
|
-
class ActionView::Base
|
8
|
-
|
9
|
-
alias plain_render render # :nodoc:
|
10
|
-
|
11
|
-
##
|
12
|
-
# List of render types for ActionView::Base#render
|
13
|
-
|
14
|
-
RENDERS = [:partial, :template, :file, :action, :text, :inline, :nothing,
|
15
|
-
:update]
|
16
|
-
|
17
|
-
##
|
18
|
-
# Add debug output to rendering.
|
19
|
-
#
|
20
|
-
# When you include lib/rails/render_tree a tree of renders will be displayed
|
21
|
-
# in the console. This is especially useful when writing tests.
|
22
|
-
#
|
23
|
-
# This test:
|
24
|
-
#
|
25
|
-
# require 'test/test_helper'
|
26
|
-
# require 'test/rails/render_tree'
|
27
|
-
#
|
28
|
-
# class ThingsViewTest < Test::Rails::ViewTestCase
|
29
|
-
#
|
30
|
-
# fixtures :goals
|
31
|
-
#
|
32
|
-
# def test_body
|
33
|
-
# assigns[:goal] = goals(:first)
|
34
|
-
# assigns[:related_goals_moved] = []
|
35
|
-
# assigns[:related_goals_instead] = []
|
36
|
-
#
|
37
|
-
# render :partial => 'things/body'
|
38
|
-
#
|
39
|
-
# assert_tag :tag => 'div', :attributes => { :id => 'entriesbucket' }
|
40
|
-
# end
|
41
|
-
#
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# Will give this output when run:
|
45
|
-
#
|
46
|
-
# $ ruby test/views/things_view_test.rb -n test_body
|
47
|
-
# Loaded suite test/views/things_view_test
|
48
|
-
# Started
|
49
|
-
# "things/_body"
|
50
|
-
# :partial => "widgets/goals_gallery_teaser"
|
51
|
-
# "widgets/_goals_gallery_teaser"
|
52
|
-
# :partial => "entries_bucket"
|
53
|
-
# "things/_entries_bucket"
|
54
|
-
# :partial => "things/ask_a_question"
|
55
|
-
# "things/_ask_a_question"
|
56
|
-
# "widgets/forms/related_goals"
|
57
|
-
# .
|
58
|
-
# Finished in 1.293523 seconds.
|
59
|
-
#
|
60
|
-
# 1 tests, 1 assertions, 0 failures, 0 errors
|
61
|
-
|
62
|
-
def render(*args)
|
63
|
-
@level ||= 0
|
64
|
-
|
65
|
-
print ' ' * @level
|
66
|
-
|
67
|
-
case args.first
|
68
|
-
when String then
|
69
|
-
p args.first
|
70
|
-
when Hash then
|
71
|
-
hash = args.first
|
72
|
-
if hash.include? :collection and hash.include? :partial then
|
73
|
-
puts "%p => %p" % [:collection, hash[:partial]]
|
74
|
-
else
|
75
|
-
found = hash.keys & RENDERS
|
76
|
-
if found.length == 1 then
|
77
|
-
puts "%p => %p" % [found.first, hash[found.first]]
|
78
|
-
else
|
79
|
-
raise "Dunno: %p" % [hash]
|
80
|
-
end
|
81
|
-
end
|
82
|
-
else
|
83
|
-
raise "Dunno: %p" % [args]
|
84
|
-
end
|
85
|
-
|
86
|
-
@level += 1
|
87
|
-
result = plain_render(*args)
|
88
|
-
@level -= 1
|
89
|
-
result
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
|
data/lib/test/rails/test_case.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# Test::Rails::TestCase is an abstract test case for Test::Rails test cases.
|
3
|
-
#--
|
4
|
-
# Eventually this will hold the fixture setup stuff.
|
5
|
-
|
6
|
-
class Test::Rails::TestCase < Test::Unit::TestCase
|
7
|
-
|
8
|
-
undef_method :default_test
|
9
|
-
|
10
|
-
# Set defaults because Rails has poor ones (and these don't inherit properly)
|
11
|
-
self.use_transactional_fixtures = true
|
12
|
-
self.use_instantiated_fixtures = false
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
module Test::Unit::Assertions
|
17
|
-
##
|
18
|
-
# TODO: should this go in this file?
|
19
|
-
# Asserts that model indeed has a given callback
|
20
|
-
#
|
21
|
-
# assert_callback(Model, :before_save, :something)
|
22
|
-
|
23
|
-
def assert_callback(model_class, callback, method_name, message=nil)
|
24
|
-
vars = model_class.instance_variable_get(:@inheritable_attributes)
|
25
|
-
assert vars.has_key?(callback), message
|
26
|
-
assert_include vars[callback], method_name, message
|
27
|
-
end
|
28
|
-
end
|
@@ -1,597 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# ViewTestCase allows views to be tested independent of their controllers.
|
3
|
-
# Testcase implementors must set up the instance variables the view needs to
|
4
|
-
# render itself.
|
5
|
-
#
|
6
|
-
# = Features
|
7
|
-
#
|
8
|
-
# * Allows testing of individual AJAX templates.
|
9
|
-
# * Allows testing of individual partials.
|
10
|
-
# * Large library of helpful assertions.
|
11
|
-
#
|
12
|
-
# = Naming
|
13
|
-
#
|
14
|
-
# The test class must be named after your controller class name, so if you're
|
15
|
-
# testing views for the +RouteController+ you would name your test case
|
16
|
-
# +RouteViewTest+. The test case will expect to find your view files in
|
17
|
-
# <tt>app/views/route</tt>.
|
18
|
-
#
|
19
|
-
# The test names should be in the form of +test_view_edgecase+ where 'view'
|
20
|
-
# corresponds to the name of the view file, and 'edgecase' describes the
|
21
|
-
# scenario you are testing.
|
22
|
-
#
|
23
|
-
# If you are testing a view file named 'show.rhtml' your test should be named
|
24
|
-
# +test_show+. If your view is behaves differently depending upon its
|
25
|
-
# parameters then you can make the test name descriptive like
|
26
|
-
# +test_show_photos+ and +test_show_no_photos+.
|
27
|
-
#
|
28
|
-
# = Examples
|
29
|
-
#
|
30
|
-
# == Typical View Test
|
31
|
-
#
|
32
|
-
# class RouteViewTest < Test::Rails::ViewTestCase
|
33
|
-
#
|
34
|
-
# fixtures :users, :routes, :points, :photos
|
35
|
-
#
|
36
|
-
# def test_delete
|
37
|
-
# # Set up instance variables for template
|
38
|
-
# assigns[:loggedin_user] = users(:herbert)
|
39
|
-
# assigns[:route] = routes(:work)
|
40
|
-
#
|
41
|
-
# # render template for the delete action in RouteController
|
42
|
-
# render
|
43
|
-
#
|
44
|
-
# # assert that there's a form with an action of "/route/destroy"
|
45
|
-
# assert_form form_url, :post do
|
46
|
-
# # with a hidden id field
|
47
|
-
# assert_input :hidden, :id
|
48
|
-
# # And a submit button that says 'Delete!'
|
49
|
-
# assert_submit 'Delete!'
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
# # And a link back to the route so you don't delete it
|
53
|
-
# assert_links_to "/route/show/#{routes(:work).id}", 'No, I do not!'
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# end
|
57
|
-
#
|
58
|
-
# == Typical Layout Test
|
59
|
-
#
|
60
|
-
# require 'test/test_helper'
|
61
|
-
#
|
62
|
-
# # Create a dummy controller for layout views. This lets the setup use the
|
63
|
-
# # right path with minimum fuss.
|
64
|
-
# class LayoutsController < ApplicationController; end
|
65
|
-
#
|
66
|
-
# class LayoutsViewTest < Test::Rails::ViewTestCase
|
67
|
-
#
|
68
|
-
# fixtures :users, :routes, :points, :photos
|
69
|
-
#
|
70
|
-
# def test_default
|
71
|
-
# # Template set-up
|
72
|
-
# @request.request_uri = '/foo'
|
73
|
-
# assigns[:action_title] = 'Hello & Goodbye'
|
74
|
-
#
|
75
|
-
# # Render an empty string with the 'application' layout.
|
76
|
-
# render :text => '', :layout => 'application'
|
77
|
-
#
|
78
|
-
# # Assert content just like a regular view test.
|
79
|
-
# assert_links_to '/', 'Home'
|
80
|
-
# assert_links_to '/user', 'Login'
|
81
|
-
# deny_links_to '/user/logout', 'Logout'
|
82
|
-
# assert_title 'Hello & Goodbye'
|
83
|
-
# assert_h 1, 'Hello & Goodbye'
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# end
|
87
|
-
#
|
88
|
-
# = Deprecated Features
|
89
|
-
#
|
90
|
-
# Form assertions are now using assert_select, so you don't need to pass URLs
|
91
|
-
# around everywhere and can instead use a block. (See above example).
|
92
|
-
#
|
93
|
-
# The form assertions will still work using the old syntax, but in a future
|
94
|
-
# release they will give warnings, then will be removed.
|
95
|
-
|
96
|
-
class Test::Rails::ViewTestCase < Test::Rails::FunctionalTestCase
|
97
|
-
|
98
|
-
self.use_transactional_fixtures = true
|
99
|
-
self.use_instantiated_fixtures = false
|
100
|
-
|
101
|
-
##
|
102
|
-
# Sets up the test case.
|
103
|
-
|
104
|
-
def setup
|
105
|
-
return if self.class == Test::Rails::ViewTestCase
|
106
|
-
|
107
|
-
@path_parameters ||= {}
|
108
|
-
|
109
|
-
klass_name = self.class.name.sub(/View/, 'Controller')
|
110
|
-
@controller_class_name ||= klass_name.sub 'Test', ''
|
111
|
-
|
112
|
-
super
|
113
|
-
|
114
|
-
@ivar_proxy = Test::Rails::IvarProxy.new @controller
|
115
|
-
|
116
|
-
# these go here so that flash and session work as they should.
|
117
|
-
@controller.send :initialize_template_class, @response
|
118
|
-
@controller.send :assign_shortcuts, @request, @response
|
119
|
-
|
120
|
-
assigns[:session] = @controller.session
|
121
|
-
@controller.class.send :public, :flash # make flash accessible to the test
|
122
|
-
end
|
123
|
-
|
124
|
-
##
|
125
|
-
# Allows the view instance variables to be set like flash:
|
126
|
-
#
|
127
|
-
# test:
|
128
|
-
# def test_show
|
129
|
-
# assigns[:route] = routes(:work)
|
130
|
-
|
131
|
-
def assigns
|
132
|
-
@ivar_proxy
|
133
|
-
end
|
134
|
-
|
135
|
-
##
|
136
|
-
# Renders the template. The template is determined from the test name. If
|
137
|
-
# you have multiple tests for the same view render will try to Do The Right
|
138
|
-
# Thing and remove parts of the name looking for the template file.
|
139
|
-
#
|
140
|
-
# By default, render has the added option <tt>:layout => false</tt>,
|
141
|
-
# so if want to test behavior in your layout add <tt>:layout => true</tt>.
|
142
|
-
#
|
143
|
-
# The action can be forced by using the options:
|
144
|
-
#
|
145
|
-
# render :action => 'new'
|
146
|
-
#
|
147
|
-
# render :template => 'profile/index'
|
148
|
-
#
|
149
|
-
# A test's path parameters may be overridden, allowing routes with
|
150
|
-
# additional parameters to work.
|
151
|
-
#
|
152
|
-
# == Working with Routes
|
153
|
-
#
|
154
|
-
# By default, a view tests sets the controller and action of a test to the
|
155
|
-
# controller name and action name for the test. This may be overriden.
|
156
|
-
#
|
157
|
-
# A test involving routes like:
|
158
|
-
#
|
159
|
-
# map.workspace '/users/:owner/workspace/:action',
|
160
|
-
# :controller => 'workspace', :action => 'workspace'
|
161
|
-
#
|
162
|
-
# Can be invoked by setting @path_parameters like this:
|
163
|
-
#
|
164
|
-
# def test__app_entry
|
165
|
-
# @path_parameters[:owner] = 'bob'
|
166
|
-
# @path_parameters[:action] = 'apps'
|
167
|
-
#
|
168
|
-
# render :partial => 'apps/app_entry'
|
169
|
-
#
|
170
|
-
# # ...
|
171
|
-
# end
|
172
|
-
#
|
173
|
-
# == View Lookup
|
174
|
-
#
|
175
|
-
# render strips off words trailing an _ in the test name one at a time until
|
176
|
-
# it finds a matching action. It tries the extensions 'rhtml', 'rxml',
|
177
|
-
# 'rjs', and 'mab' in order for each action until a view is found.
|
178
|
-
#
|
179
|
-
# With this test case:
|
180
|
-
#
|
181
|
-
# class RouteViewTest < Test::Rails::ViewTestCase
|
182
|
-
# def test_show_photos
|
183
|
-
# render
|
184
|
-
# end
|
185
|
-
# def test_show_no_photos
|
186
|
-
# render
|
187
|
-
# end
|
188
|
-
# end
|
189
|
-
#
|
190
|
-
# In test_show_photos, render will look for:
|
191
|
-
# * app/views/route/show_photos.rhtml
|
192
|
-
# * app/views/route/show_photos.rxml
|
193
|
-
# * app/views/route/show_photos.rjs
|
194
|
-
# * app/views/route/show_photos.mab
|
195
|
-
# * app/views/route/show.[...]
|
196
|
-
#
|
197
|
-
# And in test_show_no_photos, render will look for:
|
198
|
-
# * app/views/route/show_no_photos.rhtml
|
199
|
-
# * app/views/route/show_no_photos.rxml
|
200
|
-
# * app/views/route/show_no_photos.rjs
|
201
|
-
# * app/views/route/show_no_photos.mab
|
202
|
-
# * app/views/route/show_no.[...]
|
203
|
-
# * app/views/route/show.[...]
|
204
|
-
#
|
205
|
-
# If a view cannot be found the test will flunk.
|
206
|
-
|
207
|
-
def render(options = {}, deprecated_status = nil)
|
208
|
-
@action_name = action_name caller[0] if options.empty?
|
209
|
-
assigns[:action_name] = @action_name
|
210
|
-
|
211
|
-
default_path_parameters = {
|
212
|
-
:controller => @controller.controller_name,
|
213
|
-
:action => @action_name
|
214
|
-
}
|
215
|
-
|
216
|
-
path_parameters = default_path_parameters.merge(@path_parameters)
|
217
|
-
|
218
|
-
@request.path_parameters = path_parameters
|
219
|
-
|
220
|
-
defaults = { :layout => false }
|
221
|
-
options = defaults.merge options
|
222
|
-
|
223
|
-
if Test::Rails.rails_version >= Test::Rails.v1_2 then
|
224
|
-
@controller.send :params=, @request.parameters
|
225
|
-
else
|
226
|
-
@controller.instance_variable_set :@params, @request.parameters
|
227
|
-
end
|
228
|
-
@controller.send :initialize_current_url
|
229
|
-
current_url = URI.parse @controller.url_for
|
230
|
-
@request.request_uri = current_url.request_uri
|
231
|
-
|
232
|
-
# Rails 1.0
|
233
|
-
@controller.send :assign_names rescue nil
|
234
|
-
@controller.send :fire_flash rescue nil
|
235
|
-
|
236
|
-
# Rails 1.1
|
237
|
-
@controller.send :forget_variables_added_to_assigns rescue nil
|
238
|
-
|
239
|
-
# Do the render
|
240
|
-
options[:TR_force] = true
|
241
|
-
@controller.render options, deprecated_status
|
242
|
-
|
243
|
-
# Rails 1.1
|
244
|
-
@controller.send :process_cleanup rescue nil
|
245
|
-
end
|
246
|
-
|
247
|
-
##
|
248
|
-
# Asserts that there is an error on +field+ of type +type+.
|
249
|
-
|
250
|
-
def assert_error_on(field, type)
|
251
|
-
error_message = ActiveRecord::Errors.default_error_messages[type]
|
252
|
-
assert_select "div.errorExplanation li",
|
253
|
-
:text => /^#{field} #{error_message}/i
|
254
|
-
end
|
255
|
-
|
256
|
-
##
|
257
|
-
# A wrapper assert that calls both assert_input and assert_label.
|
258
|
-
#
|
259
|
-
# view:
|
260
|
-
# <%= start_form_tag :controller => 'game', :action => 'save' %>
|
261
|
-
# <label for="game_amount">Amount:</label>
|
262
|
-
# <% text_field 'game', 'amount' %>
|
263
|
-
#
|
264
|
-
# test:
|
265
|
-
# assert_field '/game/save', :text, :game, :amount
|
266
|
-
|
267
|
-
def assert_field(*args)
|
268
|
-
form_action, type, model, column, value =
|
269
|
-
Symbol === args.first ? [nil, *args] : args
|
270
|
-
|
271
|
-
if form_action then # HACK deprecate
|
272
|
-
assert_input form_action, type, "#{model}[#{column}]", value
|
273
|
-
assert_label form_action, "#{model}_#{column}"
|
274
|
-
else
|
275
|
-
assert_input type, "#{model}[#{column}]", value
|
276
|
-
assert_label "#{model}_#{column}"
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
##
|
281
|
-
# Asserts that there is a form whose action is +form_action+. Optionally,
|
282
|
-
# +method+ and +enctype+ may be specified. If a block is given, assert_form
|
283
|
-
# behaves like assert_select, so assert_input and friends may be scoped to
|
284
|
-
# the selected form.
|
285
|
-
#
|
286
|
-
# view:
|
287
|
-
# <%= start_form_tag :action => 'create_file' %>
|
288
|
-
# # ...
|
289
|
-
#
|
290
|
-
# test:
|
291
|
-
# assert_form '/game/save'
|
292
|
-
#
|
293
|
-
# or:
|
294
|
-
# assert_form '/game/save' do
|
295
|
-
# # ...
|
296
|
-
# end
|
297
|
-
|
298
|
-
def assert_form(form_action, method = nil, enctype = nil, &block)
|
299
|
-
selector = "form[action='#{form_action}']"
|
300
|
-
selector << "[method='#{method}']" if method
|
301
|
-
selector << "[enctype='#{enctype}']" if enctype
|
302
|
-
assert_select selector, &block
|
303
|
-
end
|
304
|
-
|
305
|
-
##
|
306
|
-
# Asserts a hN tag of level +level+ exists and contains +content+.
|
307
|
-
#
|
308
|
-
# view:
|
309
|
-
# <h3>Recent Builds</h3>
|
310
|
-
#
|
311
|
-
# test:
|
312
|
-
# assert_h 3, 'Recent Builds'
|
313
|
-
|
314
|
-
def assert_h(level, content)
|
315
|
-
assert_select "h#{level}", :text => content
|
316
|
-
end
|
317
|
-
|
318
|
-
##
|
319
|
-
# Asserts that an image exists with a src of +src+.
|
320
|
-
#
|
321
|
-
# view:
|
322
|
-
# <img src="/images/bucket.jpg" alt="Bucket">
|
323
|
-
#
|
324
|
-
# test:
|
325
|
-
# assert_image '/images/bucket.jpg'
|
326
|
-
|
327
|
-
def assert_image(src)
|
328
|
-
assert_select "img[src='#{src}']"
|
329
|
-
end
|
330
|
-
|
331
|
-
##
|
332
|
-
# Asserts that an input element of +type+ with a name of +name+, and
|
333
|
-
# optionally a value of +value+ exists.
|
334
|
-
#
|
335
|
-
# view:
|
336
|
-
# <%= text_field 'game', 'amount' %>
|
337
|
-
#
|
338
|
-
# test:
|
339
|
-
# assert_input :text, "game[amount]"
|
340
|
-
|
341
|
-
def assert_input(*args)
|
342
|
-
action, type, name, value = Symbol === args.first ? [nil, *args] : args
|
343
|
-
|
344
|
-
raise ArgumentError, 'supply type and name' if type.nil? or name.nil?
|
345
|
-
|
346
|
-
input_selector = "input[type='#{type}'][name='#{name}']"
|
347
|
-
input_selector << "[value='#{value}']" if value
|
348
|
-
|
349
|
-
assert_select_in_form action do assert_select input_selector end
|
350
|
-
end
|
351
|
-
|
352
|
-
##
|
353
|
-
# Asserts that a label with a for attribute of +for_attribute+ exists.
|
354
|
-
#
|
355
|
-
# view:
|
356
|
-
# <%= start_form_tag :controller => 'game', :action => 'save' %>
|
357
|
-
# <label for="game_amount">Amount:</label>
|
358
|
-
#
|
359
|
-
# test:
|
360
|
-
# assert_label 'game_amount'
|
361
|
-
|
362
|
-
def assert_label(*args)
|
363
|
-
action, for_attribute = args.length == 1 ? [nil, *args] : args
|
364
|
-
|
365
|
-
raise ArgumentError, 'supply for_attribute' if for_attribute.nil?
|
366
|
-
|
367
|
-
label_selector = "label[for='#{for_attribute}']"
|
368
|
-
|
369
|
-
assert_select_in_form action do assert_select label_selector end
|
370
|
-
end
|
371
|
-
|
372
|
-
##
|
373
|
-
# Asserts that there is an anchor tag with an href of +href+ that optionally
|
374
|
-
# has +content+.
|
375
|
-
#
|
376
|
-
# view:
|
377
|
-
# <%= link_to 'drbrain', :model => user %>
|
378
|
-
#
|
379
|
-
# test:
|
380
|
-
# assert_links_to '/players/show/1', 'drbrain'
|
381
|
-
|
382
|
-
def assert_links_to(href, content = nil)
|
383
|
-
assert_select(*links_to_options_for(href, content))
|
384
|
-
end
|
385
|
-
|
386
|
-
##
|
387
|
-
# Denies the existence of an anchor tag with an href of +href+ and
|
388
|
-
# optionally +content+.
|
389
|
-
#
|
390
|
-
# view (for /players/show/1):
|
391
|
-
# <%= link_to_unless_current 'drbrain', :model => user %>
|
392
|
-
#
|
393
|
-
# test:
|
394
|
-
# deny_links_to '/players/show/1'
|
395
|
-
|
396
|
-
def deny_links_to(href, content = nil)
|
397
|
-
selector, options = links_to_options_for(href, content)
|
398
|
-
options[:count] = 0
|
399
|
-
|
400
|
-
assert_select selector, options
|
401
|
-
end
|
402
|
-
|
403
|
-
##
|
404
|
-
# Asserts that there is a form using the 'POST' method whose action is
|
405
|
-
# +form_action+ and uses the multipart content type. If passed a block,
|
406
|
-
# works like assert_form.
|
407
|
-
#
|
408
|
-
# view:
|
409
|
-
# <%= start_form_tag({ :action => 'create_file' }, :multipart => true) %>
|
410
|
-
#
|
411
|
-
# test:
|
412
|
-
# assert_multipart_form '/game/save'
|
413
|
-
|
414
|
-
def assert_multipart_form(form_action, &block)
|
415
|
-
assert_form(form_action, :post, 'multipart/form-data', &block)
|
416
|
-
end
|
417
|
-
|
418
|
-
##
|
419
|
-
# Asserts that there is a form using the 'POST' method whose action is
|
420
|
-
# +form_action+. If passed a block, works like assert_form.
|
421
|
-
#
|
422
|
-
# view:
|
423
|
-
# <%= start_form_tag :action => 'create_file' %>
|
424
|
-
#
|
425
|
-
# test:
|
426
|
-
# assert_post_form '/game/save'
|
427
|
-
|
428
|
-
def assert_post_form(form_action, &block)
|
429
|
-
assert_form(form_action, :post, &block)
|
430
|
-
end
|
431
|
-
|
432
|
-
##
|
433
|
-
# Asserts that a select element with a name of "+model+[+column+]" and
|
434
|
-
# +options+ with specified names and values exists.
|
435
|
-
#
|
436
|
-
# view:
|
437
|
-
# <%= collection_select :game, :location_id, @locations, :id, :name %>
|
438
|
-
#
|
439
|
-
# test:
|
440
|
-
# assert_select_tag :game, :location_id, 'Ballet' => 1, 'Guaymas' => 2
|
441
|
-
|
442
|
-
def assert_select_tag(*args)
|
443
|
-
action, model, column, options = Symbol === args.first ? [nil, *args] : args
|
444
|
-
|
445
|
-
assert_kind_of Hash, options, "options needs to be a Hash"
|
446
|
-
deny options.empty?, "options must not be empty"
|
447
|
-
|
448
|
-
select_selector = "select[name='#{model}[#{column}]']"
|
449
|
-
|
450
|
-
options.each do |option_name, option_value|
|
451
|
-
option_selector = "option[value='#{option_value}']"
|
452
|
-
selector = "#{select_selector} #{option_selector}"
|
453
|
-
|
454
|
-
assert_select_in_form action do
|
455
|
-
assert_select selector, :text => option_name
|
456
|
-
end
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
##
|
461
|
-
# Asserts that a submit element with a value of +value+ exists.
|
462
|
-
#
|
463
|
-
# view:
|
464
|
-
# <input type="submit" value="Create!" %>
|
465
|
-
#
|
466
|
-
# test:
|
467
|
-
# assert_submit 'Create!'
|
468
|
-
|
469
|
-
def assert_submit(*args)
|
470
|
-
action, value = args.length == 1 ? [nil, *args] : args
|
471
|
-
|
472
|
-
submit_selector = "input[type='submit'][value='#{value}']"
|
473
|
-
|
474
|
-
assert_select_in_form action do assert_select submit_selector end
|
475
|
-
end
|
476
|
-
|
477
|
-
##
|
478
|
-
# Asserts that a form with +form_action+ has a descendent that matches
|
479
|
-
# +options+ exists.
|
480
|
-
#
|
481
|
-
# Typically this is not used directly in tests. Instead use it to build
|
482
|
-
# expressive tests that assert which fields are in what form.
|
483
|
-
#
|
484
|
-
# view:
|
485
|
-
# <%= start_form_tag :action => 'save' %>
|
486
|
-
# [...]
|
487
|
-
#
|
488
|
-
# test:
|
489
|
-
# assert_tag_in_form '/route/save', :tag => 'table'
|
490
|
-
|
491
|
-
def assert_tag_in_form(form_action, options)
|
492
|
-
assert_tag :tag => 'form', :attributes => { :action => form_action },
|
493
|
-
:descendant => options
|
494
|
-
end
|
495
|
-
|
496
|
-
##
|
497
|
-
# Asserts that a textarea with name +name+ and optionally +value+ exists.
|
498
|
-
#
|
499
|
-
# view:
|
500
|
-
# <%= text_area 'post', 'body' %>
|
501
|
-
#
|
502
|
-
# test:
|
503
|
-
# assert_text_area 'post[body]'
|
504
|
-
#
|
505
|
-
# view:
|
506
|
-
# <textarea id="post_body" name="post[body]">
|
507
|
-
# <%= @post.body %>
|
508
|
-
# </textarea>
|
509
|
-
#
|
510
|
-
# test:
|
511
|
-
# assert_text_area 'post[body]', posts(:post).body
|
512
|
-
|
513
|
-
def assert_text_area(*args)
|
514
|
-
action, name, value = args.first !~ /\A\// ? [nil, *args] : args
|
515
|
-
|
516
|
-
raise ArgumentError, 'supply name' if name.nil?
|
517
|
-
|
518
|
-
text_area_selector = ["textarea[name='#{name}']"]
|
519
|
-
text_area_selector << { :text => value } if value
|
520
|
-
|
521
|
-
assert_select_in_form action do assert_select(*text_area_selector) end
|
522
|
-
end
|
523
|
-
|
524
|
-
alias assert_textarea assert_text_area
|
525
|
-
|
526
|
-
##
|
527
|
-
# Asserts that a title with +title+ exists.
|
528
|
-
#
|
529
|
-
# view:
|
530
|
-
# <title>some content</title>
|
531
|
-
#
|
532
|
-
# test:
|
533
|
-
# assert_title 'some content'
|
534
|
-
|
535
|
-
def assert_title(title)
|
536
|
-
assert_select 'title', :text => title
|
537
|
-
end
|
538
|
-
|
539
|
-
##
|
540
|
-
# Opposite of assert_select.
|
541
|
-
|
542
|
-
def deny_select(selector)
|
543
|
-
assert_select selector, false
|
544
|
-
end
|
545
|
-
|
546
|
-
##
|
547
|
-
# Creates a new Paginator that uses the current controller. +item_count+,
|
548
|
-
# +items_per_page+ and +page_number+ are passed straight through.
|
549
|
-
|
550
|
-
def util_make_paginator(item_count, items_per_page, page_number)
|
551
|
-
ActionController::Pagination::Paginator.new(@controller, item_count,
|
552
|
-
items_per_page, page_number)
|
553
|
-
end
|
554
|
-
|
555
|
-
##
|
556
|
-
# Utility method for compatibility with old-style assert_tag form
|
557
|
-
# assertions.
|
558
|
-
|
559
|
-
def assert_select_in_form(action, &block) # :nodoc:
|
560
|
-
if action then
|
561
|
-
assert_form(action, &block)
|
562
|
-
else
|
563
|
-
block.call
|
564
|
-
end
|
565
|
-
end
|
566
|
-
|
567
|
-
##
|
568
|
-
# Creates an assertion options hash for +href+ and +content+.
|
569
|
-
|
570
|
-
def links_to_options_for(href, content = nil)
|
571
|
-
selector = "a[href='#{href}']"
|
572
|
-
equality = content ? { :text => content } : {}
|
573
|
-
return selector, equality
|
574
|
-
end
|
575
|
-
|
576
|
-
##
|
577
|
-
# Returns the action_name based on a backtrace line passed in as +test+.
|
578
|
-
|
579
|
-
def action_name(test)
|
580
|
-
orig_name = test = test.sub(/.*in `test_(.*)'/, '\1')
|
581
|
-
controller = @controller.class.name.sub('Controller', '').underscore
|
582
|
-
|
583
|
-
extensions = %w[rhtml rxml rjs mab]
|
584
|
-
|
585
|
-
while test =~ /_/ do
|
586
|
-
return test if extensions.any? { |ext| File.file? "app/views/#{controller}/#{test}.#{ext}" }
|
587
|
-
|
588
|
-
test = test.sub(/_[^_]+$/, '')
|
589
|
-
end
|
590
|
-
|
591
|
-
return test if extensions.any? { |ext| File.file? "app/views/#{controller}/#{test}.#{ext}" }
|
592
|
-
|
593
|
-
flunk "Couldn't find view for test_#{orig_name}"
|
594
|
-
end
|
595
|
-
|
596
|
-
end
|
597
|
-
|