$:.unshift File.join(File.dirname(__FILE__), "..", "lib") require 'test/unit' require 'mechanize/cookie' require 'uri' require 'test_includes' module Enumerable def combine masks = inject([[], 1]){|(ar, m), e| [ar< (Time.now - 86400)) } end end def test_parse_valid_cookie url = URI.parse('http://rubyforge.org/') cookie_params = {} cookie_params['expires'] = 'expires=Sun, 27-Sep-2037 00:00:00 GMT' cookie_params['path'] = 'path=/' cookie_params['domain'] = 'domain=.rubyforge.org' cookie_params['httponly'] = 'HttpOnly' cookie_value = '12345%7D=ASDFWEE345%3DASda' expires = Time.parse('Sun, 27-Sep-2037 00:00:00 GMT') cookie_params.keys.combine.each do |c| cookie_text = "#{cookie_value}; " c.each_with_index do |key, idx| if idx == (c.length - 1) cookie_text << "#{cookie_params[key]}" else cookie_text << "#{cookie_params[key]}; " end end cookie = nil WWW::Mechanize::Cookie.parse(url, cookie_text) { |p_cookie| cookie = p_cookie } assert_not_nil(cookie) assert_equal('12345%7D=ASDFWEE345%3DASda', cookie.to_s) assert_equal('/', cookie.path) assert_equal('rubyforge.org', cookie.domain) # if expires was set, make sure we parsed it if c.find { |k| k == 'expires' } assert_equal(expires, cookie.expires) else assert_nil(cookie.expires) end end end # If no path was given, use the one from the URL def test_cookie_using_url_path url = URI.parse('http://rubyforge.org/login') cookie_params = {} cookie_params['expires'] = 'expires=Sun, 27-Sep-2037 00:00:00 GMT' cookie_params['path'] = 'path=/' cookie_params['domain'] = 'domain=.rubyforge.org' cookie_params['httponly'] = 'HttpOnly' cookie_value = '12345%7D=ASDFWEE345%3DASda' expires = Time.parse('Sun, 27-Sep-2037 00:00:00 GMT') cookie_params.keys.combine.each do |c| next if c.find { |k| k == 'path' } cookie_text = "#{cookie_value}; " c.each_with_index do |key, idx| if idx == (c.length - 1) cookie_text << "#{cookie_params[key]}" else cookie_text << "#{cookie_params[key]}; " end end cookie = nil WWW::Mechanize::Cookie.parse(url, cookie_text) { |p_cookie| cookie = p_cookie } assert_not_nil(cookie) assert_equal('12345%7D=ASDFWEE345%3DASda', cookie.to_s) assert_equal('rubyforge.org', cookie.domain) assert_equal('/login', cookie.path) # if expires was set, make sure we parsed it if c.find { |k| k == 'expires' } assert_equal(expires, cookie.expires) else assert_nil(cookie.expires) end end end # Test using secure cookies def test_cookie_with_secure url = URI.parse('http://rubyforge.org/') cookie_params = {} cookie_params['expires'] = 'expires=Sun, 27-Sep-2037 00:00:00 GMT' cookie_params['path'] = 'path=/' cookie_params['domain'] = 'domain=.rubyforge.org' cookie_params['secure'] = 'secure' cookie_value = '12345%7D=ASDFWEE345%3DASda' expires = Time.parse('Sun, 27-Sep-2037 00:00:00 GMT') cookie_params.keys.combine.each do |c| next unless c.find { |k| k == 'secure' } cookie_text = "#{cookie_value}; " c.each_with_index do |key, idx| if idx == (c.length - 1) cookie_text << "#{cookie_params[key]}" else cookie_text << "#{cookie_params[key]}; " end end cookie = nil WWW::Mechanize::Cookie.parse(url, cookie_text) { |p_cookie| cookie = p_cookie } assert_not_nil(cookie) assert_equal('12345%7D=ASDFWEE345%3DASda', cookie.to_s) assert_equal('rubyforge.org', cookie.domain) assert_equal('/', cookie.path) assert_equal(true, cookie.secure) # if expires was set, make sure we parsed it if c.find { |k| k == 'expires' } assert_equal(expires, cookie.expires) else assert_nil(cookie.expires) end end end # If no domain was given, we must use the one from the URL def test_cookie_with_url_domain url = URI.parse('http://login.rubyforge.org/') cookie_params = {} cookie_params['expires'] = 'expires=Sun, 27-Sep-2037 00:00:00 GMT' cookie_params['path'] = 'path=/' cookie_params['domain'] = 'domain=.rubyforge.org' cookie_params['httponly'] = 'HttpOnly' cookie_value = '12345%7D=ASDFWEE345%3DASda' expires = Time.parse('Sun, 27-Sep-2037 00:00:00 GMT') cookie_params.keys.combine.each do |c| next if c.find { |k| k == 'domain' } cookie_text = "#{cookie_value}; " c.each_with_index do |key, idx| if idx == (c.length - 1) cookie_text << "#{cookie_params[key]}" else cookie_text << "#{cookie_params[key]}; " end end cookie = nil WWW::Mechanize::Cookie.parse(url, cookie_text) { |p_cookie| cookie = p_cookie } assert_not_nil(cookie) assert_equal('12345%7D=ASDFWEE345%3DASda', cookie.to_s) assert_equal('/', cookie.path) assert_equal('login.rubyforge.org', cookie.domain) # if expires was set, make sure we parsed it if c.find { |k| k == 'expires' } assert_equal(expires, cookie.expires) else assert_nil(cookie.expires) end end end def test_parse_cookie_no_spaces url = URI.parse('http://rubyforge.org/') cookie_params = {} cookie_params['expires'] = 'expires=Sun, 27-Sep-2037 00:00:00 GMT' cookie_params['path'] = 'path=/' cookie_params['domain'] = 'domain=.rubyforge.org' cookie_params['httponly'] = 'HttpOnly' cookie_value = '12345%7D=ASDFWEE345%3DASda' expires = Time.parse('Sun, 27-Sep-2037 00:00:00 GMT') cookie_params.keys.combine.each do |c| cookie_text = "#{cookie_value};" c.each_with_index do |key, idx| if idx == (c.length - 1) cookie_text << "#{cookie_params[key]}" else cookie_text << "#{cookie_params[key]};" end end cookie = nil WWW::Mechanize::Cookie.parse(url, cookie_text) { |p_cookie| cookie = p_cookie } assert_not_nil(cookie) assert_equal('12345%7D=ASDFWEE345%3DASda', cookie.to_s) assert_equal('/', cookie.path) assert_equal('rubyforge.org', cookie.domain) # if expires was set, make sure we parsed it if c.find { |k| k == 'expires' } assert_equal(expires, cookie.expires) else assert_nil(cookie.expires) end end end end