#!/usr/bin/env ruby require File.dirname(__FILE__) + '/../test_helper' require 'haml/template' class HelperTest < Test::Unit::TestCase include Haml::Helpers Post = Struct.new('Post', :body) def setup @base = ActionView::Base.new @base.controller = ActionController::Base.new @base.instance_variable_set('@post', Post.new("Foo bar\nbaz")) end def render(text, options = {}) if options == :action_view @base.render :inline => text, :type => :haml else scope = options.delete :scope_object Haml::Engine.new(text, options).to_html(scope ? scope : Object.new) end end def test_flatten assert_equal("FooBar", flatten("FooBar")) assert_equal("FooBar", flatten("Foo\rBar")) assert_equal("Foo Bar", flatten("Foo\nBar")) assert_equal("Hello World! YOU ARE FLAT? OMGZ!", flatten("Hello\nWorld!\nYOU ARE \rFLAT?\n\rOMGZ!")) end def test_list_of_should_render_correctly assert_equal("
A word!
\nA word!
\nA word!
\nA word!
\ntabbed
\n", render("- buffer.tabulation=5\n%p tabbed")) end def test_helpers_dont_leak # Haml helpers shouldn't be accessible from ERB render("foo") proper_behavior = false begin ActionView::Base.new.render(:inline => "<%= flatten('Foo\\nBar') %>") rescue NoMethodError proper_behavior = true end assert(proper_behavior) begin ActionView::Base.new.render(:inline => "<%= concat('foo') %>") rescue ArgumentError, NameError proper_behavior = true end assert(proper_behavior) end def test_action_view_included assert(Haml::Helpers.action_view?) end def test_form_tag # This is usually provided by ActionController::Base. def @base.protect_against_forgery?; false; end result = render("- form_tag 'foo' do\n %p bar\n %strong baz", :action_view) should_be = "\n" assert_equal(should_be, result) end def test_text_area assert_equal(%(\n), render('= text_area_tag "body", "Foo\nBar\n Baz\n Boom"', :action_view)) assert_equal(%(\n), render('= text_area :post, :body', :action_view)) assert_equal(%(Foo bar baz\n), render('= content_tag "pre", "Foo bar\n baz"', :action_view)) end def test_capture_haml assert_equal("\"
13
\\n\"\n", render("- foo = capture_haml(13) do |a|\n %p= a\n= foo.dump")) end def test_content_tag_block assert_equal(<bar
bar HTML - content_tag :div do %p bar %strong bar HAML end def test_haml_tag_attribute_html_escaping assert_equal("baz
\n", render("%p{:id => 'foo&bar'} baz", :escape_html => true)) end def test_haml_tag_autoclosed_tags_are_closed assert_equal("#{'a' * 100}
\n", render("- haml_tag :p, 'a' * 100")) end def test_haml_tag_raises_error_for_multiple_content assert_raise(Haml::Error) { render("- haml_tag :p, 'foo' do\n bar") } end def test_haml_tag_flags assert_equal("\n", render("- haml_tag :p, :/")) assert_equal("kumquat
\n", render("- haml_tag :p, :< do\n kumquat")) assert_raise(Haml::Error) { render("- haml_tag :p, 'foo', :/") } assert_raise(Haml::Error) { render("- haml_tag :p, :/ do\n foo") } end def test_is_haml assert(!ActionView::Base.new.is_haml?) assert_equal("true\n", render("= is_haml?")) assert_equal("true\n", render("= is_haml?", :action_view)) assert_equal("false", @base.render(:inline => '<%= is_haml? %>')) assert_equal("false\n", render("= render :inline => '<%= is_haml? %>'", :action_view)) end def test_page_class controller = Struct.new(:controller_name, :action_name).new('troller', 'tion') scope = Struct.new(:controller).new(controller) result = render("%div{:class => page_class} MyDiv", :scope_object => scope) expected = "Foo Bar\nFoo\nBar\n", render("= find_and_preserve do\n %pre\n Foo\n Bar\n Foo\n Bar")) end def test_preserve_with_block assert_equal("
Foo BarFoo Bar\n", render("= preserve do\n %pre\n Foo\n Bar\n Foo\n Bar")) end def test_init_haml_helpers context = Object.new class << context include Haml::Helpers end context.init_haml_helpers result = context.capture_haml do context.haml_tag :p, :attr => "val" do context.haml_concat "Blah" end end assert_equal("
\n Blah\n
\n", result) end def test_non_haml assert_equal("false\n", render("= non_haml { is_haml? }")) end class ActsLikeTag # We want to be able to have people include monkeypatched ActionView helpers # without redefining is_haml?. # This is accomplished via Object#is_haml?, and this is a test for it. include ActionView::Helpers::TagHelper def to_s content_tag :p, 'some tag content' end end def test_random_class_includes_tag_helper assert_equal "some tag content
", ActsLikeTag.new.to_s end end