diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index ac218df21..28390320b 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -3,14 +3,24 @@ from __future__ import unicode_literals from django.test import TestCase +from rest_framework.relations import Hyperlink 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 factory = APIRequestFactory() +def format_html(html): + """ + Helper function that formats HTML in order for easier comparison + :param html: raw HTML text to be formatted + :return: Cleaned HTML with no newlines or spaces + """ + return html.replace('\n', '').replace(' ', '') + + class TemplateTagTests(TestCase): def test_add_query_param_with_non_latin_character(self): @@ -22,6 +32,139 @@ class TemplateTagTests(TestCase): self.assertIn("q=%E6%9F%A5%E8%AF%A2", 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), 'true') + self.assertEqual(format_value(False), 'false') + self.assertEqual(format_value(None), 'null') + + def test_format_value_hyperlink(self): + url = 'http://url.com' + name = 'name_of_url' + hyperlink = Hyperlink(url, name) + self.assertEqual(format_value(hyperlink), '%s' % (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']] + expected_list_format = """ + + + + 0 + list1 + + + 1 + list2 + + + 2 + list3 + + + """ + self.assertEqual( + format_html(format_value(list_of_lists)), + format_html(expected_list_format) + ) + + expected_dict_format = """ + + + + 0 + + + + 1 + + + + 2 + + + + """ + + list_of_dicts = [{'item1': 'value1'}, {'item2': 'value2'}, {'item3': 'value3'}] + self.assertEqual( + format_html(format_value(list_of_dicts)), + format_html(expected_dict_format) + ) + + 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), 'http://www.example.com') + + def test_format_value_string_email(self): + """ + Tests format_value with an email address + """ + email = 'something@somewhere.com' + self.assertEqual(format_value(email), 'something@somewhere.com') + + 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), '
Dear user, \n this is a message \n from,\nsomeone
') + + 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): """