"""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'')
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"""
")
result = runner.invoke(djlint, [tmp_file.name])
assert "H025" not in result.output
write_to_file(tmp_file.name, b"
Foo\n
Foo
")
result = runner.invoke(djlint, [tmp_file.name])
assert "H025 1:" in result.output
assert "H025 2:" not in result.output
# test tags inside attributes
write_to_file(tmp_file.name, b'Foo')
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 "H025" not in result.output
# fix issue #164
write_to_file(
tmp_file.name,
b"""