"""Catch-all for tests that use template tags and don't fit other files""" import re from typing import Dict import pytest from django.template import Context, Template, TemplateSyntaxError from django.template.base import FilterExpression, Node, Parser, Token from pytest_django.asserts import assertHTMLEqual from django_components import Component, register, registry, types from django_components.expression import DynamicFilterExpression, is_aggregate_key from django_components.testing import djc_test from .testutils import PARAMETRIZE_CONTEXT_BEHAVIOR, setup_test_config setup_test_config({"autodiscover": False}) engine = Template("").engine default_parser = Parser("", engine.template_libraries, engine.template_builtins) # A tag that just returns the value, so we can # check if the value is stringified class NoopNode(Node): def __init__(self, expr: FilterExpression): self.expr = expr def render(self, context: Context): return self.expr.resolve(context) def noop(parser: Parser, token: Token): tag, raw_expr = token.split_contents() expr = parser.compile_filter(raw_expr) return NoopNode(expr) def make_context(d: Dict): ctx = Context(d) ctx.template = Template("") return ctx ####################### # TESTS ####################### # NOTE: Django calls the `{{ }}` syntax "variables" and `{% %}` "blocks" @djc_test class TestDynamicExpr: def test_variable_resolve_dynamic_expr(self): expr = DynamicFilterExpression(default_parser, '"{{ var_a|lower }}"') ctx = make_context({"var_a": "LoREM"}) assert expr.resolve(ctx) == "lorem" def test_variable_raises_on_dynamic_expr_with_quotes_mismatch(self): with pytest.raises(TemplateSyntaxError): DynamicFilterExpression(default_parser, "'{{ var_a|lower }}\"") @djc_test(parametrize=PARAMETRIZE_CONTEXT_BEHAVIOR) def test_variable_in_template(self, components_settings): captured = {} @register("test") class SimpleComponent(Component): def get_template_data(self, args, kwargs, slots, context): captured["pos_var1"] = args[0] captured["bool_var"] = kwargs["bool_var"] captured["list_var"] = kwargs["list_var"] return { "pos_var1": args[0], "bool_var": kwargs["bool_var"], "list_var": kwargs["list_var"], } template: types.django_html = """