Skip to content

Commit

Permalink
Introduce ActionView::TestCase for testing view helpers.
Browse files Browse the repository at this point in the history
  • Loading branch information
josh committed Apr 19, 2008
1 parent ef4c650 commit 17d4164
Show file tree
Hide file tree
Showing 21 changed files with 190 additions and 131 deletions.
6 changes: 4 additions & 2 deletions actionpack/lib/action_view.rb
Expand Up @@ -38,6 +38,8 @@

ActionView::Base.class_eval do
include ActionView::Partials
end

ActionView::Base.load_helpers
ActionView::Base.helper_modules.each do |helper_module|
include helper_module
end
end
10 changes: 6 additions & 4 deletions actionpack/lib/action_view/base.rb
Expand Up @@ -205,15 +205,17 @@ module CompiledTemplates #:nodoc:
class ObjectWrapper < Struct.new(:value) #:nodoc:
end

def self.load_helpers #:nodoc:
Dir.entries("#{File.dirname(__FILE__)}/helpers").sort.each do |file|
def self.helper_modules #:nodoc:
helpers = []
Dir.entries(File.expand_path("#{File.dirname(__FILE__)}/helpers")).sort.each do |file|
next unless file =~ /^([a-z][a-z_]*_helper).rb$/
require "action_view/helpers/#{$1}"
helper_module_name = $1.camelize
if Helpers.const_defined?(helper_module_name)
include Helpers.const_get(helper_module_name)
helpers << Helpers.const_get(helper_module_name)
end
end
return helpers
end

def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil)#:nodoc:
Expand Down Expand Up @@ -323,7 +325,7 @@ def template_format
end
end

private
private
def wrap_content_for_layout(content)
original_content_for_layout = @content_for_layout
@content_for_layout = content
Expand Down
64 changes: 64 additions & 0 deletions actionpack/lib/action_view/test_case.rb
@@ -0,0 +1,64 @@
require 'active_support/test_case'

module ActionView
class NonInferrableHelperError < ActionViewError
def initialize(name)
super "Unable to determine the helper to test from #{name}. " +
"You'll need to specify it using tests YourHelper in your " +
"test case definition"
end
end

class TestCase < ActiveSupport::TestCase
class_inheritable_accessor :helper_class
@@helper_class = nil

class << self
def tests(helper_class)
self.helper_class = helper_class
end

def helper_class
if current_helper_class = read_inheritable_attribute(:helper_class)
current_helper_class
else
self.helper_class = determine_default_helper_class(name)
end
end

def determine_default_helper_class(name)
name.sub(/Test$/, '').constantize
rescue NameError
raise NonInferrableHelperError.new(name)
end
end

ActionView::Base.helper_modules.each do |helper_module|
include helper_module
end
include ActionController::PolymorphicRoutes
include ActionController::RecordIdentifier

setup :setup_with_helper_class

def setup_with_helper_class
self.class.send(:include, helper_class)
end

class TestController < ActionController::Base
attr_accessor :request, :response

def initialize
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
end

private
def method_missing(selector, *args)
controller = TestController.new
return controller.send!(selector, *args) if ActionController::Routing::Routes.named_routes.helpers.include?(selector)
super
end
end
end
1 change: 1 addition & 0 deletions actionpack/test/abstract_unit.rb
Expand Up @@ -8,6 +8,7 @@
require 'action_controller'
require 'action_controller/cgi_ext'
require 'action_controller/test_process'
require 'action_view/test_case'

begin
require 'ruby-debug'
Expand Down
9 changes: 2 additions & 7 deletions actionpack/test/template/active_record_helper_test.rb
@@ -1,12 +1,7 @@
require 'abstract_unit'

class ActiveRecordHelperTest < Test::Unit::TestCase
include ActionView::Helpers::FormHelper
include ActionView::Helpers::ActiveRecordHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::FormTagHelper
class ActiveRecordHelperTest < ActionView::TestCase
tests ActionView::Helpers::ActiveRecordHelper

silence_warnings do
Post = Struct.new("Post", :title, :author_name, :body, :secret, :written_on)
Expand Down
12 changes: 4 additions & 8 deletions actionpack/test/template/asset_tag_helper_test.rb
@@ -1,9 +1,7 @@
require 'abstract_unit'

class AssetTagHelperTest < Test::Unit::TestCase
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::AssetTagHelper
class AssetTagHelperTest < ActionView::TestCase
tests ActionView::Helpers::AssetTagHelper

def setup
silence_warnings do
Expand Down Expand Up @@ -445,10 +443,8 @@ def test_caching_stylesheet_include_tag_when_caching_off
end
end

class AssetTagHelperNonVhostTest < Test::Unit::TestCase
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::AssetTagHelper
class AssetTagHelperNonVhostTest < ActionView::TestCase
tests ActionView::Helpers::AssetTagHelper

def setup
@controller = Class.new do
Expand Down
4 changes: 2 additions & 2 deletions actionpack/test/template/benchmark_helper_test.rb
@@ -1,8 +1,8 @@
require 'abstract_unit'
require 'action_view/helpers/benchmark_helper'

class BenchmarkHelperTest < Test::Unit::TestCase
include ActionView::Helpers::BenchmarkHelper
class BenchmarkHelperTest < ActionView::TestCase
tests ActionView::Helpers::BenchmarkHelper

class MockLogger
attr_reader :logged
Expand Down
5 changes: 2 additions & 3 deletions actionpack/test/template/date_helper_test.rb
@@ -1,8 +1,7 @@
require 'abstract_unit'

class DateHelperTest < Test::Unit::TestCase
include ActionView::Helpers::DateHelper
include ActionView::Helpers::FormHelper
class DateHelperTest < ActionView::TestCase
tests ActionView::Helpers::DateHelper

silence_warnings do
Post = Struct.new("Post", :id, :written_on, :updated_at)
Expand Down
11 changes: 2 additions & 9 deletions actionpack/test/template/form_helper_test.rb
Expand Up @@ -30,15 +30,8 @@ def name
class Comment::Nested < Comment; end


class FormHelperTest < Test::Unit::TestCase
include ActionView::Helpers::FormHelper
include ActionView::Helpers::FormTagHelper
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::ActiveRecordHelper
include ActionView::Helpers::RecordIdentificationHelper
include ActionController::PolymorphicRoutes
class FormHelperTest < ActionView::TestCase
tests ActionView::Helpers::FormHelper

def setup
@post = Post.new
Expand Down
5 changes: 2 additions & 3 deletions actionpack/test/template/form_options_helper_test.rb
Expand Up @@ -22,9 +22,8 @@ def to_s

ActionView::Helpers::FormOptionsHelper::TimeZone = MockTimeZone

class FormOptionsHelperTest < Test::Unit::TestCase
include ActionView::Helpers::FormHelper
include ActionView::Helpers::FormOptionsHelper
class FormOptionsHelperTest < ActionView::TestCase
tests ActionView::Helpers::FormOptionsHelper

silence_warnings do
Post = Struct.new('Post', :title, :author_name, :body, :secret, :written_on, :category, :origin)
Expand Down
8 changes: 2 additions & 6 deletions actionpack/test/template/form_tag_helper_test.rb
@@ -1,11 +1,7 @@
require 'abstract_unit'

class FormTagHelperTest < Test::Unit::TestCase
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::FormTagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::CaptureHelper
class FormTagHelperTest < ActionView::TestCase
tests ActionView::Helpers::FormTagHelper

def setup
@controller = Class.new do
Expand Down
10 changes: 2 additions & 8 deletions actionpack/test/template/javascript_helper_test.rb
@@ -1,13 +1,7 @@
require 'abstract_unit'

class JavaScriptHelperTest < Test::Unit::TestCase
include ActionView::Helpers::JavaScriptHelper

include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::FormHelper
include ActionView::Helpers::CaptureHelper
class JavaScriptHelperTest < ActionView::TestCase
tests ActionView::Helpers::JavaScriptHelper

def test_define_javascript_functions
# check if prototype.js is included first
Expand Down
4 changes: 2 additions & 2 deletions actionpack/test/template/number_helper_test.rb
@@ -1,7 +1,7 @@
require 'abstract_unit'

class NumberHelperTest < Test::Unit::TestCase
include ActionView::Helpers::NumberHelper
class NumberHelperTest < ActionView::TestCase
tests ActionView::Helpers::NumberHelper

def test_number_to_phone
assert_equal("800-555-1212", number_to_phone(8005551212))
Expand Down
56 changes: 19 additions & 37 deletions actionpack/test/template/prototype_helper_test.rb
Expand Up @@ -24,24 +24,11 @@ def name
class Author::Nested < Author; end


module BaseTest
def self.included(base)
base.send :attr_accessor, :template_format
end
class PrototypeHelperBaseTest < ActionView::TestCase
tests ActionView::Helpers::PrototypeHelper

attr_accessor :template_format

include ActionView::Helpers::JavaScriptHelper
include ActionView::Helpers::PrototypeHelper
include ActionView::Helpers::ScriptaculousHelper

include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::FormTagHelper
include ActionView::Helpers::FormHelper
include ActionView::Helpers::CaptureHelper
include ActionView::Helpers::RecordIdentificationHelper
include ActionController::PolymorphicRoutes

def setup
@template = nil
@controller = Class.new do
Expand All @@ -59,25 +46,22 @@ def url_for(options)
end.new
end

protected

def request_forgery_protection_token
nil
end

def protect_against_forgery?
false
end

def create_generator
block = Proc.new { |*args| yield *args if block_given? }
JavaScriptGenerator.new self, &block
end
protected
def request_forgery_protection_token
nil
end

def protect_against_forgery?
false
end

def create_generator
block = Proc.new { |*args| yield *args if block_given? }
JavaScriptGenerator.new self, &block
end
end

class PrototypeHelperTest < Test::Unit::TestCase
include BaseTest

class PrototypeHelperTest < PrototypeHelperBaseTest
def setup
@record = @author = Author.new
@article = Article.new
Expand Down Expand Up @@ -294,9 +278,7 @@ def author_article_path(author, article)
end
end

class JavaScriptGeneratorTest < Test::Unit::TestCase
include BaseTest

class JavaScriptGeneratorTest < PrototypeHelperBaseTest
def setup
super
@generator = create_generator
Expand Down
11 changes: 3 additions & 8 deletions actionpack/test/template/record_tag_helper_test.rb
Expand Up @@ -9,14 +9,9 @@ def body
end
end

class RecordTagHelperTest < Test::Unit::TestCase
include ActionView::Helpers::RecordTagHelper
include ActionView::Helpers::CaptureHelper
include ActionView::Helpers::RecordIdentificationHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::UrlHelper

class RecordTagHelperTest < ActionView::TestCase
tests ActionView::Helpers::RecordTagHelper

def setup
@post = Post.new
end
Expand Down
5 changes: 2 additions & 3 deletions actionpack/test/template/sanitize_helper_test.rb
Expand Up @@ -3,9 +3,8 @@

# The exhaustive tests are in test/controller/html/sanitizer_test.rb.
# This tests the that the helpers hook up correctly to the sanitizer classes.
class SanitizeHelperTest < Test::Unit::TestCase
include ActionView::Helpers::SanitizeHelper
include ActionView::Helpers::TagHelper
class SanitizeHelperTest < ActionView::TestCase
tests ActionView::Helpers::SanitizeHelper
include TestingSandbox

def test_strip_links
Expand Down
14 changes: 3 additions & 11 deletions actionpack/test/template/scriptaculous_helper_test.rb
@@ -1,16 +1,8 @@
require 'abstract_unit'

class ScriptaculousHelperTest < Test::Unit::TestCase
include ActionView::Helpers::JavaScriptHelper
include ActionView::Helpers::PrototypeHelper
include ActionView::Helpers::ScriptaculousHelper

include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::FormHelper
include ActionView::Helpers::CaptureHelper

class ScriptaculousHelperTest < ActionView::TestCase
tests ActionView::Helpers::ScriptaculousHelper

def setup
@controller = Class.new do
def url_for(options)
Expand Down
7 changes: 2 additions & 5 deletions actionpack/test/template/tag_helper_test.rb
@@ -1,10 +1,7 @@
require 'abstract_unit'

class TagHelperTest < Test::Unit::TestCase
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TextHelper
include ActionView::Helpers::CaptureHelper
class TagHelperTest < ActionView::TestCase
tests ActionView::Helpers::TagHelper

def test_tag
assert_equal "<br />", tag("br")
Expand Down

0 comments on commit 17d4164

Please sign in to comment.