/
tests.py
145 lines (101 loc) · 4.57 KB
/
tests.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
from django.test import TestCase
from django.template import Library, Template, Context, add_to_builtins,\
TemplateSyntaxError, VariableDoesNotExist
from django.db import models
import tagcon
register = Library()
class Link(models.Model):
url = models.URLField()
def __unicode__(self):
return u'<%s>' % self.url
class KeywordTag(tagcon.TemplateTag):
limit = tagcon.IntegerArg(default=5)
def render(self, context):
self.resolve(context)
return 'The limit is %d' % self.args.limit
class KeywordNoDefaultTag(tagcon.TemplateTag):
limit = tagcon.IntegerArg()
def render(self, context):
self.resolve(context)
return 'The limit is %d' % self.args.limit
class NoArgumentTag(tagcon.TemplateTag):
def render(self, context):
return 'No arguments here'
class ArgumentTypeTag(tagcon.TemplateTag):
age = tagcon.IntegerArg(null=True)
name_ = tagcon.StringArg(null=True)
url = tagcon.ModelInstanceArg(model=Link, required=False,
null=True)
def render(self, context):
self.resolve(context)
order = 'name age url'.split()
return ' '.join([str(self.args[x]) for x in order if self.args[x] is not
None])
add_to_builtins(KeywordTag.__module__)
add_to_builtins(NoArgumentTag.__module__)
add_to_builtins(ArgumentTypeTag.__module__)
render = lambda t: Template(t).render(Context())
class TagExecutionTests(TestCase):
def test_no_args(self):
"""A tag with keyword arguments works with or without the argument as
long as a default value is set"""
self.assertEqual(Template('{% keyword limit 200 %}').render(Context()),
'The limit is 200')
self.assertEqual(Template('{% keyword %}').render(Context()),
'The limit is %d' %
KeywordTag._keyword_args['limit'].default)
self.assertRaises(tagcon.TemplateTagValidationError,
render,
'{% keyword_no_default %}')
# what if we change the arg to be null=True?
KeywordNoDefaultTag._keyword_args['limit'].null = True
# now instead of on validation the error moves to when rendering. None
# is not an integer
self.assertRaises(TemplateSyntaxError,
render,
'{% keyword_no_default %}')
def test_args_format(self):
"""keyword argument syntax is {% tag arg value %}"""
self.assertRaises(TemplateSyntaxError,
Template,
'{% keyword limit=25 %}')
self.assertRaises(TemplateSyntaxError,
Template,
"{% keyword limit='25' %}")
def test_handle_args(self):
"""tags with no arguments take no arguments"""
self.assertRaises(TemplateSyntaxError,
Template,
'{% no_argument this fails %}')
class TestArgumentTypes(TestCase):
def test_model_instance_arg(self):
t = Template('{% argument_type url object %}')
object = Link(url='http://bing.com')
c = Context({'object': object})
self.assertEqual(t.render(c), object.__unicode__())
c = Context({'object': int()})
self.assertRaises(tagcon.TemplateTagValidationError,
t.render,
c)
def test_integer_arg(self):
t = Template('{% argument_type age 101 %}')
self.assertEqual(t.render(Context()), '101')
# IntegerArg.clean calls int(value) to convert "23" to 23
t = Template('{% argument_type age "23" %}')
self.assertEqual(t.render(Context()), '23')
# IntegerArg.clean will choke on the string
self.assertRaises(tagcon.TemplateTagValidationError,
render,
'{% argument_type age "7b" %}')
def test_string_arg(self):
t = Template('{% argument_type name "alice" %}')
self.assertEqual(t.render(Context()), 'alice')
# i can't remember which one (url perhaps?) but there was a tag that
# worked with single quotes but not double quotes and so we check both
t = Template("{% argument_type name 'bob' %}")
self.assertEqual(t.render(Context()), 'bob')
# will not find a var named dave in the context
try:
render('{% argument_type name dave %}')
except TemplateSyntaxError, e:
self.assertTrue(isinstance(e.exc_info[1], VariableDoesNotExist))