"""Djlint linter rule tests. run:: pytest tests/test_linter.py --cov=src/djlint --cov-branch \ --cov-report xml:coverage.xml --cov-report term-missing # for a single test pytest tests/test_linter/test_linter.py::test_ignoring_rules """ # pylint: disable=C0116,C0103 from typing import TextIO from click.testing import CliRunner from src.djlint import main as djlint from tests.conftest import write_to_file def test_T001(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"{{test }}\n{% test%}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 1 assert "T001 1:" in result.output assert "T001 2:" in result.output write_to_file(tmp_file.name, b"{%- test-%}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "nunjucks"]) assert result.exit_code == 1 assert "T001 1:" in result.output write_to_file(tmp_file.name, b"{%-test -%}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "nunjucks"]) assert result.exit_code == 1 assert "T001 1:" in result.output write_to_file(tmp_file.name, b"{%- test -%}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "nunjucks"]) assert result.exit_code == 0 # this test will pass, because the jinja comment is an ignored block write_to_file(tmp_file.name, b"{#-test -#}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert result.exit_code == 0 write_to_file(tmp_file.name, b"{#- test -#}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert result.exit_code == 0 # test line break around tag write_to_file( tmp_file.name, b"""
{% ("something", "1"), %}
""", ) result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert "T001" not in result.output # allow jinja spaceless tags write_to_file(tmp_file.name, b"{{- foo }}{{+ bar }}{{ biz -}}{{ baz +}}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert "T001" not in result.output def test_T002(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"{% extends 'this' %}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 1 assert "T002 1:" in result.output # allow variable names (unquoted) write_to_file(tmp_file.name, b"{% extends this %}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert "T002" not in result.output def test_T003(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"{% endblock %}") result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 1 assert "T003 1:" in result.output def test_DJ004(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 1 assert "D004 1:" in result.output write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert result.exit_code == 1 assert "J004 1:" in result.output def test_H005(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"\n") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H005 2:" in result.output def test_H006(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'test') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H006 1:" in result.output assert "found 1 error" in result.output # check that we don't partial match in an ignored block write_to_file( tmp_file.name, b"""{# [INFO][JINJA] I use syntax "{% if \""", """, ) result = runner.invoke(djlint, [tmp_file.name]) assert "H006" not in result.output def test_H007(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H007 1:" in result.output def test_H008(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"
") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H008 1:" in result.output write_to_file( tmp_file.name, b"""""", ) result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H008 1:" in result.output write_to_file( tmp_file.name, b"""""", ) result = runner.invoke(djlint, [tmp_file.name]) assert "H008 1:" not in result.output def test_H009(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"

") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H009 1:" in result.output def test_H010(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H010 1:" in result.output write_to_file(tmp_file.name, b"
  • ID=username
  • ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 def test_H011(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"
    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H011 1:" in result.output # check for no matches inside template tags write_to_file(tmp_file.name, b" {{ func( id=html_id,) }}") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 assert "H011 1:" not in result.output # check meta tag write_to_file( tmp_file.name, b'', ) result = runner.invoke(djlint, [tmp_file.name]) assert "H011 1:" not in result.output # check keywords inside template syntax write_to_file( tmp_file.name, b"{{ connection }}", ) result = runner.invoke(djlint, [tmp_file.name]) assert "H011 1:" not in result.output def test_H012(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'
    ') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H012 1:" in result.output # test for not matching random "=" in text write_to_file(tmp_file.name, b"

    #= title #

    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 assert "H012 1:" not in result.output # test for not matching "=" in template condition write_to_file( tmp_file.name, b"

    {% if activity.reporting_groups|length <= 0 %}

    {% trans 'General' %}

    {% endif %}

    ", ) result = runner.invoke(djlint, [tmp_file.name]) print(result.output) assert result.exit_code == 0 assert "H012 1:" not in result.output # space allowed inside attributes. write_to_file( tmp_file.name, b"""
    \n\n\n

    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H014 1:" in result.output def test_H015(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"

    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H015 1:" in result.output def test_H016(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"\nstuff\n") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H016 1:" in result.output write_to_file(tmp_file.name, b"\nstuff\n") result = runner.invoke(djlint, [tmp_file.name]) assert "H016" not in result.output def test_H017(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H017 1:" in result.output write_to_file(tmp_file.name, b"
    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H017 1:" in result.output write_to_file(tmp_file.name, b"
    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H017 1:" in result.output # test colgroup tag write_to_file(tmp_file.name, b"") result = runner.invoke(djlint, [tmp_file.name]) print(result.output) assert result.exit_code == 0 assert "H017 1:" not in result.output def test_DJ018(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file( tmp_file.name, b'\n

    ', ) result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 1 assert "D018 1:" in result.output assert "D018 2:" in result.output result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert result.exit_code == 1 assert "J018 1:" in result.output assert "J018 2:" in result.output # test javascript functions write_to_file( tmp_file.name, b'\n
    ', ) result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) # don't check status code. will fail on other rules here. assert "D018 1:" not in result.output assert "D018 2:" not in result.output result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) # don't check status code. will fail on other rules here. assert "J018 1:" not in result.output assert "J018 2:" not in result.output # test on_ events write_to_file( tmp_file.name, b'\n
    ', ) result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 0 assert "D018 1:" not in result.output assert "D018 2:" not in result.output result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert "J018 1:" not in result.output assert "J018 2:" not in result.output # test hash urls write_to_file( tmp_file.name, b'\n
    \n
    ', ) result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 # test data-src write_to_file( tmp_file.name, b'
    ', ) result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 1 assert "D018 1:" in result.output result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert "J018 1:" in result.output # test mailto: write_to_file( tmp_file.name, b'', ) result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 # test attribute names write_to_file( tmp_file.name, b'
    ', ) result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"]) assert result.exit_code == 0 result = runner.invoke(djlint, [tmp_file.name, "--profile", "jinja"]) assert result.exit_code == 0 def test_H019(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"asdf") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H019 1:" in result.output write_to_file(tmp_file.name, b"
    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H019 1:" in result.output def test_H020(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"
    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H020 1:" in result.output write_to_file(tmp_file.name, b"\n ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H020 1:" in result.output write_to_file(tmp_file.name, b"") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 assert "H020" not in result.output def test_H021(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'
    ') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H021 1:" in result.output write_to_file( tmp_file.name, b'', ) result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 assert "H021" not in result.output write_to_file( tmp_file.name, b'CSS', ) result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 assert "H021" not in result.output # allow template syntax inside styles write_to_file(tmp_file.name, b'
    ') result = runner.invoke(djlint, [tmp_file.name]) assert "H021" not in result.output def test_H022(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H022 1:" in result.output def test_H023(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"—") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H023 1:" in result.output write_to_file(tmp_file.name, b"á") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H023 1:" in result.output write_to_file(tmp_file.name, b">") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H023 1:" in result.output write_to_file(tmp_file.name, b"?") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H023 1:" in result.output write_to_file(tmp_file.name, b"?") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H023 1:" in result.output write_to_file(tmp_file.name, b'') result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "H023 1:" in result.output def test_H024(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b'', ) result = runner.invoke(djlint, [tmp_file.name]) assert "H025" not in result.output write_to_file( tmp_file.name, b'', ) result = runner.invoke(djlint, [tmp_file.name]) assert "H025" not in result.output write_to_file( tmp_file.name, b"") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 0 assert "H011 1:" not in result.output def test_output_for_no_linebreaks(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "asdf\n

    asdf

    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert "\n" not in result.output def test_output_order(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file(tmp_file.name, b"

    asdf

    \n

    asdf

    ") result = runner.invoke(djlint, [tmp_file.name]) assert result.exit_code == 1 assert ( """H025 1:0 Tag seems to be an orphan.

    H015 1:8 Follow h tags with a line break.

    H025 2:4 Tag seems to be an orphan.

    H025 2:12 Tag seems to be an orphan.

    """ in result.output ) def test_ignoring_rules(runner: CliRunner, tmp_file: TextIO) -> None: write_to_file( tmp_file.name, b"""{# djlint:off H025,H026 #}

    {# djlint:on #}

    {% comment %} djlint:off H025 {% endcomment %}

    {% comment %} djlint:on {% endcomment %} {{!-- djlint:off H025 --}}

    {{!-- djlint:on --}} {{ /* djlint:off H025 */ }}

    {{ /* djlint:on */ }} """, ) result = runner.invoke(djlint, [tmp_file.name]) assert "H025" not in result.output # using tabs write_to_file( tmp_file.name, b"""

    \t\t{# djlint:off H006 #} \t\tstuff \t\t{# djlint:on #}
    """, ) result = runner.invoke(djlint, [tmp_file.name]) assert "H006" not in result.output