")
def test_does_not_modify_html_when_no_component_used(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
#
{% for form in formset %}
{% with row_number=forloop.counter %}
{{ row_number }}
{% endwith %}
{% endfor %}
"""
rendered_raw = Template(template_str).render(Context({"formset": [1]}))
rendered = render_dependencies(rendered_raw, strategy="fragment")
expected = """
"""
assertHTMLEqual(expected, rendered)
# Explanation: The component is used in the template, but the template doesn't use
# {% component_js_dependencies %} or {% component_css_dependencies %} tags,
# nor defines a `` or `` tag. In which case, the dependencies are not rendered.
def test_does_not_modify_html_when_component_used_but_nowhere_to_insert(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
#
{% for form in formset %}
{% with row_number=forloop.counter %}
{{ row_number }}
{% component "test" variable="hi" / %}
{% endwith %}
{% endfor %}
"""
rendered_raw = Template(template_str).render(Context({"formset": [1]}))
rendered = render_dependencies(rendered_raw, strategy="fragment")
# Base64 encodings:
# `PGxpbmsgaHJlZj0ic3R5bGUuY3NzIiBtZWRpYT0iYWxsIiByZWw9InN0eWxlc2hlZXQiPg==` -> ` ` # noqa: E501
# `PGxpbmsgaHJlZj0iL2NvbXBvbmVudHMvY2FjaGUvU2ltcGxlQ29tcG9uZW50XzMxMTA5Ny5jc3MiIG1lZGlhPSJhbGwiIHJlbD0ic3R5bGVzaGVldCI+` -> ` ` # noqa: E501
# `PHNjcmlwdCBzcmM9InNjcmlwdC5qcyI+PC9zY3JpcHQ+` -> ``
# `PHNjcmlwdCBzcmM9Ii9jb21wb25lbnRzL2NhY2hlL1NpbXBsZUNvbXBvbmVudF8zMTEwOTcuanMiPjwvc2NyaXB0Pg==` -> `` # noqa: E501
expected = """
""" # noqa: E501
assertHTMLEqual(expected, rendered)
def test_raises_if_script_end_tag_inside_component_js(self):
class ComponentWithScript(SimpleComponent):
js: types.js = """
console.log("");
"""
registry.register(name="test", component=ComponentWithScript)
with pytest.raises(
RuntimeError,
match=re.escape("Content of `Component.js` for component 'ComponentWithScript' contains '' end tag."), # noqa: E501
):
ComponentWithScript.render(kwargs={"variable": "foo"})
def test_raises_if_script_end_tag_inside_component_css(self):
class ComponentWithScript(SimpleComponent):
css: types.css = """
/* */
.xyz {
color: red;
}
"""
registry.register(name="test", component=ComponentWithScript)
with pytest.raises(
RuntimeError,
match=re.escape("Content of `Component.css` for component 'ComponentWithScript' contains '' end tag."), # noqa: E501
):
ComponentWithScript.render(kwargs={"variable": "foo"})
@djc_test
class TestDependenciesStrategyDocument:
def test_inserts_styles_and_script_to_default_places_if_not_overriden(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component "test" variable="foo" / %}
"""
rendered_raw = Template(template_str).render(Context({}))
rendered = render_dependencies(rendered_raw, strategy="document")
assert rendered.count("',
rendered_body,
count=1,
)
def test_does_not_insert_styles_and_script_to_default_places_if_overriden(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component "test" variable="foo" / %}
{% component_css_dependencies %}
"""
rendered_raw = Template(template_str).render(Context({}))
rendered = render_dependencies(rendered_raw, strategy="document")
assert rendered.count("',
rendered_head,
count=1,
)
@djc_test
class TestDependenciesStrategySimple:
def test_single_component(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component_css_dependencies %}
{% component 'test' variable='foo' / %}
"""
template = Template(template_str)
rendered_raw: str = template.render(Context({}))
# Placeholders
assert rendered_raw.count(' ') == 1
assert rendered_raw.count('') == 1
assert rendered_raw.count("', rendered, count=0)
# Check that it contains inlined JS and CSS, and Media.css
assert rendered.strip() == (
'\n'
" \n'
" \n"
' Variable: foo '
)
def test_multiple_components_dependencies(self):
class SimpleComponentNested(Component):
template: types.django_html = """
{% load component_tags %}
{% component "inner" variable=variable / %}
{% slot "default" default / %}
"""
css: types.css = """
.my-class {
color: red;
}
"""
js: types.js = """
console.log("Hello");
"""
def get_template_data(self, args, kwargs, slots, context):
return {}
class Media:
css = ["style.css", "style2.css"]
js = "script2.js"
class OtherComponent(Component):
template: types.django_html = """
XYZ: {{ variable }}
"""
css: types.css = """
.xyz {
color: red;
}
"""
js: types.js = """
console.log("xyz");
"""
def get_template_data(self, args, kwargs, slots, context):
return {}
class Media:
css = "xyz1.css"
js = "xyz1.js"
registry.register(name="inner", component=SimpleComponent)
registry.register(name="outer", component=SimpleComponentNested)
registry.register(name="other", component=OtherComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component_css_dependencies %}
{% component 'outer' variable='variable' %}
{% component 'other' variable='variable_inner' / %}
{% endcomponent %}
"""
template = Template(template_str)
rendered_raw: str = template.render(Context({}))
rendered = render_dependencies(rendered_raw, strategy="simple")
# Dependency manager script NOT present
assertInHTML('', rendered, count=0)
assert rendered.count("
""",
rendered,
count=1,
)
# Check that there's no payload like with "document" or "fragment" modes
assert "application/json" not in rendered
@djc_test
class TestDependenciesStrategyPrepend:
def test_single_component(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component_css_dependencies %}
{% component 'test' variable='foo' / %}
"""
template = Template(template_str)
rendered_raw: str = template.render(Context({}))
# Placeholders
assert rendered_raw.count(' ') == 1
assert rendered_raw.count('') == 1
assert rendered_raw.count("', rendered, count=0)
# Check that it contains inlined JS and CSS, and Media.css
assert rendered.strip() == (
' \n'
" \n"
" \n"
" \n"
" \n"
' Variable: foo '
)
def test_multiple_components_dependencies(self):
class SimpleComponentNested(Component):
template: types.django_html = """
{% load component_tags %}
{% component "inner" variable=variable / %}
{% slot "default" default / %}
"""
css: types.css = """
.my-class {
color: red;
}
"""
js: types.js = """
console.log("Hello");
"""
def get_template_data(self, args, kwargs, slots, context):
return {}
class Media:
css = ["style.css", "style2.css"]
js = "script2.js"
class OtherComponent(Component):
template: types.django_html = """
XYZ: {{ variable }}
"""
css: types.css = """
.xyz {
color: red;
}
"""
js: types.js = """
console.log("xyz");
"""
def get_template_data(self, args, kwargs, slots, context):
return {}
class Media:
css = "xyz1.css"
js = "xyz1.js"
registry.register(name="inner", component=SimpleComponent)
registry.register(name="outer", component=SimpleComponentNested)
registry.register(name="other", component=OtherComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component_css_dependencies %}
{% component 'outer' variable='variable' %}
{% component 'other' variable='variable_inner' / %}
{% endcomponent %}
"""
template = Template(template_str)
rendered_raw: str = template.render(Context({}))
rendered = render_dependencies(rendered_raw, strategy="prepend")
# Dependency manager script NOT present
assertInHTML('', rendered, count=0)
assert rendered.count("
""",
rendered,
count=1,
)
# Check that there's no payload like with "document" or "fragment" modes
assert "application/json" not in rendered
@djc_test
class TestDependenciesStrategyAppend:
def test_single_component(self):
registry.register(name="test", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component_css_dependencies %}
{% component 'test' variable='foo' / %}
"""
template = Template(template_str)
rendered_raw: str = template.render(Context({}))
# Placeholders
assert rendered_raw.count(' ') == 1
assert rendered_raw.count('') == 1
assert rendered_raw.count("', rendered, count=0)
# Check that it contains inlined JS and CSS, and Media.css
assert rendered.strip() == (
'Variable: foo \n'
" \n"
' '
)
def test_multiple_components_dependencies(self):
class SimpleComponentNested(Component):
template: types.django_html = """
{% load component_tags %}
{% component "inner" variable=variable / %}
{% slot "default" default / %}
"""
css: types.css = """
.my-class {
color: red;
}
"""
js: types.js = """
console.log("Hello");
"""
def get_template_data(self, args, kwargs, slots, context):
return {}
class Media:
css = ["style.css", "style2.css"]
js = "script2.js"
class OtherComponent(Component):
template: types.django_html = """
XYZ: {{ variable }}
"""
css: types.css = """
.xyz {
color: red;
}
"""
js: types.js = """
console.log("xyz");
"""
def get_template_data(self, args, kwargs, slots, context):
return {}
class Media:
css = "xyz1.css"
js = "xyz1.js"
registry.register(name="inner", component=SimpleComponent)
registry.register(name="outer", component=SimpleComponentNested)
registry.register(name="other", component=OtherComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_js_dependencies %}
{% component_css_dependencies %}
{% component 'outer' variable='variable' %}
{% component 'other' variable='variable_inner' / %}
{% endcomponent %}
"""
template = Template(template_str)
rendered_raw: str = template.render(Context({}))
rendered = render_dependencies(rendered_raw, strategy="append")
# Dependency manager script NOT present
assertInHTML('', rendered, count=0)
assert rendered.count("
""",
rendered,
count=1,
)
# Check that there's no payload like with "document" or "fragment" modes
assert "application/json" not in rendered
@djc_test
class TestMiddleware:
def test_middleware_response_without_content_type(self):
response = HttpResponseNotModified()
middleware = ComponentDependencyMiddleware(get_response=lambda _: response)
request = Mock()
assert response == middleware(request=request)
def test_middleware_response_with_components_with_slash_dash_and_underscore(self):
registry.register("dynamic", DynamicComponent)
registry.register("test-component", component=SimpleComponent)
registry.register("test/component", component=SimpleComponent)
registry.register("test_component", component=SimpleComponent)
template_str: types.django_html = """
{% load component_tags %}
{% component_css_dependencies %}
{% component_js_dependencies %}
{% component "dynamic" is=component_name variable='value' / %}
"""
template = Template(template_str)
def assert_dependencies(content: str):
# Dependency manager script (empty)
assertInHTML('', content, count=1)
# Inlined JS
assertInHTML('', content, count=1)
# Inlined CSS
assertInHTML("", content, count=1)
# Media.css
assertInHTML(' ', content, count=1)
rendered1 = create_and_process_template_response(
template,
context=Context({"component_name": "test-component"}),
)
assert_dependencies(rendered1)
assert rendered1.count('Variable: value ') == 1
rendered2 = create_and_process_template_response(
template,
context=Context({"component_name": "test-component"}),
)
assert_dependencies(rendered2)
assert rendered2.count('Variable: value ') == 1
rendered3 = create_and_process_template_response(
template,
context=Context({"component_name": "test_component"}),
)
assert_dependencies(rendered3)
assert rendered3.count('Variable: value ') == 1