11import re
22
33from django .template import Context
4- from django .template .base import Token , TokenType
4+ from django .template .base import Parser , Token , TokenType
55
66import pytest
77
88from django_unicorn .components import UnicornView
9+ from django_unicorn .errors import ComponentNotValid
910from django_unicorn .templatetags .unicorn import unicorn
1011from django_unicorn .utils import generate_checksum
1112from example .coffee .models import Flavor
1213
1314
15+ class FakeComponent (UnicornView ):
16+ template_name = "templates/test_component.html"
17+
18+
1419class FakeComponentParent (UnicornView ):
1520 template_name = "templates/test_component_parent.html"
1621
@@ -66,7 +71,7 @@ def test_unicorn_render_kwarg():
6671 TokenType .TEXT ,
6772 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' test_kwarg='tested!'" ,
6873 )
69- unicorn_node = unicorn (None , token )
74+ unicorn_node = unicorn (Parser ([]) , token )
7075 context = {}
7176 actual = unicorn_node .render (Context (context ))
7277
@@ -78,7 +83,7 @@ def test_unicorn_render_context_variable():
7883 TokenType .TEXT ,
7984 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' test_kwarg=test_var.nested" ,
8085 )
81- unicorn_node = unicorn (None , token )
86+ unicorn_node = unicorn (Parser ([]) , token )
8287 context = {"test_var" : {"nested" : "variable!" }}
8388 actual = unicorn_node .render (Context (context ))
8489
@@ -90,7 +95,7 @@ def test_unicorn_render_with_invalid_html():
9095 TokenType .TEXT ,
9196 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargsWithHtmlEntity' test_kwarg=test_var.nested" ,
9297 )
93- unicorn_node = unicorn (None , token )
98+ unicorn_node = unicorn (Parser ([]) , token )
9499 context = {"test_var" : {"nested" : "variable!" }}
95100 actual = unicorn_node .render (Context (context ))
96101
@@ -103,7 +108,7 @@ def test_unicorn_render_parent(settings):
103108 TokenType .TEXT ,
104109 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view" ,
105110 )
106- unicorn_node = unicorn (None , token )
111+ unicorn_node = unicorn (Parser ([]) , token )
107112 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
108113 context = {"view" : view }
109114 unicorn_node .render (Context (context ))
@@ -121,7 +126,7 @@ def test_unicorn_render_parent_with_key(settings):
121126 TokenType .TEXT ,
122127 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view key='blob'" ,
123128 )
124- unicorn_node = unicorn (None , token )
129+ unicorn_node = unicorn (Parser ([]) , token )
125130 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
126131 context = {"view" : view }
127132 unicorn_node .render (Context (context ))
@@ -138,7 +143,7 @@ def test_unicorn_render_parent_with_id(settings):
138143 TokenType .TEXT ,
139144 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view id='flob'" ,
140145 )
141- unicorn_node = unicorn (None , token )
146+ unicorn_node = unicorn (Parser ([]) , token )
142147 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
143148 context = {"view" : view }
144149 unicorn_node .render (Context (context ))
@@ -155,7 +160,7 @@ def test_unicorn_render_parent_with_pk(settings):
155160 TokenType .TEXT ,
156161 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view pk=99" ,
157162 )
158- unicorn_node = unicorn (None , token )
163+ unicorn_node = unicorn (Parser ([]) , token )
159164 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
160165 context = {"view" : view }
161166 unicorn_node .render (Context (context ))
@@ -172,7 +177,7 @@ def test_unicorn_render_parent_with_model_id(settings):
172177 TokenType .TEXT ,
173178 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view model=model" ,
174179 )
175- unicorn_node = unicorn (None , token )
180+ unicorn_node = unicorn (Parser ([]) , token )
176181 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
177182
178183 # Fake a model that only has an id
@@ -199,7 +204,7 @@ def test_unicorn_render_parent_with_model_pk(settings):
199204 TokenType .TEXT ,
200205 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view model=model" ,
201206 )
202- unicorn_node = unicorn (None , token )
207+ unicorn_node = unicorn (Parser ([]) , token )
203208 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
204209
205210 flavor = Flavor (pk = 187 )
@@ -218,7 +223,7 @@ def test_unicorn_render_id_use_pk():
218223 TokenType .TEXT ,
219224 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentModel' model_id=model.id" ,
220225 )
221- unicorn_node = unicorn (None , token )
226+ unicorn_node = unicorn (Parser ([]) , token )
222227 context = {"model" : {"pk" : 123 }}
223228 actual = unicorn_node .render (Context (context ))
224229
@@ -231,7 +236,7 @@ def test_unicorn_render_component_one_script_tag(settings):
231236 TokenType .TEXT ,
232237 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs'" ,
233238 )
234- unicorn_node = unicorn (None , token )
239+ unicorn_node = unicorn (Parser ([]) , token )
235240 context = {}
236241 html = unicorn_node .render (Context (context ))
237242
@@ -245,7 +250,7 @@ def test_unicorn_render_child_component_no_script_tag(settings):
245250 TokenType .TEXT ,
246251 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view" ,
247252 )
248- unicorn_node = unicorn (None , token )
253+ unicorn_node = unicorn (Parser ([]) , token )
249254 view = FakeComponentParent (component_name = "test" , component_id = "asdf" )
250255 context = {"view" : view }
251256 html = unicorn_node .render (Context (context ))
@@ -259,7 +264,7 @@ def test_unicorn_render_parent_component_one_script_tag(settings):
259264 TokenType .TEXT ,
260265 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentParent'" ,
261266 )
262- unicorn_node = unicorn (None , token )
267+ unicorn_node = unicorn (Parser ([]) , token )
263268 context = {}
264269 html = unicorn_node .render (Context (context ))
265270
@@ -273,7 +278,7 @@ def test_unicorn_render_calls(settings):
273278 TokenType .TEXT ,
274279 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentCalls'" ,
275280 )
276- unicorn_node = unicorn (None , token )
281+ unicorn_node = unicorn (Parser ([]) , token )
277282 context = {}
278283 html = unicorn_node .render (Context (context ))
279284
@@ -288,7 +293,7 @@ def test_unicorn_render_calls_with_arg(settings):
288293 TokenType .TEXT ,
289294 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentCalls2'" ,
290295 )
291- unicorn_node = unicorn (None , token )
296+ unicorn_node = unicorn (Parser ([]) , token )
292297 context = {}
293298 html = unicorn_node .render (Context (context ))
294299
@@ -303,7 +308,7 @@ def test_unicorn_render_calls_no_mount_call(settings):
303308 TokenType .TEXT ,
304309 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentParent'" ,
305310 )
306- unicorn_node = unicorn (None , token )
311+ unicorn_node = unicorn (Parser ([]) , token )
307312 context = {}
308313 html = unicorn_node .render (Context (context ))
309314
@@ -318,7 +323,7 @@ def test_unicorn_render_hash(settings):
318323 TokenType .TEXT ,
319324 "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentParent'" ,
320325 )
321- unicorn_node = unicorn (None , token )
326+ unicorn_node = unicorn (Parser ([]) , token )
322327 context = {}
323328 html = unicorn_node .render (Context (context ))
324329
@@ -331,3 +336,33 @@ def test_unicorn_render_hash(settings):
331336 rendered_content = html [:script_idx ]
332337 expected_hash = generate_checksum (rendered_content )
333338 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