mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-07 13:54:47 +03:00
Merge 2d376c487f
into 0b373be712
This commit is contained in:
commit
ab3f9fcb00
81
tests/test_encoders.py
Normal file
81
tests/test_encoders.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
from datetime import date, datetime, timedelta, tzinfo
|
||||||
|
from decimal import Decimal
|
||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
from rest_framework.utils.encoders import JSONEncoder
|
||||||
|
|
||||||
|
|
||||||
|
class JSONEncoderTests(TestCase):
|
||||||
|
"""
|
||||||
|
Tests the JSONEncoder method
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.encoder = JSONEncoder()
|
||||||
|
|
||||||
|
def test_encode_decimal(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a decimal
|
||||||
|
"""
|
||||||
|
d = Decimal(3.14)
|
||||||
|
self.assertEqual(d, float(d))
|
||||||
|
|
||||||
|
def test_encode_datetime(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a datetime object
|
||||||
|
"""
|
||||||
|
current_time = datetime.now()
|
||||||
|
self.assertEqual(self.encoder.default(current_time), current_time.isoformat())
|
||||||
|
|
||||||
|
def test_encode_time(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a timezone
|
||||||
|
"""
|
||||||
|
current_time = datetime.now().time()
|
||||||
|
self.assertEqual(self.encoder.default(current_time), current_time.isoformat()[:12])
|
||||||
|
|
||||||
|
def test_encode_time_tz(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a timezone aware timestamp
|
||||||
|
"""
|
||||||
|
|
||||||
|
class UTC(tzinfo):
|
||||||
|
"""
|
||||||
|
Class extending tzinfo to mimic UTC time
|
||||||
|
"""
|
||||||
|
def utcoffset(self, dt):
|
||||||
|
return timedelta(0)
|
||||||
|
|
||||||
|
def tzname(self, dt):
|
||||||
|
return "UTC"
|
||||||
|
|
||||||
|
def dst(self, dt):
|
||||||
|
return timedelta(0)
|
||||||
|
|
||||||
|
current_time = datetime.now().time()
|
||||||
|
current_time = current_time.replace(tzinfo=UTC())
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.encoder.default(current_time)
|
||||||
|
|
||||||
|
def test_encode_date(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a date object
|
||||||
|
"""
|
||||||
|
current_date = date.today()
|
||||||
|
self.assertEqual(self.encoder.default(current_date), current_date.isoformat())
|
||||||
|
|
||||||
|
def test_encode_timedelta(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a timedelta object
|
||||||
|
"""
|
||||||
|
delta = timedelta(hours=1)
|
||||||
|
self.assertEqual(self.encoder.default(delta), str(delta.total_seconds()))
|
||||||
|
|
||||||
|
def test_encode_uuid(self):
|
||||||
|
"""
|
||||||
|
Tests encoding a UUID object
|
||||||
|
"""
|
||||||
|
unique_id = uuid4()
|
||||||
|
self.assertEqual(self.encoder.default(unique_id), str(unique_id))
|
|
@ -3,8 +3,9 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
|
from rest_framework.relations import Hyperlink
|
||||||
from rest_framework.templatetags.rest_framework import (
|
from rest_framework.templatetags.rest_framework import (
|
||||||
add_query_param, urlize_quoted_links
|
add_nested_class, add_query_param, format_value, urlize_quoted_links
|
||||||
)
|
)
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
|
@ -22,6 +23,104 @@ class TemplateTagTests(TestCase):
|
||||||
self.assertIn("q=%E6%9F%A5%E8%AF%A2", json_url)
|
self.assertIn("q=%E6%9F%A5%E8%AF%A2", json_url)
|
||||||
self.assertIn("format=json", json_url)
|
self.assertIn("format=json", json_url)
|
||||||
|
|
||||||
|
def test_format_value_boolean_or_none(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with booleans and None
|
||||||
|
"""
|
||||||
|
self.assertEqual(format_value(True), '<code>true</code>')
|
||||||
|
self.assertEqual(format_value(False), '<code>false</code>')
|
||||||
|
self.assertEqual(format_value(None), '<code>null</code>')
|
||||||
|
|
||||||
|
def test_format_value_hyperlink(self):
|
||||||
|
url = 'http://url.com'
|
||||||
|
name = 'name_of_url'
|
||||||
|
hyperlink = Hyperlink(url, name)
|
||||||
|
self.assertEqual(format_value(hyperlink), '<a href=%s>%s</a>' % (url, name))
|
||||||
|
|
||||||
|
def test_format_value_list(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with a list of strings
|
||||||
|
"""
|
||||||
|
list_items = ['item1', 'item2', 'item3']
|
||||||
|
self.assertEqual(format_value(list_items), '\n item1, item2, item3\n')
|
||||||
|
self.assertEqual(format_value([]), '\n\n')
|
||||||
|
|
||||||
|
def test_format_value_table(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with a list of lists/dicts
|
||||||
|
"""
|
||||||
|
list_of_lists = [['list1'], ['list2'], ['list3']]
|
||||||
|
self.assertEqual(
|
||||||
|
format_value(list_of_lists).replace(' ', ''),
|
||||||
|
'\n<tableclass="tabletable-striped">\n<tbody>\n\n<tr>\n<th>0</th>\n<td>\nlist1\n</td>\n</tr>\n\n<tr>\n<th>1</th>\n<td>\nlist2\n</td>\n</tr>\n\n<tr>\n<th>2</th>\n<td>\nlist3\n</td>\n</tr>\n\n</tbody>\n</table>\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
list_of_dicts = [{'item1': 'value1'}, {'item2': 'value2'}, {'item3': 'value3'}]
|
||||||
|
self.assertEqual(
|
||||||
|
format_value(list_of_dicts).replace(' ', ''),
|
||||||
|
'\n<tableclass="tabletable-striped">\n<tbody>\n\n<tr>\n<th>0</th>\n<td></td>\n</tr>\n\n<tr>\n<th>1</th>\n<td></td>\n</tr>\n\n<tr>\n<th>2</th>\n<td></td>\n</tr>\n\n</tbody>\n</table>\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_format_value_simple_string(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with a simple string
|
||||||
|
"""
|
||||||
|
simple_string = 'this is an example of a string'
|
||||||
|
self.assertEqual(format_value(simple_string), simple_string)
|
||||||
|
|
||||||
|
def test_format_value_string_hyperlink(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with a url
|
||||||
|
"""
|
||||||
|
url = 'http://www.example.com'
|
||||||
|
self.assertEqual(format_value(url), '<a href="http://www.example.com">http://www.example.com</a>')
|
||||||
|
|
||||||
|
def test_format_value_string_email(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with an email address
|
||||||
|
"""
|
||||||
|
email = 'something@somewhere.com'
|
||||||
|
self.assertEqual(format_value(email), '<a href="mailto:something@somewhere.com">something@somewhere.com</a>')
|
||||||
|
|
||||||
|
def test_format_value_string_newlines(self):
|
||||||
|
"""
|
||||||
|
Tests format_value with a string with newline characters
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
text = 'Dear user, \n this is a message \n from,\nsomeone'
|
||||||
|
self.assertEqual(format_value(text), '<pre>Dear user, \n this is a message \n from,\nsomeone</pre>')
|
||||||
|
|
||||||
|
def test_format_value_object(self):
|
||||||
|
"""
|
||||||
|
Tests that format_value with a object returns the object's __str__ method
|
||||||
|
"""
|
||||||
|
obj = object()
|
||||||
|
self.assertEqual(format_value(obj), obj.__str__())
|
||||||
|
|
||||||
|
def test_add_nested_class(self):
|
||||||
|
"""
|
||||||
|
Tests that add_nested_class returns the proper class
|
||||||
|
"""
|
||||||
|
positive_cases = [
|
||||||
|
[['item']],
|
||||||
|
[{'item1': 'value1'}],
|
||||||
|
{'item1': 'value1'}
|
||||||
|
]
|
||||||
|
|
||||||
|
negative_cases = [
|
||||||
|
['list'],
|
||||||
|
'',
|
||||||
|
None,
|
||||||
|
True,
|
||||||
|
False
|
||||||
|
]
|
||||||
|
|
||||||
|
for case in positive_cases:
|
||||||
|
self.assertEqual(add_nested_class(case), 'class=nested')
|
||||||
|
|
||||||
|
for case in negative_cases:
|
||||||
|
self.assertEqual(add_nested_class(case), '')
|
||||||
|
|
||||||
|
|
||||||
class Issue1386Tests(TestCase):
|
class Issue1386Tests(TestCase):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue
Block a user