"""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.py::test_output_for_no_linebreaks --cov=src/djlint --cov-branch \
--cov-report xml:coverage.xml --cov-report term-missing
"""
# pylint: disable=C0116,C0103
from typing import TextIO
from click.testing import CliRunner
from src.djlint import main as djlint
from .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])
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])
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])
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])
assert result.exit_code == 0
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])
assert result.exit_code == 1
assert "T002 1:" 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])
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])
assert result.exit_code == 1
assert "D004 1:" in result.output
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
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
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
def test_H013(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 "H013 1:" in result.output
print(result.output)
assert "found 1 error" in result.output
def test_H014(runner: CliRunner, tmp_file: TextIO) -> None:
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"\n
stuff \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])
assert result.exit_code == 1
assert "D018 1:" in result.output
assert "J018 1:" in result.output
assert "D018 2:" 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])
# don't check status code. will fail on other rules here.
assert "D018 1:" not in result.output
assert "J018 1:" not in result.output
assert "D018 2:" 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])
assert result.exit_code == 0
assert "D018 1:" not in result.output
assert "J018 1:" not in result.output
assert "D018 2:" not in result.output
assert "J018 2:" not in result.output
# test hash urls
write_to_file(
tmp_file.name,
b'
\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])
assert result.exit_code == 1
assert "D018 1:" in result.output
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
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
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 "H025" not in result.output
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"
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 attibutes
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"""
{{ content }}
""",
)
result = runner.invoke(djlint, [tmp_file.name])
assert "H025" not in result.output
def test_H026(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 "H026" in result.output
write_to_file(tmp_file.name, b"")
result = runner.invoke(djlint, [tmp_file.name])
assert result.exit_code == 1
assert "H026" in result.output
write_to_file(tmp_file.name, b'')
result = runner.invoke(djlint, [tmp_file.name])
assert result.exit_code == 1
assert "H026" in result.output
write_to_file(tmp_file.name, b' ')
result = runner.invoke(djlint, [tmp_file.name])
assert result.exit_code == 0
assert "H026" not in result.output
def test_T027(runner: CliRunner, tmp_file: TextIO) -> None:
write_to_file(tmp_file.name, b"{% blah 'asdf %}")
result = runner.invoke(djlint, [tmp_file.name])
assert result.exit_code == 1
assert "T027" in result.output
write_to_file(tmp_file.name, b"{% blah 'asdf' %}{{ blah \"asdf\" }}")
result = runner.invoke(djlint, [tmp_file.name])
assert "T027" not in result.output
write_to_file(tmp_file.name, b"{% blah 'asdf' 'blah %}")
result = runner.invoke(djlint, [tmp_file.name])
assert result.exit_code == 1
assert "T027" in result.output
write_to_file(
tmp_file.name,
b'{% trans "Check box if you\'re interested in this location." %}',
)
result = runner.invoke(djlint, [tmp_file.name])
assert "T027" not in result.output
def test_T028(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 "T028" not in result.output
write_to_file(tmp_file.name, b" ")
result = runner.invoke(djlint, [tmp_file.name])
assert result.exit_code == 1
assert "T028" in result.output
# django should not trigger
write_to_file(tmp_file.name, b" ")
result = runner.invoke(djlint, [tmp_file.name, "--profile", "django"])
assert result.exit_code == 1
assert "T028" not in result.output
write_to_file(tmp_file.name, b" ")
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
write_to_file(tmp_file.name, b" ")
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
write_to_file(tmp_file.name, b" ")
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
write_to_file(tmp_file.name, b" ")
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
write_to_file(tmp_file.name, b"{% blah 'asdf' %}")
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
write_to_file(tmp_file.name, b"{% for 'asdf' %}")
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
# class should not trigger
write_to_file(tmp_file.name, b' ')
result = runner.invoke(djlint, [tmp_file.name])
assert "T028" not in result.output
def test_H029(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 "H029" in result.output
write_to_file(tmp_file.name, b' ')
result = runner.invoke(djlint, [tmp_file.name])
assert "H029" not in result.output
write_to_file(tmp_file.name, b'')
result = runner.invoke(djlint, [tmp_file.name])
assert "H029" not in result.output
def test_H030(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 "H030 1:" in result.output
write_to_file(
tmp_file.name, b'\n \n'
)
result = runner.invoke(djlint, [tmp_file.name])
assert "H030" not in result.output
def test_H031(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 "H031 1:" in result.output
write_to_file(
tmp_file.name, b'\n \n'
)
result = runner.invoke(djlint, [tmp_file.name])
assert "H031" not in result.output
def test_rules_not_matched_in_ignored_block(
runner: CliRunner, tmp_file: TextIO
) -> None:
write_to_file(tmp_file.name, b"")
result = runner.invoke(djlint, [tmp_file.name])
print(result.output)
assert result.exit_code == 0
assert "H011 1:" not in result.output
def test_custom_rules(runner: CliRunner, tmp_file: TextIO) -> None:
result = runner.invoke(djlint, ["tests/custom_rules"])
assert """Linting""" in result.output
assert """1/1""" in result.output
assert """T001 1:""" in result.output
assert result.exit_code == 1
def test_custom_rules_bad_config(runner: CliRunner, tmp_file: TextIO) -> None:
result = runner.invoke(djlint, ["tests/custom_rules_bad"])
assert """Linting""" in result.output
assert """1/1""" in result.output
assert """T001 1:""" in result.output
assert result.exit_code == 1
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
)