diff --git a/lib/http/cookie.rb b/lib/http/cookie.rb index 6282e3c..2c79f85 100644 --- a/lib/http/cookie.rb +++ b/lib/http/cookie.rb @@ -655,6 +655,11 @@ class HTTP::Cookie end include Comparable + # Hash serialization helper for use back into other libraries (Like Selenium) + def to_h + PERSISTENT_PROPERTIES.each_with_object({}) { |property, hash| hash[property.to_sym] = instance_variable_get("@#{property}") } + end + # YAML serialization helper for Syck. def to_yaml_properties PERSISTENT_PROPERTIES.map { |name| "@#{name}" } diff --git a/test/test_http_cookie.rb b/test/test_http_cookie.rb index a01b46a..cb90f02 100644 --- a/test/test_http_cookie.rb +++ b/test/test_http_cookie.rb @@ -1168,4 +1168,45 @@ class TestHTTPCookie < Test::Unit::TestCase assert_equal true, HTTP::Cookie.path_match?('/admin', '/admin/') assert_equal true, HTTP::Cookie.path_match?('/admin', '/admin/index') end + + def test_to_h + now = Time.now + + cookie = HTTP::Cookie.new(cookie_values.merge({ max_age: 3600, created_at: now, accessed_at: now })) + expected_hash = + { + accessed_at: now, + created_at: now, + domain: 'rubyforge.org', + expires: nil, + for_domain: true, + httponly: cookie.httponly?, + max_age: 3600, + name: 'Foo', + path: '/', + secure: cookie.secure?, + value: 'Bar', + } + + assert_equal expected_hash, cookie.to_h + + # exercise expires/max_age interaction + cookie = HTTP::Cookie.new(cookie_values.merge({ expires: now, created_at: now, accessed_at: now })) + expected_hash = + { + accessed_at: now, + created_at: now, + domain: 'rubyforge.org', + expires: now, + for_domain: true, + httponly: cookie.httponly?, + max_age: nil, + name: 'Foo', + path: '/', + secure: cookie.secure?, + value: 'Bar', + } + + assert_equal expected_hash, cookie.to_h + end end