@@ -15,137 +15,145 @@ def dump(tree, tabs=0):
1515
1616class JinjaTestCase (unittest .TestCase ):
1717def setUp (self ):
18- self .parser = html5lib .HTMLParser (strict = False ,namespaceHTMLElements = False )
18+ self .parser = html5lib .HTMLParser (strict = True ,namespaceHTMLElements = False )
1919
2020def test_var_1 (self ):
2121html_string = """<h1>{{ hi }}</h1>"""
2222
2323tree = self .parser .parseFragment (html_string )
2424
25- h1 = tree [0 ]
26- jt = h1 [0 ]
27- var1 = jt [0 ]
28- self .assertEqual (h1 .tag ,"h1" )
29- self .assertEqual (var1 .tag ,'jinjavariable' )
30- self .assertEqual (var1 .attrib ['value' ],'hi' )
25+ self .assertTree (tree , [{
26+ 'tag' :'h1' ,
27+ 'children' : [{
28+ 'tag' :'jinjavariabletag' ,
29+ 'children' : [{
30+ 'tag' :'jinjavariable' ,
31+ 'value' :'hi'
32+ }]
33+ }]
34+ }])
3135
3236def test_var_2 (self ):
3337html_string = """<h1>{{ a.b }}</h1>"""
3438
3539tree = self .parser .parseFragment (html_string )
3640
37- h1 = tree [0 ]
38- jt = h1 [0 ]
39- var1 = jt [0 ]
40- self .assertEqual (h1 .tag ,"h1" )
41- self .assertEqual (var1 .tag ,'jinjavariable' )
42- self .assertEqual (var1 .attrib ['value' ],'a.b' )
41+ self .assertTree (tree , [{
42+ 'tag' :'h1' ,
43+ 'children' : [{
44+ 'tag' :'jinjavariabletag' ,
45+ 'children' : [{
46+ 'tag' :'jinjavariable' ,
47+ 'value' :'a.b'
48+ }]
49+ }]
50+ }])
4351
4452def test_filter_1 (self ):
4553html_string = """<h1>{{ hi | yo }}</h1>"""
4654
4755tree = self .parser .parseFragment (html_string )
4856
49- h1 = tree [0 ]
50- self .assertEqual (h1 .tag ,"h1" )
51-
52- jt = h1 [0 ]
53-
54- hi = jt [0 ]
55- pipe1 = jt [1 ]
56- yo = jt [2 ]
57-
58- self .assertEqual (hi .tag ,'jinjavariable' )
59- self .assertEqual (hi .attrib ['value' ],'hi' )
60- self .assertEqual (pipe1 .tag ,'jinjapipe' )
61- self .assertEqual (pipe1 .attrib ['value' ],'|' )
62- self .assertEqual (yo .tag ,'jinjafilter' )
63- self .assertEqual (yo .attrib ['value' ],'yo' )
57+ self .assertTree (tree , [{
58+ 'tag' :'h1' ,
59+ 'children' : [{
60+ 'tag' :'jinjavariabletag' ,
61+ 'children' : [{
62+ 'tag' :'jinjavariable' ,
63+ 'value' :'hi'
64+ }, {
65+ 'tag' :'jinjapipe' ,
66+ 'value' :'|'
67+ }, {
68+ 'tag' :'jinjafilter' ,
69+ 'value' :'yo'
70+ }]
71+ }]
72+ }])
6473
6574def test_filter_2 (self ):
6675html_string = """<h1>{{ hi | yo("hi") }}</h1>"""
6776
6877tree = self .parser .parseFragment (html_string )
6978dump (tree )
7079
71- h1 = tree [ 0 ]
72- self . assertEqual ( h1 . tag , "h1" )
73-
74- jt = h1 [ 0 ]
75-
76- hi = jt [ 0 ]
77- pipe1 = jt [ 1 ]
78- yo = jt [ 2 ]
79-
80- self . assertEqual ( hi . tag , 'jinjavariable' )
81- self . assertEqual ( hi . attrib [ 'value' ], 'hi' )
82- self . assertEqual ( pipe1 . tag , 'jinjapipe' )
83- self . assertEqual ( pipe1 . attrib [ 'value' ], '|' )
84- self . assertEqual ( yo . tag , 'jinjafilter' )
85- self . assertEqual ( yo . attrib [ 'value' ], 'yo' )
86-
87- arg1 = yo [ 0 ]
88-
89- self . assertEqual ( arg1 . tag , 'jinjaargument' )
90- self . assertEqual ( arg1 . attrib [ 'value' ], '"hi"' )
80+ self . assertTree ( tree , [{
81+ ' tag' : 'h1' ,
82+ 'children' : [{
83+ 'tag' : 'jinjavariabletag' ,
84+ 'children' : [{
85+ 'tag' : 'jinjavariable' ,
86+ 'value' : 'hi'
87+ }, {
88+ 'tag' : 'jinjapipe' ,
89+ 'value' : '|'
90+ }, {
91+ ' tag' : 'jinjafilter' ,
92+ 'value' : 'yo' ,
93+ 'children' : [{
94+ 'tag' : 'jinjaargument' ,
95+ 'value' : '"hi"'
96+ } ]
97+ }]
98+ }]
99+ }] )
91100
92101def test_filter_3 (self ):
93102html_string = """<h1>{{ hi | yo("hi", "mike") }}</h1>"""
94103
95104tree = self .parser .parseFragment (html_string )
96105dump (tree )
97106
98- h1 = tree [ 0 ]
99- self . assertEqual ( h1 . tag , "h1" )
100-
101- jt = h1 [ 0 ]
102-
103- hi = jt [ 0 ]
104- pipe1 = jt [ 1 ]
105- yo = jt [ 2 ]
106-
107- self . assertEqual ( hi . tag , 'jinjavariable' )
108- self . assertEqual ( hi . attrib [ 'value' ], 'hi' )
109- self . assertEqual ( pipe1 . tag , 'jinjapipe' )
110- self . assertEqual ( pipe1 . attrib [ 'value' ], '|' )
111- self . assertEqual ( yo . tag , 'jinjafilter' )
112- self . assertEqual ( yo . attrib [ 'value' ], 'yo' )
113-
114- arg1 = yo [ 0 ]
115- arg2 = yo [ 1 ]
116-
117- self . assertEqual ( arg1 . tag , 'jinjaargument' )
118- self . assertEqual ( arg1 . attrib [ 'value' ], '"hi"' )
119- self . assertEqual ( arg2 . tag , 'jinjaargument' )
120- self . assertEqual ( arg2 . attrib [ 'value' ], '"mike"' )
107+ self . assertTree ( tree , [{
108+ ' tag' : 'h1' ,
109+ 'children' : [{
110+ 'tag' : 'jinjavariabletag' ,
111+ 'children' : [{
112+ 'tag' : 'jinjavariable' ,
113+ 'value' : 'hi'
114+ }, {
115+ 'tag' : 'jinjapipe' ,
116+ 'value' : '|'
117+ }, {
118+ ' tag' : 'jinjafilter' ,
119+ 'value' : 'yo' ,
120+ 'children' : [{
121+ 'tag' : 'jinjaargument' ,
122+ 'value' : '"hi"'
123+ }, {
124+ 'tag' : 'jinjaargument' ,
125+ 'value' : '"mike"'
126+ }]
127+ }]
128+ }]
129+ }] )
121130
122131def test_jinja_block (self ):
123132html_string = """
124133 {% block title %}Hi{% endblock %}
125134 """
126135
127136tree = self .parser .parseFragment (html_string )
128- dump (tree )
129-
130- block = tree [0 ]
131137
132- self .assertEqual (block .tag ,'jinjablock' )
133- self .assertEqual (block .text ,'Hi' )
138+ self .assertTree (tree , [{
139+ 'tag' :'jinjablock' ,
140+ 'text' :'Hi'
141+ }])
134142
135143def test_jinja_block_in_title (self ):
136144html_string = """
137145 <title>{% block title %}{% endblock %}</title>
138146 """
139147
140148tree = self .parser .parseFragment (html_string )
141- dump (tree )
142-
143- title = tree [0 ]
144- block = title [0 ]
145149
146- self .assertEqual (title .tag ,'title' )
147- self .assertEqual (block .tag ,'jinjablock' )
148- self .assertEqual (block .attrib ['value' ],'title' )
150+ self .assertTree (tree , [{
151+ 'tag' :'title' ,
152+ 'children' : [{
153+ 'tag' :'jinjablock' ,
154+ 'value' :'title'
155+ }]
156+ }])
149157
150158def test_jinja_for (self ):
151159html_string = """
@@ -155,14 +163,104 @@ def test_jinja_for(self):
155163 """
156164
157165tree = self .parser .parseFragment (html_string )
166+
167+ self .assertTree (tree , [{
168+ 'tag' :'jinjafor' ,
169+ 'value' :'a in b' ,
170+ 'children' : [{
171+ 'tag' :'jinjavariabletag' ,
172+ 'children' : [{
173+ 'tag' :'jinjavariable' ,
174+ 'value' :'a'
175+ }]
176+ }]
177+ }])
178+
179+ def test_complete_doc (self ):
180+ html_string = """
181+ <!DOCTYPE html>
182+ <html lang="en">
183+ <head>
184+ <title>My Webpage</title>
185+ </head>
186+ <body>
187+ <ul id="navigation">
188+ {% for item in navigation %}
189+ <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
190+ {% endfor %}
191+ </ul>
192+
193+ <h1>My Webpage</h1>
194+ {{ a_variable }}
195+ </body>
196+ </html>
197+ """
198+
199+ tree = self .parser .parse (html_string )
158200dump (tree )
201+ self .assertTree (tree , [{
202+ 'tag' :'head' ,
203+ 'children' : [{
204+ 'tag' :'title' ,
205+ 'text' :'My Webpage'
206+ }]
207+ }, {
208+ 'tag' :'body' ,
209+ 'children' : [{
210+ 'tag' :'ul' ,
211+ 'children' : [{
212+ 'tag' :'jinjafor' ,
213+ 'value' :'item in navigation' ,
214+ 'children' : [{
215+ 'tag' :'li' ,
216+ 'children' : [{
217+ 'tag' :'a' ,
218+ 'children' : [{
219+ 'tag' :'jinjavariabletag' ,
220+ 'children' : [{
221+ 'tag' :'jinjavariable' ,
222+ 'value' :'item.caption'
223+ }]
224+ }]
225+ }]
226+ }]
227+ }]
228+ }, {
229+ 'tag' :'h1' ,
230+ 'text' :'My Webpage'
231+ }, {
232+ 'tag' :'jinjavariabletag' ,
233+ 'children' : [{
234+ 'tag' :'jinjavariable' ,
235+ 'value' :'a_variable'
236+ }]
237+ }]
238+ }])
239+
240+ def test_jinja_if (self ):
241+ html_string = """
242+ {% if True %}yay{% endif %}
243+ """
244+
245+ tree = self .parser .parseFragment (html_string )
246+ dump (tree )
247+
248+ self .assertTree (tree , [{
249+ 'tag' :'jinjaif' ,
250+ 'text' :'yay'
251+ }])
252+
253+ def assertTree (self ,root ,spec ):
254+ self .assertEqual (len (root ),len (spec ))
255+
256+ for child ,spec_child in zip (root ,spec ):
257+ self .assertEqual (child .tag ,spec_child ['tag' ])
258+
259+ if 'text' in spec_child :
260+ self .assertEqual (child .text ,spec_child ['text' ])
159261
160- block = tree [0 ]
161- var = block [0 ]
162- var1 = var [0 ]
262+ if 'value' in spec_child :
263+ self .assertEqual (child .attrib ['value' ],spec_child ['value' ])
163264
164- self .assertEqual (block .tag ,'jinjafor' )
165- self .assertEqual (block .attrib ['value' ],'a in b' )
166- self .assertEqual (var .tag ,'jinjavariabletag' )
167- self .assertEqual (var1 .tag ,'jinjavariable' )
168- self .assertEqual (var1 .attrib ['value' ],'a' )
265+ if 'children' in spec_child :
266+ self .assertTree (child ,spec_child ['children' ])