1
1
import re
2
2
3
3
from django .template import Context
4
- from django .template .base import Token , TokenType
4
+ from django .template .base import Parser , Token , TokenType
5
5
6
6
import pytest
7
7
8
8
from django_unicorn .components import UnicornView
9
+ from django_unicorn .errors import ComponentNotValid
9
10
from django_unicorn .templatetags .unicorn import unicorn
10
11
from django_unicorn .utils import generate_checksum
11
12
from example .coffee .models import Flavor
12
13
13
14
15
+ class FakeComponent (UnicornView ):
16
+ template_name = "templates/test_component.html"
17
+
18
+
14
19
class FakeComponentParent (UnicornView ):
15
20
template_name = "templates/test_component_parent.html"
16
21
@@ -66,7 +71,7 @@ def test_unicorn_render_kwarg():
66
71
TokenType .TEXT ,
67
72
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' test_kwarg='tested!'" ,
68
73
)
69
- unicorn_node = unicorn (None , token )
74
+ unicorn_node = unicorn (Parser ([]) , token )
70
75
context = {}
71
76
actual = unicorn_node .render (Context (context ))
72
77
@@ -78,7 +83,7 @@ def test_unicorn_render_context_variable():
78
83
TokenType .TEXT ,
79
84
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' test_kwarg=test_var.nested" ,
80
85
)
81
- unicorn_node = unicorn (None , token )
86
+ unicorn_node = unicorn (Parser ([]) , token )
82
87
context = {"test_var" : {"nested" : "variable!" }}
83
88
actual = unicorn_node .render (Context (context ))
84
89
@@ -90,7 +95,7 @@ def test_unicorn_render_with_invalid_html():
90
95
TokenType .TEXT ,
91
96
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargsWithHtmlEntity' test_kwarg=test_var.nested" ,
92
97
)
93
- unicorn_node = unicorn (None , token )
98
+ unicorn_node = unicorn (Parser ([]) , token )
94
99
context = {"test_var" : {"nested" : "variable!" }}
95
100
actual = unicorn_node .render (Context (context ))
96
101
@@ -103,7 +108,7 @@ def test_unicorn_render_parent(settings):
103
108
TokenType .TEXT ,
104
109
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view" ,
105
110
)
106
- unicorn_node = unicorn (None , token )
111
+ unicorn_node = unicorn (Parser ([]) , token )
107
112
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
108
113
context = {"view" : view }
109
114
unicorn_node .render (Context (context ))
@@ -121,7 +126,7 @@ def test_unicorn_render_parent_with_key(settings):
121
126
TokenType .TEXT ,
122
127
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view key='blob'" ,
123
128
)
124
- unicorn_node = unicorn (None , token )
129
+ unicorn_node = unicorn (Parser ([]) , token )
125
130
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
126
131
context = {"view" : view }
127
132
unicorn_node .render (Context (context ))
@@ -138,7 +143,7 @@ def test_unicorn_render_parent_with_id(settings):
138
143
TokenType .TEXT ,
139
144
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view id='flob'" ,
140
145
)
141
- unicorn_node = unicorn (None , token )
146
+ unicorn_node = unicorn (Parser ([]) , token )
142
147
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
143
148
context = {"view" : view }
144
149
unicorn_node .render (Context (context ))
@@ -155,7 +160,7 @@ def test_unicorn_render_parent_with_pk(settings):
155
160
TokenType .TEXT ,
156
161
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view pk=99" ,
157
162
)
158
- unicorn_node = unicorn (None , token )
163
+ unicorn_node = unicorn (Parser ([]) , token )
159
164
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
160
165
context = {"view" : view }
161
166
unicorn_node .render (Context (context ))
@@ -172,7 +177,7 @@ def test_unicorn_render_parent_with_model_id(settings):
172
177
TokenType .TEXT ,
173
178
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view model=model" ,
174
179
)
175
- unicorn_node = unicorn (None , token )
180
+ unicorn_node = unicorn (Parser ([]) , token )
176
181
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
177
182
178
183
# Fake a model that only has an id
@@ -199,7 +204,7 @@ def test_unicorn_render_parent_with_model_pk(settings):
199
204
TokenType .TEXT ,
200
205
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view model=model" ,
201
206
)
202
- unicorn_node = unicorn (None , token )
207
+ unicorn_node = unicorn (Parser ([]) , token )
203
208
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
204
209
205
210
flavor = Flavor (pk = 187 )
@@ -218,7 +223,7 @@ def test_unicorn_render_id_use_pk():
218
223
TokenType .TEXT ,
219
224
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentModel' model_id=model.id" ,
220
225
)
221
- unicorn_node = unicorn (None , token )
226
+ unicorn_node = unicorn (Parser ([]) , token )
222
227
context = {"model" : {"pk" : 123 }}
223
228
actual = unicorn_node .render (Context (context ))
224
229
@@ -231,7 +236,7 @@ def test_unicorn_render_component_one_script_tag(settings):
231
236
TokenType .TEXT ,
232
237
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs'" ,
233
238
)
234
- unicorn_node = unicorn (None , token )
239
+ unicorn_node = unicorn (Parser ([]) , token )
235
240
context = {}
236
241
html = unicorn_node .render (Context (context ))
237
242
@@ -245,7 +250,7 @@ def test_unicorn_render_child_component_no_script_tag(settings):
245
250
TokenType .TEXT ,
246
251
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view" ,
247
252
)
248
- unicorn_node = unicorn (None , token )
253
+ unicorn_node = unicorn (Parser ([]) , token )
249
254
view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
250
255
context = {"view" : view }
251
256
html = unicorn_node .render (Context (context ))
@@ -259,7 +264,7 @@ def test_unicorn_render_parent_component_one_script_tag(settings):
259
264
TokenType .TEXT ,
260
265
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentParent'" ,
261
266
)
262
- unicorn_node = unicorn (None , token )
267
+ unicorn_node = unicorn (Parser ([]) , token )
263
268
context = {}
264
269
html = unicorn_node .render (Context (context ))
265
270
@@ -273,7 +278,7 @@ def test_unicorn_render_calls(settings):
273
278
TokenType .TEXT ,
274
279
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentCalls'" ,
275
280
)
276
- unicorn_node = unicorn (None , token )
281
+ unicorn_node = unicorn (Parser ([]) , token )
277
282
context = {}
278
283
html = unicorn_node .render (Context (context ))
279
284
@@ -288,7 +293,7 @@ def test_unicorn_render_calls_with_arg(settings):
288
293
TokenType .TEXT ,
289
294
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentCalls2'" ,
290
295
)
291
- unicorn_node = unicorn (None , token )
296
+ unicorn_node = unicorn (Parser ([]) , token )
292
297
context = {}
293
298
html = unicorn_node .render (Context (context ))
294
299
@@ -303,7 +308,7 @@ def test_unicorn_render_calls_no_mount_call(settings):
303
308
TokenType .TEXT ,
304
309
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentParent'" ,
305
310
)
306
- unicorn_node = unicorn (None , token )
311
+ unicorn_node = unicorn (Parser ([]) , token )
307
312
context = {}
308
313
html = unicorn_node .render (Context (context ))
309
314
@@ -318,7 +323,7 @@ def test_unicorn_render_hash(settings):
318
323
TokenType .TEXT ,
319
324
"unicorn 'tests.templatetags.test_unicorn_render.FakeComponentParent'" ,
320
325
)
321
- unicorn_node = unicorn (None , token )
326
+ unicorn_node = unicorn (Parser ([]) , token )
322
327
context = {}
323
328
html = unicorn_node .render (Context (context ))
324
329
@@ -331,3 +336,33 @@ def test_unicorn_render_hash(settings):
331
336
rendered_content = html [:script_idx ]
332
337
expected_hash = generate_checksum (rendered_content )
333
338
assert f'"hash":"{ expected_hash } "' in html
339
+
340
+
341
+ def test_unicorn_render_with_component_name_from_context ():
342
+ token = Token (
343
+ TokenType .TEXT ,
344
+ "unicorn component_name" ,
345
+ )
346
+ unicorn_node = unicorn (Parser ([]), token )
347
+ context = {"component_name" : "tests.templatetags.test_unicorn_render.FakeComponent" }
348
+ html = unicorn_node .render (Context (context ))
349
+
350
+ assert '<script type="module"' in html
351
+ assert len (re .findall ('<script type="module"' , html )) == 1
352
+
353
+
354
+ def test_unicorn_render_with_invalid_component_name_from_context ():
355
+ token = Token (
356
+ TokenType .TEXT ,
357
+ "unicorn bad_component_name" ,
358
+ )
359
+ unicorn_node = unicorn (Parser ([]), token )
360
+ context = {"component_name" : "tests.templatetags.test_unicorn_render.FakeComponent" }
361
+
362
+ with pytest .raises (ComponentNotValid ) as e :
363
+ unicorn_node .render (Context (context ))
364
+
365
+ assert (
366
+ e .exconly ()
367
+ == "django_unicorn.errors.ComponentNotValid: Component template is not valid: bad_component_name."
368
+ )
0 commit comments