summaryrefslogtreecommitdiffstats
path: root/tests/lint_tests/test_lint_dctrl.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lint_tests/test_lint_dctrl.py')
-rw-r--r--tests/lint_tests/test_lint_dctrl.py117
1 files changed, 117 insertions, 0 deletions
diff --git a/tests/lint_tests/test_lint_dctrl.py b/tests/lint_tests/test_lint_dctrl.py
new file mode 100644
index 0000000..cc2758e
--- /dev/null
+++ b/tests/lint_tests/test_lint_dctrl.py
@@ -0,0 +1,117 @@
+import textwrap
+from typing import List, Optional, Callable
+
+import pytest
+
+from debputy.lsp.lsp_debian_control import _lint_debian_control
+from lint_tests.lint_tutil import (
+ run_linter,
+ group_diagnostics_by_severity,
+ requires_levenshtein,
+ exactly_one_diagnostic,
+)
+
+try:
+ from lsprotocol.types import Diagnostic, DiagnosticSeverity
+except ImportError:
+ pass
+
+
+TestLinter = Callable[[List[str]], Optional[List["Diagnostic"]]]
+
+
+@pytest.fixture
+def line_linter() -> TestLinter:
+ path = "/nowhere/debian/control"
+
+ def _linter(lines: List[str]) -> Optional[List["Diagnostic"]]:
+ return run_linter(path, lines, _lint_debian_control)
+
+ return _linter
+
+
+def test_dctrl_lint(line_linter: TestLinter) -> None:
+ lines = textwrap.dedent(
+ """\
+ Source: foo
+ Some-Other-Field: bar
+ Build-Depends: debhelper-compat (= 13)
+
+ Package: foo
+ Architecture: all
+ # Unknown section
+ Section: base
+ """
+ ).splitlines(keepends=True)
+
+ diagnostics = line_linter(lines)
+ by_severity = group_diagnostics_by_severity(diagnostics)
+ # This example triggers errors and warnings, but no hint of info
+ assert DiagnosticSeverity.Error in by_severity
+ assert DiagnosticSeverity.Warning in by_severity
+
+ assert DiagnosticSeverity.Hint not in by_severity
+ assert DiagnosticSeverity.Information not in by_severity
+
+ errors = by_severity[DiagnosticSeverity.Error]
+ print(errors)
+ assert len(errors) == 3
+
+ first_error, second_error, third_error = errors
+
+ msg = "Stanza is missing field Standards-Version"
+ assert first_error.message == msg
+ assert f"{first_error.range}" == "0:0-1:0"
+
+ msg = "Stanza is missing field Maintainer"
+ assert second_error.message == msg
+ assert f"{second_error.range}" == "0:0-1:0"
+
+ msg = "Stanza is missing field Priority"
+ assert third_error.message == msg
+ assert f"{third_error.range}" == "4:0-5:0"
+
+ warnings = by_severity[DiagnosticSeverity.Warning]
+ assert len(warnings) == 2
+
+ first_warn, second_warn = warnings
+
+ msg = "Stanza is missing field Description"
+ assert first_warn.message == msg
+ assert f"{first_warn.range}" == "4:0-5:0"
+
+ msg = 'The value "base" is not supported in Section.'
+ assert second_warn.message == msg
+ assert f"{second_warn.range}" == "8:9-8:13"
+
+
+@requires_levenshtein
+def test_dctrl_lint_typos(line_linter: TestLinter) -> None:
+ lines = textwrap.dedent(
+ """\
+ Source: foo
+ Standards-Version: 4.5.2
+ Priority: optional
+ Section: devel
+ Maintainer: Jane Developer <jane@example.com>
+ # Typo
+ Build-Dpends: debhelper-compat (= 13)
+
+ Package: foo
+ Architecture: all
+ Description: Some very interesting synopsis
+ A very interesting description
+ that spans multiple lines
+ .
+ Just so be clear, this is for a test.
+ """
+ ).splitlines(keepends=True)
+
+ diagnostics = line_linter(lines)
+ print(diagnostics)
+ diag = exactly_one_diagnostic(diagnostics)
+
+ msg = 'The "Build-Dpends" looks like a typo of "Build-Depends".'
+ assert diag.message == msg
+ assert diag.severity == DiagnosticSeverity.Warning
+ assert f"{diag.range}" == "6:0-6:12"