diff options
Diffstat (limited to 'actionpack/test/dispatch/header_test.rb')
-rw-r--r-- | actionpack/test/dispatch/header_test.rb | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/actionpack/test/dispatch/header_test.rb b/actionpack/test/dispatch/header_test.rb new file mode 100644 index 0000000000..3a265a056b --- /dev/null +++ b/actionpack/test/dispatch/header_test.rb @@ -0,0 +1,169 @@ +# frozen_string_literal: true + +require "abstract_unit" + +class HeaderTest < ActiveSupport::TestCase + def make_headers(hash) + ActionDispatch::Http::Headers.new ActionDispatch::Request.new hash + end + + setup do + @headers = make_headers( + "CONTENT_TYPE" => "text/plain", + "HTTP_REFERER" => "/some/page" + ) + end + + test "#new does not normalize the data" do + headers = make_headers( + "Content-Type" => "application/json", + "HTTP_REFERER" => "/some/page", + "Host" => "http://test.com") + + assert_equal({ "Content-Type" => "application/json", + "HTTP_REFERER" => "/some/page", + "Host" => "http://test.com" }, headers.env) + end + + test "#env returns the headers as env variables" do + assert_equal({ "CONTENT_TYPE" => "text/plain", + "HTTP_REFERER" => "/some/page" }, @headers.env) + end + + test "#each iterates through the env variables" do + headers = [] + @headers.each { |pair| headers << pair } + assert_equal [["CONTENT_TYPE", "text/plain"], + ["HTTP_REFERER", "/some/page"]], headers + end + + test "set new headers" do + @headers["Host"] = "127.0.0.1" + + assert_equal "127.0.0.1", @headers["Host"] + assert_equal "127.0.0.1", @headers["HTTP_HOST"] + end + + test "add to multivalued headers" do + # Sets header when not present + @headers.add "Foo", "1" + assert_equal "1", @headers["Foo"] + + # Ignores nil values + @headers.add "Foo", nil + assert_equal "1", @headers["Foo"] + + # Converts value to string + @headers.add "Foo", 1 + assert_equal "1,1", @headers["Foo"] + + # Case-insensitive + @headers.add "fOo", 2 + assert_equal "1,1,2", @headers["foO"] + end + + test "headers can contain numbers" do + @headers["Content-MD5"] = "Q2hlY2sgSW50ZWdyaXR5IQ==" + + assert_equal "Q2hlY2sgSW50ZWdyaXR5IQ==", @headers["Content-MD5"] + assert_equal "Q2hlY2sgSW50ZWdyaXR5IQ==", @headers["HTTP_CONTENT_MD5"] + end + + test "set new env variables" do + @headers["HTTP_HOST"] = "127.0.0.1" + + assert_equal "127.0.0.1", @headers["Host"] + assert_equal "127.0.0.1", @headers["HTTP_HOST"] + end + + test "key?" do + assert @headers.key?("CONTENT_TYPE") + assert_includes @headers, "CONTENT_TYPE" + assert @headers.key?("Content-Type") + assert_includes @headers, "Content-Type" + end + + test "fetch with block" do + assert_equal "omg", @headers.fetch("notthere") { "omg" } + end + + test "accessing http header" do + assert_equal "/some/page", @headers["Referer"] + assert_equal "/some/page", @headers["referer"] + assert_equal "/some/page", @headers["HTTP_REFERER"] + end + + test "accessing special header" do + assert_equal "text/plain", @headers["Content-Type"] + assert_equal "text/plain", @headers["content-type"] + assert_equal "text/plain", @headers["CONTENT_TYPE"] + end + + test "fetch" do + assert_equal "text/plain", @headers.fetch("content-type", nil) + assert_equal "not found", @headers.fetch("not-found", "not found") + end + + test "#merge! headers with mutation" do + @headers.merge!("Host" => "http://example.test", + "Content-Type" => "text/html") + assert_equal({ "HTTP_HOST" => "http://example.test", + "CONTENT_TYPE" => "text/html", + "HTTP_REFERER" => "/some/page" }, @headers.env) + end + + test "#merge! env with mutation" do + @headers.merge!("HTTP_HOST" => "http://first.com", + "CONTENT_TYPE" => "text/html") + assert_equal({ "HTTP_HOST" => "http://first.com", + "CONTENT_TYPE" => "text/html", + "HTTP_REFERER" => "/some/page" }, @headers.env) + end + + test "merge without mutation" do + combined = @headers.merge("HTTP_HOST" => "http://example.com", + "CONTENT_TYPE" => "text/html") + assert_equal({ "HTTP_HOST" => "http://example.com", + "CONTENT_TYPE" => "text/html", + "HTTP_REFERER" => "/some/page" }, combined.env) + + assert_equal({ "CONTENT_TYPE" => "text/plain", + "HTTP_REFERER" => "/some/page" }, @headers.env) + end + + test "env variables with . are not modified" do + headers = make_headers({}) + headers.merge! "rack.input" => "", + "rack.request.cookie_hash" => "", + "action_dispatch.logger" => "" + + assert_equal(["action_dispatch.logger", + "rack.input", + "rack.request.cookie_hash"], headers.env.keys.sort) + end + + test "symbols are treated as strings" do + headers = make_headers({}) + headers.merge!(:SERVER_NAME => "example.com", + "HTTP_REFERER" => "/", + :Host => "test.com") + assert_equal "example.com", headers["SERVER_NAME"] + assert_equal "/", headers[:HTTP_REFERER] + assert_equal "test.com", headers["HTTP_HOST"] + end + + test "headers directly modifies the passed environment" do + env = { "HTTP_REFERER" => "/" } + headers = make_headers(env) + headers["Referer"] = "http://example.com/" + headers.merge! "CONTENT_TYPE" => "text/plain" + assert_equal({ "HTTP_REFERER" => "http://example.com/", + "CONTENT_TYPE" => "text/plain" }, env) + end + + test "fetch exception" do + assert_raises KeyError do + @headers.fetch(:some_key_that_doesnt_exist) + end + end +end |