require 'rubygems' require 'test/unit' require 'redgreen' if RUBY_VERSION < '1.9' require 'rack' require 'erb' require 'haml' require File.join(File.dirname(__FILE__), "layout_wrapper") class APIVersionMapperTest < Test::Unit::TestCase def setup @example_app = proc do |env| req = Rack::Request.new(env) headers = { "Content-Type" => "text/html", "Content-Length" => "8" } env[Rack::LayoutWrapper::PLACEHOLDER_ENV_KEY].layout_name = req.GET["layout_name"] if req.GET["layout_name"] env[Rack::LayoutWrapper::PLACEHOLDER_ENV_KEY].render_layout = true if req.GET["render_layout"] [200, headers, ["FROM APP"]] end @app = Rack::LayoutWrapper.new(@example_app, :template_dir => File.join(File.dirname(__FILE__), "layouts")) end def test_no_layouts assert !@app.render_layout? get '/' assert_valid_response "FROM APP" end def test_simple_erb_layout get '/?layout_name=example_a' assert_valid_response "BEFORE TEMPLATE\nFROM APP\nAFTER TEMPLATE" end def test_simple_haml_layout get '/?layout_name=example_b' assert_valid_response "BEFORE TEMPLATE TWO\nFROM APP\nAFTER TEMPLATE TWO\n" end def test_yielded_erb_layout get '/?layout_name=example_c' assert_valid_response "BEFORE TEMPLATE THREE\nFROM APP\nAFTER TEMPLATE THREE" end def test_yielded_haml_layout get '/?layout_name=example_d' assert_valid_response "BEFORE TEMPLATE FOUR\nFROM APP\nAFTER TEMPLATE FOUR\n" end def test_default_layouts @app.default_layout = "example_a" get '/?render_layout=true' assert_valid_response "BEFORE TEMPLATE\nFROM APP\nAFTER TEMPLATE" # Now, override the default get '/?layout_name=example_c' assert_valid_response "BEFORE TEMPLATE THREE\nFROM APP\nAFTER TEMPLATE THREE" end def test_template_scope get '/?layout_name=example_e' assert_valid_response "GET to / with layout_name=example_e - FROM APP\n" end def test_template_request get '/?layout_name=example_f' assert_valid_response "GET to / with layout_name=example_f - FROM APP\n" end protected def get(path, env = {}) @response = Rack::MockRequest.new(@app).get(path, env) end def assert_valid_response(body) assert @response.ok?, "the response should be ok (was #{@response.status} instead)" content_length = Rack::Utils.bytesize(body) real_content_length = @response["Content-Length"].to_i assert_equal content_length, real_content_length, "Expected a Content-Length of #{content_length}, got #{real_content_length}" assert_equal body, @response.body, "Incorrect body in response" end end