"""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_H021 --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, "--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 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 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 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"\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 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 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_custom_rules(runner: CliRunner, tmp_file: TextIO) -> None: result = runner.invoke(djlint, ["tests/custom_rules", "--profile", "django"]) 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", "--profile", "django"]) 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 )