| Viewing file:  test_urlpath.py (10.09 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
# -*- test-case-name: twisted.python.test.test_urlpath -*-# Copyright (c) Twisted Matrix Laboratories.
 # See LICENSE for details.
 
 """
 Tests for L{twisted.python.urlpath}.
 """
 
 from twisted.trial import unittest
 from twisted.python import urlpath
 from twisted.python.compat import _PY3
 
 
 class _BaseURLPathTests(object):
 """
 Tests for instantiated L{urlpath.URLPath}s.
 """
 def test_partsAreBytes(self):
 """
 All of the attributes of L{urlpath.URLPath} should be L{bytes}.
 """
 self.assertIsInstance(self.path.scheme, bytes)
 self.assertIsInstance(self.path.netloc, bytes)
 self.assertIsInstance(self.path.path, bytes)
 self.assertIsInstance(self.path.query, bytes)
 self.assertIsInstance(self.path.fragment, bytes)
 
 
 def test_strReturnsStr(self):
 """
 Calling C{str()} with a L{URLPath} will always return a L{str}.
 """
 self.assertEqual(type(self.path.__str__()), str)
 
 
 def test_mutabilityWithText(self, stringType=type(u"")):
 """
 Setting attributes on L{urlpath.URLPath} should change the value
 returned by L{str}.
 
 @param stringType: a callable to parameterize this test for different
 text types.
 @type stringType: 1-argument callable taking L{unicode} and returning
 L{str} or L{bytes}.
 """
 self.path.scheme = stringType(u"https")
 self.assertEqual(
 str(self.path),
 "https://example.com/foo/bar?yes=no&no=yes#footer")
 self.path.netloc = stringType(u"another.example.invalid")
 self.assertEqual(
 str(self.path),
 "https://another.example.invalid/foo/bar?yes=no&no=yes#footer")
 self.path.path = stringType(u"/hello")
 self.assertEqual(
 str(self.path),
 "https://another.example.invalid/hello?yes=no&no=yes#footer")
 self.path.query = stringType(u"alpha=omega&opposites=same")
 self.assertEqual(
 str(self.path),
 "https://another.example.invalid/hello?alpha=omega&opposites=same"
 "#footer")
 self.path.fragment = stringType(u"header")
 self.assertEqual(
 str(self.path),
 "https://another.example.invalid/hello?alpha=omega&opposites=same"
 "#header")
 
 
 def test_mutabilityWithBytes(self):
 """
 Same as L{test_mutabilityWithText} but for bytes.
 """
 self.test_mutabilityWithText(lambda x: x.encode("ascii"))
 
 
 def test_allAttributesAreBytes(self):
 """
 A created L{URLPath} has bytes attributes.
 """
 self.assertIsInstance(self.path.scheme, bytes)
 self.assertIsInstance(self.path.netloc, bytes)
 self.assertIsInstance(self.path.path, bytes)
 self.assertIsInstance(self.path.query, bytes)
 self.assertIsInstance(self.path.fragment, bytes)
 
 
 def test_stringConversion(self):
 """
 Calling C{str()} with a L{URLPath} will return the same URL that it was
 constructed with.
 """
 self.assertEqual(str(self.path),
 "http://example.com/foo/bar?yes=no&no=yes#footer")
 
 
 def test_childString(self):
 """
 Calling C{str()} with a C{URLPath.child()} will return a URL which is
 the child of the URL it was instantiated with.
 """
 self.assertEqual(str(self.path.child(b'hello')),
 "http://example.com/foo/bar/hello")
 self.assertEqual(str(self.path.child(b'hello').child(b'')),
 "http://example.com/foo/bar/hello/")
 self.assertEqual(str(self.path.child(b'hello', keepQuery=True)),
 "http://example.com/foo/bar/hello?yes=no&no=yes")
 
 
 def test_siblingString(self):
 """
 Calling C{str()} with a C{URLPath.sibling()} will return a URL which is
 the sibling of the URL it was instantiated with.
 """
 self.assertEqual(str(self.path.sibling(b'baz')),
 'http://example.com/foo/baz')
 self.assertEqual(str(self.path.sibling(b'baz', keepQuery=True)),
 "http://example.com/foo/baz?yes=no&no=yes")
 
 # The sibling of http://example.com/foo/bar/
 #     is http://example.comf/foo/bar/baz
 # because really we are constructing a sibling of
 # http://example.com/foo/bar/index.html
 self.assertEqual(str(self.path.child(b'').sibling(b'baz')),
 'http://example.com/foo/bar/baz')
 
 
 def test_parentString(self):
 """
 Calling C{str()} with a C{URLPath.parent()} will return a URL which is
 the parent of the URL it was instantiated with.
 """
 # .parent() should be equivalent to '..'
 # 'foo' is the current directory, '/' is the parent directory
 self.assertEqual(str(self.path.parent()),
 'http://example.com/')
 self.assertEqual(str(self.path.parent(keepQuery=True)),
 'http://example.com/?yes=no&no=yes')
 self.assertEqual(str(self.path.child(b'').parent()),
 'http://example.com/foo/')
 self.assertEqual(str(self.path.child(b'baz').parent()),
 'http://example.com/foo/')
 self.assertEqual(
 str(self.path.parent().parent().parent().parent().parent()),
 'http://example.com/')
 
 
 def test_hereString(self):
 """
 Calling C{str()} with a C{URLPath.here()} will return a URL which is
 the URL that it was instantiated with, without any file, query, or
 fragment.
 """
 # .here() should be equivalent to '.'
 self.assertEqual(str(self.path.here()), 'http://example.com/foo/')
 self.assertEqual(str(self.path.here(keepQuery=True)),
 'http://example.com/foo/?yes=no&no=yes')
 self.assertEqual(str(self.path.child(b'').here()),
 'http://example.com/foo/bar/')
 
 
 def test_doubleSlash(self):
 """
 Calling L{urlpath.URLPath.click} on a L{urlpath.URLPath} with a
 trailing slash with a relative URL containing a leading slash will
 result in a URL with a single slash at the start of the path portion.
 """
 self.assertEqual(
 str(self.path.click(b"/hello/world")).encode("ascii"),
 b"http://example.com/hello/world"
 )
 
 
 def test_pathList(self):
 """
 L{urlpath.URLPath.pathList} returns a L{list} of L{bytes}.
 """
 self.assertEqual(
 self.path.child(b"%00%01%02").pathList(),
 [b"", b"foo", b"bar", b"%00%01%02"]
 )
 
 # Just testing that the 'copy' argument exists for compatibility; it
 # was originally provided for performance reasons, and its behavioral
 # contract is kind of nonsense (where is the state shared? who with?)
 # so it doesn't actually *do* anything any more.
 self.assertEqual(
 self.path.child(b"%00%01%02").pathList(copy=False),
 [b"", b"foo", b"bar", b"%00%01%02"]
 )
 self.assertEqual(
 self.path.child(b"%00%01%02").pathList(unquote=True),
 [b"", b"foo", b"bar", b"\x00\x01\x02"]
 )
 
 
 
 class BytesURLPathTests(_BaseURLPathTests, unittest.TestCase):
 """
 Tests for interacting with a L{URLPath} created with C{fromBytes}.
 """
 def setUp(self):
 self.path = urlpath.URLPath.fromBytes(
 b"http://example.com/foo/bar?yes=no&no=yes#footer")
 
 
 def test_mustBeBytes(self):
 """
 L{URLPath.fromBytes} must take a L{bytes} argument.
 """
 with self.assertRaises(ValueError):
 urlpath.URLPath.fromBytes(None)
 
 with self.assertRaises(ValueError):
 urlpath.URLPath.fromBytes(u"someurl")
 
 
 def test_withoutArguments(self):
 """
 An instantiation with no arguments creates a usable L{URLPath} with
 default arguments.
 """
 url = urlpath.URLPath()
 self.assertEqual(str(url), "http://localhost/")
 
 
 def test_partialArguments(self):
 """
 Leaving some optional arguments unfilled makes a L{URLPath} with those
 optional arguments filled with defaults.
 """
 # Not a "full" URL given to fromBytes, no /
 # / is filled in
 url = urlpath.URLPath.fromBytes(b"http://google.com")
 self.assertEqual(url.scheme, b"http")
 self.assertEqual(url.netloc, b"google.com")
 self.assertEqual(url.path, b"/")
 self.assertEqual(url.fragment, b"")
 self.assertEqual(url.query, b"")
 self.assertEqual(str(url), "http://google.com/")
 
 
 def test_nonASCIIBytes(self):
 """
 L{URLPath.fromBytes} can interpret non-ASCII bytes as percent-encoded
 """
 url = urlpath.URLPath.fromBytes(b"http://example.com/\xff\x00")
 self.assertEqual(str(url), "http://example.com/%FF%00")
 
 
 
 class StringURLPathTests(_BaseURLPathTests, unittest.TestCase):
 """
 Tests for interacting with a L{URLPath} created with C{fromString} and a
 L{str} argument.
 """
 def setUp(self):
 self.path = urlpath.URLPath.fromString(
 "http://example.com/foo/bar?yes=no&no=yes#footer")
 
 
 def test_mustBeStr(self):
 """
 C{URLPath.fromString} must take a L{str} or L{unicode} argument.
 """
 with self.assertRaises(ValueError):
 urlpath.URLPath.fromString(None)
 
 if _PY3:
 with self.assertRaises(ValueError):
 urlpath.URLPath.fromString(b"someurl")
 
 
 
 class UnicodeURLPathTests(_BaseURLPathTests, unittest.TestCase):
 """
 Tests for interacting with a L{URLPath} created with C{fromString} and a
 L{unicode} argument.
 """
 def setUp(self):
 self.path = urlpath.URLPath.fromString(
 u"http://example.com/foo/bar?yes=no&no=yes#footer")
 
 
 def test_nonASCIICharacters(self):
 """
 L{URLPath.fromString} can load non-ASCII characters.
 """
 url = urlpath.URLPath.fromString(u"http://example.com/\xff\x00")
 self.assertEqual(str(url), "http://example.com/%C3%BF%00")
 
 |