mirror of
https://github.com/django-components/django-components.git
synced 2025-08-04 14:28:18 +00:00
refactor: remove middleware, add strategy "raw", and call render_deps() from within Template.render() (#1166)
* refactor: remove middleware, add strategy "raw", and call render_deps() from within Template.render() * refactor: fix formatting * refactor: fix benchmark tests * refactor: avoid processing deps if rendered HTML contains no components * refactor: remove comments * refactor: rename "raw" to "ignore"
This commit is contained in:
parent
1049c08324
commit
6253042e9e
37 changed files with 771 additions and 657 deletions
|
@ -2,7 +2,7 @@ from django.http import HttpResponse
|
|||
from django.template import Context, Template
|
||||
from testserver.components import FragComp, FragMedia
|
||||
|
||||
from django_components import render_dependencies, types
|
||||
from django_components import types
|
||||
|
||||
|
||||
def single_component_view(request):
|
||||
|
@ -23,8 +23,7 @@ def single_component_view(request):
|
|||
"""
|
||||
template = Template(template_str)
|
||||
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -47,8 +46,7 @@ def multiple_components_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -72,8 +70,7 @@ def check_js_order_in_js_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -97,8 +94,7 @@ def check_js_order_in_media_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -122,8 +118,7 @@ def check_js_order_vars_not_available_before_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -163,14 +158,13 @@ def fragment_base_js_view(request):
|
|||
template = Template(template_str)
|
||||
|
||||
frag = request.GET["frag"]
|
||||
rendered_raw = template.render(
|
||||
rendered = template.render(
|
||||
Context(
|
||||
{
|
||||
"frag": frag,
|
||||
}
|
||||
)
|
||||
)
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -211,8 +205,7 @@ def fragment_base_alpine_view(request):
|
|||
template = Template(template_str)
|
||||
|
||||
frag = request.GET["frag"]
|
||||
rendered_raw = template.render(Context({"frag": frag}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({"frag": frag}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -242,8 +235,7 @@ def fragment_base_htmx_view(request):
|
|||
template = Template(template_str)
|
||||
|
||||
frag = request.GET["frag"]
|
||||
rendered_raw = template.render(Context({"frag": frag}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({"frag": frag}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -273,8 +265,7 @@ def alpine_in_head_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -294,8 +285,7 @@ def alpine_in_body_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -316,8 +306,7 @@ def alpine_in_body_view_2(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
||||
|
||||
|
@ -338,6 +327,5 @@ def alpine_in_body_vars_not_available_before_view(request):
|
|||
</html>
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw = template.render(Context({}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
rendered = template.render(Context({}))
|
||||
return HttpResponse(rendered)
|
||||
|
|
|
@ -70,7 +70,7 @@ if not settings.configured:
|
|||
"autodiscover": False,
|
||||
"context_behavior": CONTEXT_MODE,
|
||||
},
|
||||
MIDDLEWARE=["django_components.middleware.ComponentDependencyMiddleware"],
|
||||
MIDDLEWARE=[],
|
||||
DATABASES={
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
|
|
|
@ -41,7 +41,7 @@ if not settings.configured:
|
|||
"autodiscover": False,
|
||||
"context_behavior": CONTEXT_MODE,
|
||||
},
|
||||
MIDDLEWARE=["django_components.middleware.ComponentDependencyMiddleware"],
|
||||
MIDDLEWARE=[],
|
||||
DATABASES={
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
|
|
|
@ -70,7 +70,7 @@ if not settings.configured:
|
|||
"autodiscover": False,
|
||||
"context_behavior": CONTEXT_MODE,
|
||||
},
|
||||
MIDDLEWARE=["django_components.middleware.ComponentDependencyMiddleware"],
|
||||
MIDDLEWARE=[],
|
||||
DATABASES={
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
|
@ -2455,6 +2455,7 @@ class ProjectLayoutTabbed(Component):
|
|||
"stroke_width": 2,
|
||||
"color": "text-gray-400 hover:text-gray-500",
|
||||
},
|
||||
# deps_strategy="ignore",
|
||||
render_dependencies=False,
|
||||
),
|
||||
),
|
||||
|
@ -4490,6 +4491,7 @@ class Tabs(Component):
|
|||
"header_attrs": context["header_attrs"],
|
||||
"content_attrs": context["content_attrs"],
|
||||
},
|
||||
# deps_strategy="ignore",
|
||||
render_dependencies=False,
|
||||
)
|
||||
|
||||
|
@ -5135,6 +5137,7 @@ class ProjectUsers(Component):
|
|||
"project_id": project_id,
|
||||
"role_id": role['id'],
|
||||
},
|
||||
# deps_strategy="ignore",
|
||||
render_dependencies=False,
|
||||
)
|
||||
else:
|
||||
|
|
|
@ -41,7 +41,7 @@ if not settings.configured:
|
|||
"autodiscover": False,
|
||||
"context_behavior": CONTEXT_MODE,
|
||||
},
|
||||
MIDDLEWARE=["django_components.middleware.ComponentDependencyMiddleware"],
|
||||
MIDDLEWARE=[],
|
||||
DATABASES={
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
|
|
|
@ -872,7 +872,7 @@ class TestComponentRender:
|
|||
{% endblock %}
|
||||
"""
|
||||
|
||||
rendered = SimpleComponent.render(render_dependencies=False)
|
||||
rendered = SimpleComponent.render(deps_strategy="ignore")
|
||||
assertHTMLEqual(
|
||||
rendered,
|
||||
"""
|
||||
|
|
|
@ -79,7 +79,7 @@ class TestMainMedia:
|
|||
assert ".html-css-only {\n color: blue;\n}" in TestComponent.css # type: ignore[operator]
|
||||
assert 'console.log("JS file");' in TestComponent.js # type: ignore[operator]
|
||||
|
||||
rendered_raw = Template(
|
||||
rendered = Template(
|
||||
"""
|
||||
{% load component_tags %}
|
||||
{% component_js_dependencies %}
|
||||
|
@ -87,7 +87,6 @@ class TestMainMedia:
|
|||
{% component "test" variable="test" / %}
|
||||
"""
|
||||
).render(Context())
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
|
||||
assertInHTML(
|
||||
"""
|
||||
|
@ -143,7 +142,7 @@ class TestMainMedia:
|
|||
assert ".html-css-only {\n color: blue;\n}" in TestComponent.css # type: ignore[operator]
|
||||
assert 'console.log("HTML and JS only");' in TestComponent.js # type: ignore[operator]
|
||||
|
||||
rendered_raw = Template(
|
||||
rendered = Template(
|
||||
"""
|
||||
{% load component_tags %}
|
||||
{% component_js_dependencies %}
|
||||
|
@ -151,7 +150,6 @@ class TestMainMedia:
|
|||
{% component "test" variable="test" / %}
|
||||
"""
|
||||
).render(Context())
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
|
||||
assert 'Variable: <strong data-djc-id-ca1bc41="">test</strong>' in rendered
|
||||
assertInHTML(
|
||||
|
|
|
@ -6,19 +6,15 @@ For checking the OUTPUT of the dependencies, see `test_dependency_rendering.py`.
|
|||
"""
|
||||
|
||||
import re
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
from django.http import HttpResponseNotModified
|
||||
from django.template import Context, Template
|
||||
from pytest_django.asserts import assertHTMLEqual, assertInHTML
|
||||
|
||||
from django_components import Component, registry, render_dependencies, types
|
||||
from django_components.components.dynamic import DynamicComponent
|
||||
from django_components.middleware import ComponentDependencyMiddleware
|
||||
|
||||
from django_components.testing import djc_test
|
||||
from .testutils import create_and_process_template_response, setup_test_config
|
||||
from .testutils import setup_test_config
|
||||
|
||||
setup_test_config({"autodiscover": False})
|
||||
|
||||
|
@ -69,7 +65,8 @@ class TestDependenciesLegacy:
|
|||
|
||||
@djc_test
|
||||
class TestRenderDependencies:
|
||||
def test_standalone_render_dependencies(self):
|
||||
# Check that `render_dependencies()` works when called directly
|
||||
def test_render_dependencies(self):
|
||||
registry.register(name="test", component=SimpleComponent)
|
||||
|
||||
template_str: types.django_html = """
|
||||
|
@ -79,7 +76,8 @@ class TestRenderDependencies:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
# NOTE: `"ignore"` is a special value that means "do not render dependencies"
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
# Placeholders
|
||||
assert rendered_raw.count('<link name="CSS_PLACEHOLDER">') == 1
|
||||
|
@ -100,7 +98,8 @@ class TestRenderDependencies:
|
|||
|
||||
assertInHTML('<link href="style.css" media="all" rel="stylesheet">', rendered, count=1) # Media.css
|
||||
|
||||
def test_middleware_renders_dependencies(self):
|
||||
# Check that instead of `render_dependencies()`, we can simply call `Template.render()`
|
||||
def test_template_render(self):
|
||||
registry.register(name="test", component=SimpleComponent)
|
||||
|
||||
template_str: types.django_html = """
|
||||
|
@ -110,19 +109,64 @@ class TestRenderDependencies:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template, use_middleware=True)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
|
||||
assertInHTML("<style>.xyz { color: red; }</style>", rendered, count=1) # Inlined CSS
|
||||
assertInHTML('<script>console.log("xyz");</script>', rendered, count=1) # Inlined JS
|
||||
assertInHTML(
|
||||
"<style>.xyz { color: red; }</style>",
|
||||
rendered,
|
||||
count=1,
|
||||
) # Inlined CSS
|
||||
assertInHTML(
|
||||
'<script>console.log("xyz");</script>', rendered, count=1
|
||||
) # Inlined JS
|
||||
|
||||
assertInHTML('<link href="style.css" media="all" rel="stylesheet">', rendered, count=1) # Media.css
|
||||
assert rendered.count("<link") == 1
|
||||
assert rendered.count("<style") == 1
|
||||
|
||||
def test_component_render_renders_dependencies(self):
|
||||
# Check that we can change the dependencies strategy via `DJC_DEPS_STRATEGY` context key
|
||||
def test_template_render_deps_strategy(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: str = template.render(Context({"DJC_DEPS_STRATEGY": "append"}))
|
||||
|
||||
# Dependency manager script NOT included
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=0)
|
||||
|
||||
assertInHTML(
|
||||
"<style>.xyz { color: red; }</style>",
|
||||
rendered,
|
||||
count=1,
|
||||
) # Inlined CSS
|
||||
assertInHTML(
|
||||
'<script>console.log("xyz");</script>', rendered, count=1
|
||||
) # Inlined JS
|
||||
|
||||
assertInHTML('<link href="style.css" media="all" rel="stylesheet">', rendered, count=1) # Media.css
|
||||
assert rendered.count("<link") == 1
|
||||
assert rendered.count("<style") == 1
|
||||
|
||||
# Check that the order is correct (dependencies are appended)
|
||||
assert rendered.strip() == (
|
||||
'Variable: <strong data-djc-id-ca1bc41="">foo</strong>\n'
|
||||
' \n'
|
||||
' <script src="script.js"></script><script>console.log("xyz");</script><style>.xyz {\n'
|
||||
' color: red;\n'
|
||||
' }</style><link href="style.css" media="all" rel="stylesheet">'
|
||||
)
|
||||
|
||||
# Check that `Component.render()` renders dependencies
|
||||
def test_component_render(self):
|
||||
class SimpleComponentWithDeps(SimpleComponent):
|
||||
template: types.django_html = (
|
||||
"""
|
||||
|
@ -149,7 +193,7 @@ class TestRenderDependencies:
|
|||
assert rendered.count("<link") == 1
|
||||
assert rendered.count("<style") == 1
|
||||
|
||||
def test_component_render_renders_dependencies_opt_out(self):
|
||||
def test_component_render_opt_out(self):
|
||||
class SimpleComponentWithDeps(SimpleComponent):
|
||||
template: types.django_html = (
|
||||
"""
|
||||
|
@ -164,7 +208,7 @@ class TestRenderDependencies:
|
|||
|
||||
rendered_raw = SimpleComponentWithDeps.render(
|
||||
kwargs={"variable": "foo"},
|
||||
render_dependencies=False,
|
||||
deps_strategy="ignore",
|
||||
)
|
||||
|
||||
assert rendered_raw.count("<script") == 1
|
||||
|
@ -184,7 +228,8 @@ class TestRenderDependencies:
|
|||
count=0,
|
||||
) # Inlined JS
|
||||
|
||||
def test_component_render_to_response_renders_dependencies(self):
|
||||
# Check that `Component.render_to_response()` renders dependencies
|
||||
def test_component_render_to_response(self):
|
||||
class SimpleComponentWithDeps(SimpleComponent):
|
||||
template: types.django_html = (
|
||||
"""
|
||||
|
@ -212,6 +257,103 @@ class TestRenderDependencies:
|
|||
assert rendered.count("<link") == 1
|
||||
assert rendered.count("<style") == 1
|
||||
|
||||
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 %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head></head>
|
||||
<body>
|
||||
{% component "test" variable="foo" / %}
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
rendered_raw = Template(template_str).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered = render_dependencies(rendered_raw)
|
||||
|
||||
assert rendered.count("<script") == 4
|
||||
assert rendered.count("<style") == 1
|
||||
assert rendered.count("<link") == 1
|
||||
assert rendered.count("_RENDERED") == 0
|
||||
|
||||
assertInHTML(
|
||||
"""
|
||||
<head>
|
||||
<style>.xyz { color: red; }</style>
|
||||
<link href="style.css" media="all" rel="stylesheet">
|
||||
</head>
|
||||
""",
|
||||
rendered,
|
||||
count=1,
|
||||
)
|
||||
|
||||
body_re = re.compile(r"<body>(.*?)</body>", re.DOTALL)
|
||||
rendered_body = body_re.search(rendered).group(1) # type: ignore[union-attr]
|
||||
|
||||
assertInHTML(
|
||||
"""<script src="django_components/django_components.min.js">""",
|
||||
rendered_body,
|
||||
count=1,
|
||||
)
|
||||
assertInHTML(
|
||||
'<script>console.log("xyz");</script>',
|
||||
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 %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
{% component_js_dependencies %}
|
||||
</head>
|
||||
<body>
|
||||
{% component "test" variable="foo" / %}
|
||||
{% component_css_dependencies %}
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
rendered_raw = Template(template_str).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered: str = render_dependencies(rendered_raw)
|
||||
|
||||
assert rendered.count("<script") == 4
|
||||
assert rendered.count("<style") == 1
|
||||
assert rendered.count("<link") == 1
|
||||
assert rendered.count("_RENDERED") == 0
|
||||
|
||||
assertInHTML(
|
||||
"""
|
||||
<body>
|
||||
Variable: <strong data-djc-id-ca1bc41>foo</strong>
|
||||
|
||||
<style>.xyz { color: red; }</style>
|
||||
<link href="style.css" media="all" rel="stylesheet">
|
||||
</body>
|
||||
""",
|
||||
rendered,
|
||||
count=1,
|
||||
)
|
||||
|
||||
head_re = re.compile(r"<head>(.*?)</head>", re.DOTALL)
|
||||
rendered_head = head_re.search(rendered).group(1) # type: ignore[union-attr]
|
||||
|
||||
assertInHTML(
|
||||
"""<script src="django_components/django_components.min.js">""",
|
||||
rendered_head,
|
||||
count=1,
|
||||
)
|
||||
assertInHTML(
|
||||
'<script>console.log("xyz");</script>',
|
||||
rendered_head,
|
||||
count=1,
|
||||
)
|
||||
|
||||
# NOTE: Some HTML parser libraries like selectolax or lxml try to "correct" the given HTML.
|
||||
# We want to avoid this behavior, so user gets the exact same HTML back.
|
||||
def test_does_not_try_to_add_close_tags(self):
|
||||
|
@ -221,7 +363,7 @@ class TestRenderDependencies:
|
|||
<thead>
|
||||
"""
|
||||
|
||||
rendered_raw = Template(template_str).render(Context({"formset": [1]}))
|
||||
rendered_raw = Template(template_str).render(Context({"formset": [1], "DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered = render_dependencies(rendered_raw, strategy="fragment")
|
||||
|
||||
assertHTMLEqual(rendered, "<thead>")
|
||||
|
@ -256,7 +398,7 @@ class TestRenderDependencies:
|
|||
</table>
|
||||
"""
|
||||
|
||||
rendered_raw = Template(template_str).render(Context({"formset": [1]}))
|
||||
rendered_raw = Template(template_str).render(Context({"formset": [1], "DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered = render_dependencies(rendered_raw, strategy="fragment")
|
||||
|
||||
expected = """
|
||||
|
@ -319,7 +461,7 @@ class TestRenderDependencies:
|
|||
</table>
|
||||
"""
|
||||
|
||||
rendered_raw = Template(template_str).render(Context({"formset": [1]}))
|
||||
rendered_raw = Template(template_str).render(Context({"formset": [1], "DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered = render_dependencies(rendered_raw, strategy="fragment")
|
||||
|
||||
# Base64 encodings:
|
||||
|
@ -408,7 +550,7 @@ class TestDependenciesStrategyDocument:
|
|||
</body>
|
||||
</html>
|
||||
"""
|
||||
rendered_raw = Template(template_str).render(Context({}))
|
||||
rendered_raw = Template(template_str).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered = render_dependencies(rendered_raw, strategy="document")
|
||||
|
||||
assert rendered.count("<script") == 4
|
||||
|
@ -457,7 +599,7 @@ class TestDependenciesStrategyDocument:
|
|||
</body>
|
||||
</html>
|
||||
"""
|
||||
rendered_raw = Template(template_str).render(Context({}))
|
||||
rendered_raw = Template(template_str).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
rendered = render_dependencies(rendered_raw, strategy="document")
|
||||
|
||||
assert rendered.count("<script") == 4
|
||||
|
@ -505,7 +647,7 @@ class TestDependenciesStrategySimple:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
# Placeholders
|
||||
assert rendered_raw.count('<link name="CSS_PLACEHOLDER">') == 1
|
||||
|
@ -593,7 +735,7 @@ class TestDependenciesStrategySimple:
|
|||
{% endcomponent %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
rendered = render_dependencies(rendered_raw, strategy="simple")
|
||||
|
||||
|
@ -663,7 +805,7 @@ class TestDependenciesStrategyPrepend:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
# Placeholders
|
||||
assert rendered_raw.count('<link name="CSS_PLACEHOLDER">') == 1
|
||||
|
@ -753,7 +895,7 @@ class TestDependenciesStrategyPrepend:
|
|||
{% endcomponent %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
rendered = render_dependencies(rendered_raw, strategy="prepend")
|
||||
|
||||
|
@ -823,7 +965,7 @@ class TestDependenciesStrategyAppend:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
# Placeholders
|
||||
assert rendered_raw.count('<link name="CSS_PLACEHOLDER">') == 1
|
||||
|
@ -910,7 +1052,7 @@ class TestDependenciesStrategyAppend:
|
|||
{% endcomponent %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({}))
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
rendered = render_dependencies(rendered_raw, strategy="append")
|
||||
|
||||
|
@ -969,58 +1111,32 @@ class TestDependenciesStrategyAppend:
|
|||
|
||||
|
||||
@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)
|
||||
class TestDependenciesStrategyRaw:
|
||||
def test_single_component(self):
|
||||
registry.register(name="test", component=SimpleComponent)
|
||||
|
||||
template_str: types.django_html = """
|
||||
{% load component_tags %}
|
||||
{% component_css_dependencies %}
|
||||
{% component_js_dependencies %}
|
||||
{% component "dynamic" is=component_name variable='value' / %}
|
||||
{% component_css_dependencies %}
|
||||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered_raw: str = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
def assert_dependencies(content: str):
|
||||
# Dependency manager script (empty)
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', content, count=1)
|
||||
# Placeholders
|
||||
assert rendered_raw.count('<link name="CSS_PLACEHOLDER">') == 1
|
||||
assert rendered_raw.count('<script name="JS_PLACEHOLDER"></script>') == 1
|
||||
|
||||
# Inlined JS
|
||||
assertInHTML('<script>console.log("xyz");</script>', content, count=1)
|
||||
# Inlined CSS
|
||||
assertInHTML("<style>.xyz { color: red; }</style>", content, count=1)
|
||||
# Media.css
|
||||
assertInHTML('<link href="style.css" media="all" rel="stylesheet">', content, count=1)
|
||||
assert rendered_raw.count("<script") == 1
|
||||
assert rendered_raw.count("<style") == 0
|
||||
assert rendered_raw.count("<link") == 1
|
||||
assert rendered_raw.count("_RENDERED") == 1
|
||||
|
||||
rendered1 = create_and_process_template_response(
|
||||
template,
|
||||
context=Context({"component_name": "test-component"}),
|
||||
# Check that it contains inlined JS and CSS, and Media.css
|
||||
assert rendered_raw.strip() == (
|
||||
'<script name="JS_PLACEHOLDER"></script>\n'
|
||||
' <link name="CSS_PLACEHOLDER">\n'
|
||||
' <!-- _RENDERED SimpleComponent_311097,ca1bc41,, -->\n'
|
||||
' Variable: <strong data-djc-id-ca1bc41="">foo</strong>'
|
||||
)
|
||||
|
||||
assert_dependencies(rendered1)
|
||||
assert rendered1.count('Variable: <strong data-djc-id-ca1bc42="" data-djc-id-ca1bc41="">value</strong>') == 1
|
||||
|
||||
rendered2 = create_and_process_template_response(
|
||||
template,
|
||||
context=Context({"component_name": "test-component"}),
|
||||
)
|
||||
|
||||
assert_dependencies(rendered2)
|
||||
assert rendered2.count('Variable: <strong data-djc-id-ca1bc44="" data-djc-id-ca1bc43="">value</strong>') == 1
|
||||
|
||||
rendered3 = create_and_process_template_response(
|
||||
template,
|
||||
context=Context({"component_name": "test_component"}),
|
||||
)
|
||||
|
||||
assert_dependencies(rendered3)
|
||||
assert rendered3.count('Variable: <strong data-djc-id-ca1bc46="" data-djc-id-ca1bc45="">value</strong>') == 1
|
||||
|
|
|
@ -11,7 +11,7 @@ from pytest_django.asserts import assertHTMLEqual, assertInHTML
|
|||
from django_components import Component, registry, types
|
||||
from django_components.testing import djc_test
|
||||
|
||||
from .testutils import create_and_process_template_response, setup_test_config
|
||||
from .testutils import setup_test_config
|
||||
|
||||
setup_test_config({"autodiscover": False})
|
||||
|
||||
|
@ -120,13 +120,13 @@ class TestDependencyRendering:
|
|||
{% component_css_dependencies %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered: str = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=0)
|
||||
|
||||
assert rendered.count("<script") == 1 # 1 boilerplate script
|
||||
assert rendered.count("<link") == 0 # No CSS
|
||||
assert rendered.count("<script") == 1 # 1 placeholder script
|
||||
assert rendered.count("<link") == 1 # 1 placeholder link
|
||||
assert rendered.count("<style") == 0
|
||||
|
||||
assert "loadedJsUrls" not in rendered
|
||||
|
@ -134,6 +134,11 @@ class TestDependencyRendering:
|
|||
assert "toLoadJsTags" not in rendered
|
||||
assert "toLoadCssTags" not in rendered
|
||||
|
||||
assert rendered.strip() == (
|
||||
'<script name="JS_PLACEHOLDER"></script>\n'
|
||||
' <link name="CSS_PLACEHOLDER">'
|
||||
)
|
||||
|
||||
def test_no_js_dependencies_when_no_components_used(self):
|
||||
registry.register(name="test", component=SimpleComponent)
|
||||
|
||||
|
@ -141,12 +146,12 @@ class TestDependencyRendering:
|
|||
{% load component_tags %}{% component_js_dependencies %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=0)
|
||||
|
||||
assert rendered.count("<script") == 1 # 1 boilerplate script
|
||||
assert rendered.count("<script") == 1 # 1 placeholder script
|
||||
assert rendered.count("<link") == 0 # No CSS
|
||||
assert rendered.count("<style") == 0
|
||||
|
||||
|
@ -155,6 +160,8 @@ class TestDependencyRendering:
|
|||
assert "toLoadJsTags" not in rendered
|
||||
assert "toLoadCssTags" not in rendered
|
||||
|
||||
assert rendered.strip() == '<script name="JS_PLACEHOLDER"></script>'
|
||||
|
||||
def test_no_css_dependencies_when_no_components_used(self):
|
||||
registry.register(name="test", component=SimpleComponent)
|
||||
|
||||
|
@ -162,12 +169,14 @@ class TestDependencyRendering:
|
|||
{% load component_tags %}{% component_css_dependencies %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered: str = template.render(Context({}))
|
||||
|
||||
assert rendered.count("<script") == 0 # No JS
|
||||
assert rendered.count("<link") == 0 # No CSS
|
||||
assert rendered.count("<link") == 1 # 1 placeholder link
|
||||
assert rendered.count("<style") == 0
|
||||
|
||||
assert rendered.strip() == '<link name="CSS_PLACEHOLDER">'
|
||||
|
||||
def test_single_component_dependencies(self):
|
||||
registry.register(name="test", component=SimpleComponent)
|
||||
|
||||
|
@ -178,7 +187,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
|
@ -213,7 +222,7 @@ class TestDependencyRendering:
|
|||
{% component 'te-s/t' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
|
@ -248,7 +257,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
assert "_RENDERED" not in rendered
|
||||
|
||||
|
@ -260,7 +269,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script - NOT present
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=0)
|
||||
|
@ -279,7 +288,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='foo' %}{% endcomponent %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
|
@ -315,7 +324,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
|
@ -372,13 +381,13 @@ class TestDependencyRendering:
|
|||
{% component_css_dependencies %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered: str = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=1)
|
||||
assertInHTML('<script src="django_components/django_components.min.js"></script>', rendered, count=0)
|
||||
|
||||
assert rendered.count("<script") == 1 # 1 boilerplate script
|
||||
assert rendered.count("<link") == 0 # No CSS
|
||||
assert rendered.count("<script") == 1 # 1 placeholder script
|
||||
assert rendered.count("<link") == 1 # 1 placeholder link
|
||||
assert rendered.count("<style") == 0
|
||||
|
||||
assert "loadedJsUrls" not in rendered
|
||||
|
@ -386,6 +395,11 @@ class TestDependencyRendering:
|
|||
assert "toLoadJsTags" not in rendered
|
||||
assert "toLoadCssTags" not in rendered
|
||||
|
||||
assert rendered.strip() == (
|
||||
'<script name="JS_PLACEHOLDER"></script>\n'
|
||||
' <link name="CSS_PLACEHOLDER">'
|
||||
)
|
||||
|
||||
def test_multiple_components_dependencies(self):
|
||||
registry.register(name="inner", component=SimpleComponent)
|
||||
registry.register(name="outer", component=SimpleComponentNested)
|
||||
|
@ -400,7 +414,7 @@ class TestDependencyRendering:
|
|||
{% endcomponent %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered: str = template.render(Context({}))
|
||||
|
||||
# Dependency manager script
|
||||
# NOTE: Should be present only ONCE!
|
||||
|
@ -499,7 +513,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='variable' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
assert "_RENDERED" not in rendered
|
||||
|
||||
def test_adds_component_id_html_attr_single(self):
|
||||
|
@ -510,7 +524,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
assertHTMLEqual(rendered, "Variable: <strong data-djc-id-ca1bc3f>foo</strong>")
|
||||
|
||||
|
@ -529,7 +543,7 @@ class TestDependencyRendering:
|
|||
{% component 'test' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
assertHTMLEqual(
|
||||
rendered,
|
||||
|
@ -565,7 +579,7 @@ class TestDependencyRendering:
|
|||
{% component 'outer' variable='foo' / %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(template)
|
||||
rendered = template.render(Context({}))
|
||||
|
||||
assertHTMLEqual(
|
||||
rendered,
|
||||
|
@ -605,10 +619,7 @@ class TestDependencyRendering:
|
|||
{% endfor %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = create_and_process_template_response(
|
||||
template,
|
||||
context=Context({"lst": range(3)}),
|
||||
)
|
||||
rendered = template.render(Context({"lst": range(3)}))
|
||||
|
||||
assertHTMLEqual(
|
||||
rendered,
|
||||
|
|
|
@ -229,9 +229,10 @@ class TestDynamicExpr:
|
|||
)
|
||||
|
||||
template = Template(template_str)
|
||||
rendered = template.render(
|
||||
rendered: str = template.render(
|
||||
Context(
|
||||
{
|
||||
"DJC_DEPS_STRATEGY": "ignore",
|
||||
"var_a": 3,
|
||||
"is_active": True,
|
||||
"list": [{"a": 1}, {"a": 2}],
|
||||
|
@ -297,9 +298,10 @@ class TestDynamicExpr:
|
|||
)
|
||||
|
||||
template = Template(template_str)
|
||||
rendered = template.render(
|
||||
rendered: str = template.render(
|
||||
Context(
|
||||
{
|
||||
"DJC_DEPS_STRATEGY": "ignore",
|
||||
"var_a": 3,
|
||||
"is_active": True,
|
||||
"list": [{"a": 1}, {"a": 2}],
|
||||
|
|
|
@ -59,7 +59,7 @@ class TestExtendsCompat:
|
|||
{% endcomponent %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -109,7 +109,7 @@ class TestExtendsCompat:
|
|||
{% endcomponent %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -176,7 +176,7 @@ class TestExtendsCompat:
|
|||
{% endblock %}
|
||||
"""
|
||||
template = Template(template_str)
|
||||
rendered = template.render(Context())
|
||||
rendered = template.render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -242,7 +242,7 @@ class TestExtendsCompat:
|
|||
{% endcomponent %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -295,7 +295,7 @@ class TestExtendsCompat:
|
|||
</body>
|
||||
</html>
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -343,7 +343,7 @@ class TestExtendsCompat:
|
|||
</body>
|
||||
</html>
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -395,7 +395,7 @@ class TestExtendsCompat:
|
|||
{% endcomponent %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -440,7 +440,7 @@ class TestExtendsCompat:
|
|||
{% component "extended_component" / %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
|
@ -458,7 +458,7 @@ class TestExtendsCompat:
|
|||
assertHTMLEqual(rendered, expected)
|
||||
|
||||
# second rendering after cache built
|
||||
rendered_2 = Template(template).render(Context())
|
||||
rendered_2 = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected_2 = expected.replace("data-djc-id-ca1bc3f", "data-djc-id-ca1bc41")
|
||||
assertHTMLEqual(rendered_2, expected_2)
|
||||
|
||||
|
@ -480,7 +480,7 @@ class TestExtendsCompat:
|
|||
{% endfill %}
|
||||
{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc40 lang="en">
|
||||
|
@ -513,7 +513,7 @@ class TestExtendsCompat:
|
|||
{% endfill %}
|
||||
{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc40 lang="en">
|
||||
|
@ -544,7 +544,7 @@ class TestExtendsCompat:
|
|||
{% endcomponent %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
@ -575,7 +575,7 @@ class TestExtendsCompat:
|
|||
</div>
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
@ -604,7 +604,7 @@ class TestExtendsCompat:
|
|||
{% load component_tags %}
|
||||
{% component "block_in_component_parent" %}{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc3f lang="en">
|
||||
|
@ -644,7 +644,7 @@ class TestExtendsCompat:
|
|||
wow
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc40 lang="en">
|
||||
|
@ -674,7 +674,7 @@ class TestExtendsCompat:
|
|||
{% load component_tags %}
|
||||
{% component "slot_inside_block" %}{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc3f lang="en">
|
||||
|
@ -710,7 +710,7 @@ class TestExtendsCompat:
|
|||
{% load component_tags %}
|
||||
{% component "slot_inside_block" %}{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc3f lang="en">
|
||||
|
@ -746,7 +746,7 @@ class TestExtendsCompat:
|
|||
{% endfill %}
|
||||
{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc40 lang="en">
|
||||
|
@ -792,7 +792,7 @@ class TestExtendsCompat:
|
|||
{% endfill %}
|
||||
{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc41 lang="en">
|
||||
|
@ -832,7 +832,7 @@ class TestExtendsCompat:
|
|||
{% endcomponent %}
|
||||
{% endblock %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
@ -857,7 +857,7 @@ class TestExtendsCompat:
|
|||
{% load component_tags %}
|
||||
{% component "relative_file_component_using_template_file" %}{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc3f="" lang="en">
|
||||
|
@ -880,7 +880,7 @@ class TestExtendsCompat:
|
|||
{% load component_tags %}
|
||||
{% component "relative_file_component_using_get_template_name" %}{% endcomponent %}
|
||||
"""
|
||||
rendered = Template(template).render(Context())
|
||||
rendered = Template(template).render(Context({"DJC_DEPS_STRATEGY": "ignore"}))
|
||||
expected = """
|
||||
<!DOCTYPE html>
|
||||
<html data-djc-id-ca1bc3f="" lang="en">
|
||||
|
|
|
@ -311,7 +311,7 @@ class TestComponentSlot:
|
|||
"""
|
||||
self.template = Template(template_str)
|
||||
|
||||
nested_ctx = Context()
|
||||
nested_ctx = Context({"DJC_DEPS_STRATEGY": "ignore"})
|
||||
# Check that the component can access vars across different context layers
|
||||
nested_ctx.push({"some": "var"})
|
||||
nested_ctx.push({"name": "carl"})
|
||||
|
@ -470,7 +470,7 @@ class TestComponentSlot:
|
|||
slots={
|
||||
"main": "MAIN",
|
||||
},
|
||||
render_dependencies=False,
|
||||
deps_strategy="ignore",
|
||||
)
|
||||
|
||||
# 2. Specify the non-required slot by the "default" name
|
||||
|
@ -479,7 +479,7 @@ class TestComponentSlot:
|
|||
slots={
|
||||
"default": "MAIN",
|
||||
},
|
||||
render_dependencies=False,
|
||||
deps_strategy="ignore",
|
||||
)
|
||||
|
||||
assertHTMLEqual(rendered1, "<div data-djc-id-ca1bc3e><div>MAIN</div></div>")
|
||||
|
@ -491,7 +491,7 @@ class TestComponentSlot:
|
|||
slots={
|
||||
"main": "MAIN",
|
||||
},
|
||||
render_dependencies=False,
|
||||
deps_strategy="ignore",
|
||||
)
|
||||
assertHTMLEqual(rendered3, "<div data-djc-id-ca1bc42><main>MAIN</main><div>MAIN</div></div>")
|
||||
|
||||
|
@ -506,7 +506,7 @@ class TestComponentSlot:
|
|||
slots={
|
||||
"default": "MAIN",
|
||||
},
|
||||
render_dependencies=False,
|
||||
deps_strategy="ignore",
|
||||
)
|
||||
|
||||
@djc_test(parametrize=PARAMETRIZE_CONTEXT_BEHAVIOR)
|
||||
|
|
|
@ -1,13 +1,8 @@
|
|||
from pathlib import Path
|
||||
from typing import Dict, Optional
|
||||
from unittest.mock import Mock
|
||||
|
||||
import django
|
||||
from django.conf import settings
|
||||
from django.template import Context
|
||||
from django.template.response import TemplateResponse
|
||||
|
||||
from django_components.middleware import ComponentDependencyMiddleware
|
||||
|
||||
# Common use case in our tests is to check that the component works in both
|
||||
# "django" and "isolated" context behaviors. If you need only that, pass this
|
||||
|
@ -22,28 +17,6 @@ PARAMETRIZE_CONTEXT_BEHAVIOR = (
|
|||
)
|
||||
|
||||
|
||||
# Create middleware instance
|
||||
response_stash = None
|
||||
middleware = ComponentDependencyMiddleware(get_response=lambda _: response_stash)
|
||||
|
||||
request = Mock()
|
||||
mock_template = Mock()
|
||||
|
||||
|
||||
def create_and_process_template_response(template, context=None, use_middleware=True):
|
||||
context = context if context is not None else Context({})
|
||||
mock_template.render = lambda context, _: template.render(context)
|
||||
response = TemplateResponse(request, mock_template, context)
|
||||
if use_middleware:
|
||||
response.render()
|
||||
global response_stash
|
||||
response_stash = response
|
||||
response = middleware(request)
|
||||
else:
|
||||
response.render()
|
||||
return response.content.decode("utf-8")
|
||||
|
||||
|
||||
def setup_test_config(
|
||||
components: Optional[Dict] = None,
|
||||
extra_settings: Optional[Dict] = None,
|
||||
|
@ -72,7 +45,7 @@ def setup_test_config(
|
|||
"template_cache_size": 128,
|
||||
**(components or {}),
|
||||
},
|
||||
"MIDDLEWARE": ["django_components.middleware.ComponentDependencyMiddleware"],
|
||||
"MIDDLEWARE": [],
|
||||
"DATABASES": {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue