summaryrefslogtreecommitdiff
path: root/tests/utils_tests
diff options
context:
space:
mode:
authorAndrew Godwin <andrew@aeracode.org>2013-06-07 11:15:34 +0100
committerAndrew Godwin <andrew@aeracode.org>2013-06-07 11:15:34 +0100
commit3c296382b8dea5de7f4e1e11b66bd7cecaf2ee51 (patch)
tree0ca12593be82971691ffca01a836d00d3fcb3bd4 /tests/utils_tests
parent7609e0b42e0014a6ad0adf9dafc7018cb268070e (diff)
parent357d62d9f2972bf1bc21e5835c12c849143e06af (diff)
Merge remote-tracking branch 'core/master' into schema-alteration
Conflicts: django/db/models/fields/related.py
Diffstat (limited to 'tests/utils_tests')
-rw-r--r--tests/utils_tests/test_baseconv.py4
-rw-r--r--tests/utils_tests/test_html.py11
-rw-r--r--tests/utils_tests/test_safestring.py53
-rw-r--r--tests/utils_tests/test_simplelazyobject.py24
-rw-r--r--tests/utils_tests/test_timesince.py71
5 files changed, 123 insertions, 40 deletions
diff --git a/tests/utils_tests/test_baseconv.py b/tests/utils_tests/test_baseconv.py
index cc413b4e8e..d69a3a6412 100644
--- a/tests/utils_tests/test_baseconv.py
+++ b/tests/utils_tests/test_baseconv.py
@@ -1,4 +1,4 @@
-from unittest import TestCase
+from django.utils.unittest import TestCase
from django.utils.baseconv import base2, base16, base36, base56, base62, base64, BaseConverter
from django.utils.six.moves import xrange
@@ -39,4 +39,4 @@ class TestBaseConv(TestCase):
def test_exception(self):
self.assertRaises(ValueError, BaseConverter, 'abc', sign='a')
- self.assertTrue(isinstance(BaseConverter('abc', sign='d'), BaseConverter))
+ self.assertIsInstance(BaseConverter('abc', sign='d'), BaseConverter)
diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py
index 090cc32d1c..b973f1c64f 100644
--- a/tests/utils_tests/test_html.py
+++ b/tests/utils_tests/test_html.py
@@ -5,6 +5,7 @@ import os
from django.utils import html
from django.utils._os import upath
+from django.utils.encoding import force_text
from django.utils.unittest import TestCase
@@ -63,10 +64,15 @@ class TestUtilsHtml(TestCase):
def test_strip_tags(self):
f = html.strip_tags
items = (
+ ('<p>See: &#39;&eacute; is an apostrophe followed by e acute</p>',
+ 'See: &#39;&eacute; is an apostrophe followed by e acute'),
('<adf>a', 'a'),
('</adf>a', 'a'),
('<asdf><asdf>e', 'e'),
- ('<f', '<f'),
+ ('hi, <f x', 'hi, <f x'),
+ ('234<235, right?', '234<235, right?'),
+ ('a4<a5 right?', 'a4<a5 right?'),
+ ('b7>b2!', 'b7>b2!'),
('</fe', '</fe'),
('<x>b<y>', 'b'),
('a<p onclick="alert(\'<test>\')">b</p>c', 'abc'),
@@ -81,8 +87,9 @@ class TestUtilsHtml(TestCase):
for filename in ('strip_tags1.html', 'strip_tags2.txt'):
path = os.path.join(os.path.dirname(upath(__file__)), 'files', filename)
with open(path, 'r') as fp:
+ content = force_text(fp.read())
start = datetime.now()
- stripped = html.strip_tags(fp.read())
+ stripped = html.strip_tags(content)
elapsed = datetime.now() - start
self.assertEqual(elapsed.seconds, 0)
self.assertIn("Please try again.", stripped)
diff --git a/tests/utils_tests/test_safestring.py b/tests/utils_tests/test_safestring.py
new file mode 100644
index 0000000000..a6f0c0a01c
--- /dev/null
+++ b/tests/utils_tests/test_safestring.py
@@ -0,0 +1,53 @@
+from __future__ import absolute_import, unicode_literals
+
+
+from django.template import Template, Context
+from django.test import TestCase
+from django.utils.encoding import force_text, force_bytes
+from django.utils.functional import lazy, Promise
+from django.utils.html import escape, conditional_escape
+from django.utils.safestring import mark_safe, mark_for_escaping
+from django.utils import six
+from django.utils import translation
+
+lazystr = lazy(force_text, six.text_type)
+lazybytes = lazy(force_bytes, bytes)
+
+
+class SafeStringTest(TestCase):
+ def assertRenderEqual(self, tpl, expected, **context):
+ context = Context(context)
+ tpl = Template(tpl)
+ self.assertEqual(tpl.render(context), expected)
+
+ def test_mark_safe(self):
+ s = mark_safe('a&b')
+
+ self.assertRenderEqual('{{ s }}', 'a&b', s=s)
+ self.assertRenderEqual('{{ s|force_escape }}', 'a&amp;b', s=s)
+
+ def test_mark_safe_lazy(self):
+ s = lazystr('a&b')
+ b = lazybytes(b'a&b')
+
+ self.assertIsInstance(mark_safe(s), Promise)
+ self.assertIsInstance(mark_safe(b), Promise)
+ self.assertRenderEqual('{{ s }}', 'a&b', s=mark_safe(s))
+
+ def test_mark_for_escaping(self):
+ s = mark_for_escaping('a&b')
+ self.assertRenderEqual('{{ s }}', 'a&amp;b', s=s)
+ self.assertRenderEqual('{{ s }}', 'a&amp;b', s=mark_for_escaping(s))
+
+ def test_mark_for_escaping_lazy(self):
+ s = lazystr('a&b')
+ b = lazybytes(b'a&b')
+
+ self.assertIsInstance(mark_for_escaping(s), Promise)
+ self.assertIsInstance(mark_for_escaping(b), Promise)
+ self.assertRenderEqual('{% autoescape off %}{{ s }}{% endautoescape %}', 'a&amp;b', s=mark_for_escaping(s))
+
+ def test_regression_20296(self):
+ s = mark_safe(translation.ugettext_lazy("username"))
+ with translation.override('fr'):
+ self.assertRenderEqual('{{ s }}', "nom d'utilisateur", s=s)
diff --git a/tests/utils_tests/test_simplelazyobject.py b/tests/utils_tests/test_simplelazyobject.py
index f925e01eb6..4c01bd3adf 100644
--- a/tests/utils_tests/test_simplelazyobject.py
+++ b/tests/utils_tests/test_simplelazyobject.py
@@ -68,7 +68,7 @@ class TestUtilsSimpleLazyObject(TestCase):
# Second, for an evaluated SimpleLazyObject
name = x.name # evaluate
- self.assertTrue(isinstance(x._wrapped, _ComplexObject))
+ self.assertIsInstance(x._wrapped, _ComplexObject)
# __repr__ contains __repr__ of wrapped object
self.assertEqual("<SimpleLazyObject: %r>" % x._wrapped, repr(x))
@@ -161,3 +161,25 @@ class TestUtilsSimpleLazyObject(TestCase):
self.assertNotEqual(lazy1, lazy3)
self.assertTrue(lazy1 != lazy3)
self.assertFalse(lazy1 != lazy2)
+
+ def test_pickle_py2_regression(self):
+ from django.contrib.auth.models import User
+
+ # See ticket #20212
+ user = User.objects.create_user('johndoe', 'john@example.com', 'pass')
+ x = SimpleLazyObject(lambda: user)
+
+ # This would fail with "TypeError: can't pickle instancemethod objects",
+ # only on Python 2.X.
+ pickled = pickle.dumps(x)
+
+ # Try the variant protocol levels.
+ pickled = pickle.dumps(x, 0)
+ pickled = pickle.dumps(x, 1)
+ pickled = pickle.dumps(x, 2)
+
+ if not six.PY3:
+ import cPickle
+
+ # This would fail with "TypeError: expected string or Unicode object, NoneType found".
+ pickled = cPickle.dumps(x)
diff --git a/tests/utils_tests/test_timesince.py b/tests/utils_tests/test_timesince.py
index 5e641a42c4..cdb95e6877 100644
--- a/tests/utils_tests/test_timesince.py
+++ b/tests/utils_tests/test_timesince.py
@@ -21,32 +21,33 @@ class TimesinceTests(unittest.TestCase):
def test_equal_datetimes(self):
""" equal datetimes. """
- self.assertEqual(timesince(self.t, self.t), '0 minutes')
+ # NOTE: \xa0 avoids wrapping between value and unit
+ self.assertEqual(timesince(self.t, self.t), '0\xa0minutes')
def test_ignore_microseconds_and_seconds(self):
""" Microseconds and seconds are ignored. """
self.assertEqual(timesince(self.t, self.t+self.onemicrosecond),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t+self.onesecond),
- '0 minutes')
+ '0\xa0minutes')
def test_other_units(self):
""" Test other units. """
self.assertEqual(timesince(self.t, self.t+self.oneminute),
- '1 minute')
- self.assertEqual(timesince(self.t, self.t+self.onehour), '1 hour')
- self.assertEqual(timesince(self.t, self.t+self.oneday), '1 day')
- self.assertEqual(timesince(self.t, self.t+self.oneweek), '1 week')
+ '1\xa0minute')
+ self.assertEqual(timesince(self.t, self.t+self.onehour), '1\xa0hour')
+ self.assertEqual(timesince(self.t, self.t+self.oneday), '1\xa0day')
+ self.assertEqual(timesince(self.t, self.t+self.oneweek), '1\xa0week')
self.assertEqual(timesince(self.t, self.t+self.onemonth),
- '1 month')
- self.assertEqual(timesince(self.t, self.t+self.oneyear), '1 year')
+ '1\xa0month')
+ self.assertEqual(timesince(self.t, self.t+self.oneyear), '1\xa0year')
def test_multiple_units(self):
""" Test multiple units. """
self.assertEqual(timesince(self.t,
- self.t+2*self.oneday+6*self.onehour), '2 days, 6 hours')
+ self.t+2*self.oneday+6*self.onehour), '2\xa0days, 6\xa0hours')
self.assertEqual(timesince(self.t,
- self.t+2*self.oneweek+2*self.oneday), '2 weeks, 2 days')
+ self.t+2*self.oneweek+2*self.oneday), '2\xa0weeks, 2\xa0days')
def test_display_first_unit(self):
"""
@@ -55,10 +56,10 @@ class TimesinceTests(unittest.TestCase):
"""
self.assertEqual(timesince(self.t,
self.t+2*self.oneweek+3*self.onehour+4*self.oneminute),
- '2 weeks')
+ '2\xa0weeks')
self.assertEqual(timesince(self.t,
- self.t+4*self.oneday+5*self.oneminute), '4 days')
+ self.t+4*self.oneday+5*self.oneminute), '4\xa0days')
def test_display_second_before_first(self):
"""
@@ -66,30 +67,30 @@ class TimesinceTests(unittest.TestCase):
get 0 minutes.
"""
self.assertEqual(timesince(self.t, self.t-self.onemicrosecond),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.onesecond),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.oneminute),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.onehour),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.oneday),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.oneweek),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.onemonth),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t, self.t-self.oneyear),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t,
- self.t-2*self.oneday-6*self.onehour), '0 minutes')
+ self.t-2*self.oneday-6*self.onehour), '0\xa0minutes')
self.assertEqual(timesince(self.t,
- self.t-2*self.oneweek-2*self.oneday), '0 minutes')
+ self.t-2*self.oneweek-2*self.oneday), '0\xa0minutes')
self.assertEqual(timesince(self.t,
self.t-2*self.oneweek-3*self.onehour-4*self.oneminute),
- '0 minutes')
+ '0\xa0minutes')
self.assertEqual(timesince(self.t,
- self.t-4*self.oneday-5*self.oneminute), '0 minutes')
+ self.t-4*self.oneday-5*self.oneminute), '0\xa0minutes')
def test_different_timezones(self):
""" When using two different timezones. """
@@ -97,28 +98,28 @@ class TimesinceTests(unittest.TestCase):
now_tz = datetime.datetime.now(LocalTimezone(now))
now_tz_i = datetime.datetime.now(FixedOffset((3 * 60) + 15))
- self.assertEqual(timesince(now), '0 minutes')
- self.assertEqual(timesince(now_tz), '0 minutes')
- self.assertEqual(timeuntil(now_tz, now_tz_i), '0 minutes')
+ self.assertEqual(timesince(now), '0\xa0minutes')
+ self.assertEqual(timesince(now_tz), '0\xa0minutes')
+ self.assertEqual(timeuntil(now_tz, now_tz_i), '0\xa0minutes')
def test_date_objects(self):
""" Both timesince and timeuntil should work on date objects (#17937). """
today = datetime.date.today()
- self.assertEqual(timesince(today + self.oneday), '0 minutes')
- self.assertEqual(timeuntil(today - self.oneday), '0 minutes')
+ self.assertEqual(timesince(today + self.oneday), '0\xa0minutes')
+ self.assertEqual(timeuntil(today - self.oneday), '0\xa0minutes')
def test_both_date_objects(self):
""" Timesince should work with both date objects (#9672) """
today = datetime.date.today()
- self.assertEqual(timeuntil(today + self.oneday, today), '1 day')
- self.assertEqual(timeuntil(today - self.oneday, today), '0 minutes')
- self.assertEqual(timeuntil(today + self.oneweek, today), '1 week')
+ self.assertEqual(timeuntil(today + self.oneday, today), '1\xa0day')
+ self.assertEqual(timeuntil(today - self.oneday, today), '0\xa0minutes')
+ self.assertEqual(timeuntil(today + self.oneweek, today), '1\xa0week')
def test_naive_datetime_with_tzinfo_attribute(self):
class naive(datetime.tzinfo):
def utcoffset(self, dt):
return None
future = datetime.datetime(2080, 1, 1, tzinfo=naive())
- self.assertEqual(timesince(future), '0 minutes')
+ self.assertEqual(timesince(future), '0\xa0minutes')
past = datetime.datetime(1980, 1, 1, tzinfo=naive())
- self.assertEqual(timeuntil(past), '0 minutes')
+ self.assertEqual(timeuntil(past), '0\xa0minutes')