"""Djlint tests specific to django.
run::
pytest tests/test_django.py --cov=src/djlint --cov-branch \
--cov-report xml:coverage.xml --cov-report term-missing
for a single test, run::
pytest tests/test_django.py::test_comment --cov=src/djlint \
--cov-branch --cov-report xml:coverage.xml --cov-report term-missing
"""
# pylint: disable=C0116
from typing import TextIO
from click.testing import CliRunner
from .conftest import reformat
def test_empty_tags_on_one_line(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(tmp_file, runner, b"{% if stuff %}\n{% endif %}")
assert output.text == """{% if stuff %}{% endif %}\n"""
assert output.exit_code == 1
def test_dj_comments_tag(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file, runner, b"{# comment #}\n{% if this %}
{% endif %}"
)
assert output.text == """{# comment #}\n{% if this %}
{% endif %}\n"""
# no change was required
assert output.exit_code == 0
def test_reformat_asset_tag(runner: CliRunner, tmp_file: TextIO) -> None:
# pylint: disable=C0301
output = reformat(
tmp_file,
runner,
b"""{% block css %}{% assets "css_error" %} {% endassets %}{% endblock css %}""",
) # noqa: E501
assert (
output.text
== """{% block css %}
{% assets "css_error" %}
{% endassets %}
{% endblock css %}
"""
)
assert output.exit_code == 1
def test_autoescape(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file, runner, b"{% autoescape on %}{{ body }}{% endautoescape %}"
)
assert output.exit_code == 1
assert (
output.text
== r"""{% autoescape on %}
{{ body }}
{% endautoescape %}
"""
)
def test_comment(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file, runner, b"""{% comment "Optional note" %}{{ body }}{% endcomment %}"""
)
assert output.exit_code == 0
# too short to put on multiple lines
assert (
output.text
== r"""{% comment "Optional note" %}{{ body }}{% endcomment %}
"""
)
output = reformat(
tmp_file,
runner,
b"""
Lorem ipsum dolor
sit
amet
{% comment %}
{% endcomment %}
""",
)
assert output.exit_code == 0
output = reformat(
tmp_file,
runner,
b"""
{# djlint:off #}
Lorem ipsum dolor sit amet
{# djlint:on #}
{% for i in items %}
item {{i}}
{% if i > 10 %}{% endif %}
item {{i}}
{% endfor %}
""",
)
assert output.exit_code == 0
output = reformat(
tmp_file,
runner,
b"""
{% comment %}
{% endcomment %}
""",
)
assert output.exit_code == 0
output = reformat(
tmp_file,
runner,
b"""
{# djlint:off #}
{% comment %}
{% endcomment %}
{# djlint:on #}
""",
)
assert output.exit_code == 0
def test_inline_comment(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file, runner, b"{#
#}\n{% if this %}
{% endif %}"
)
assert output.text == """{#
#}\n{% if this %}
{% endif %}\n"""
assert output.exit_code == 0
def test_for_loop(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% for athlete in athlete_list %}{{ athlete.name }} {% empty %}Sorry, no athletes in this list. {% endfor %} """,
)
assert output.exit_code == 1
assert (
output.text
== r"""
{% for athlete in athlete_list %}
{{ athlete.name }}
{% empty %}
Sorry, no athletes in this list.
{% endfor %}
"""
)
def test_filter(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% filter force_escape|lower %}This text will be HTML-escaped, and will appear in all lowercase.{% endfilter %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
"""
)
def test_if(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% if athlete_list %}Number of athletes: {{ athlete_list|length }}{% elif athlete_in_locker_room_list %}Athletes should be out of the locker room soon!{% else %}No athletes.{% endif %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
"""
)
def test_ifchanged(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% for match in matches %}{% ifchanged match.ballot_id %}{% cycle "red" "blue" %}{% else %}gray{% endifchanged %}{{ match }}
{% endfor %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% for match in matches %}
{% ifchanged match.ballot_id %}
{% cycle "red" "blue" %}
{% else %}
gray
{% endifchanged %}
{{ match }}
{% endfor %}
"""
)
def test_include(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(tmp_file, runner, b"""{% include "this" %}{% include "that"%}""")
assert output.exit_code == 1
assert (
output.text
== r"""{% include "this" %}
{% include "that" %}
"""
)
def test_spaceless(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% spaceless %}Foo
{% endspaceless %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% spaceless %}
Foo
{% endspaceless %}
"""
)
def test_templatetag(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}""",
)
assert output.exit_code == 0
assert (
output.text
== r"""{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}
"""
)
def test_verbatim(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file, runner, b"""{% verbatim %}Still alive.{% endverbatim %}"""
)
assert output.exit_code == 1
assert (
output.text
== r"""{% verbatim %}
Still alive.
{% endverbatim %}
"""
)
def test_blocktranslate(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}""",
)
assert output.exit_code == 0
assert (
output.text
== r"""{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}
"""
)
output = reformat(
tmp_file,
runner,
b"""{% blocktranslate trimmed %}The width is: {{ width }}{% endblocktranslate %}""",
)
assert output.exit_code == 0
output = reformat(
tmp_file,
runner,
b"""{% blocktrans %}The width is: {{ width }}{% endblocktrans %}""",
)
assert output.exit_code == 0
assert (
output.text
== r"""{% blocktrans %}The width is: {{ width }}{% endblocktrans %}
"""
)
output = reformat(
tmp_file,
runner,
b"""{% blocktrans trimmed %}The width is: {{ width }}{% endblocktrans %}""",
)
assert output.exit_code == 0
output = reformat(
tmp_file,
runner,
b"""
{% blocktrans %}If you have not created an account yet, then please
sign up first.{% endblocktrans %}
\n""",
)
assert output.exit_code == 0
# def test_trans(runner: CliRunner, tmp_file: TextIO) -> None:
# output = reformat(
# tmp_file, runner, b"""{% trans 'Please do Blah .' %}
"""
# )
# assert output.exit_code == 1
# assert (
# """
# {% trans 'Please do Blah .' %}
#
# """
# in output.text
# )
def test_with(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% with total=business.employees.count %}{{ total }}employee
{{ total|pluralize }}{% endwith %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% with total=business.employees.count %}
{{ total }}
employee
{{ total|pluralize }}
{% endwith %}
"""
)
def test_load_tag(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% block content %}{% load i18n %}{% endblock %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% block content %}
{% load i18n %}
{% endblock %}
"""
)
def test_single_line_tag(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% if messages|length %}{% for message in messages %}{{ message }}{% endfor %}{% endif %}""",
)
assert output.exit_code == 1
assert (
output.text
== r"""{% if messages|length %}
{% for message in messages %}{{ message }}{% endfor %}
{% endif %}
"""
)
def test_multiple_endblocks(runner: CliRunner, tmp_file: TextIO) -> None:
output = reformat(
tmp_file,
runner,
b"""{% block content %}{% block scripts %}{% endblock %}{% endblock %}""",
)
assert output.exit_code == 1
assert (
"""{% block content %}\n {% block scripts %}{% endblock %}\n{% endblock %}
"""
== output.text
)