DEVX-60: feat: add create-task, create-pr, pre-push-check tools and devx.mak fragment
This commit is contained in:
@@ -129,6 +129,18 @@ class TestCheckArchitectureCompliance:
|
||||
assert result.has_issues
|
||||
assert "os.system" in result.issues[0]["body"]
|
||||
|
||||
def test_malformed_hunk_header_no_line_number(self) -> None:
|
||||
"""A @@ header without a +N line number is handled gracefully."""
|
||||
result = ReviewResult()
|
||||
files = [
|
||||
{
|
||||
"filename": "src/devx/cli.py",
|
||||
"patch": "@@ -1,2 @@\n+ subprocess.run(['ls'])\n",
|
||||
}
|
||||
]
|
||||
check_architecture_compliance(files, result)
|
||||
assert result.has_issues
|
||||
|
||||
|
||||
class TestCheckBestPractices:
|
||||
def test_print_triggers_warning(self) -> None:
|
||||
@@ -190,6 +202,19 @@ class TestCheckBestPractices:
|
||||
check_best_practices(files, result)
|
||||
assert not result.has_issues
|
||||
|
||||
def test_malformed_hunk_header_no_line_number(self) -> None:
|
||||
"""A @@ header without a +N line number is handled gracefully."""
|
||||
result = ReviewResult()
|
||||
files = [
|
||||
{
|
||||
"filename": "src/devx/cli.py",
|
||||
"patch": "@@ -1,2 @@\n+ print('hello')\n",
|
||||
}
|
||||
]
|
||||
check_best_practices(files, result)
|
||||
assert result.has_issues
|
||||
assert "print()" in result.issues[0]["body"]
|
||||
|
||||
|
||||
class TestCheckSecurity:
|
||||
def test_hardcoded_secret_triggers_error(self) -> None:
|
||||
@@ -239,6 +264,19 @@ class TestCheckSecurity:
|
||||
check_security(files, result)
|
||||
assert not result.has_issues
|
||||
|
||||
def test_malformed_hunk_header_no_line_number(self) -> None:
|
||||
"""A @@ header without a +N line number is handled gracefully."""
|
||||
result = ReviewResult()
|
||||
files = [
|
||||
{
|
||||
"filename": "src/devx/config.py",
|
||||
"patch": "@@ -1,2 @@\n+ token = 'abc123secrettoken456'\n",
|
||||
}
|
||||
]
|
||||
check_security(files, result)
|
||||
assert result.has_issues
|
||||
assert "secret" in result.issues[0]["body"].lower()
|
||||
|
||||
|
||||
class TestCheckI18n:
|
||||
def test_raw_string_in_echo_triggers_warning(self) -> None:
|
||||
@@ -295,6 +333,14 @@ class TestCheckI18n:
|
||||
check_i18n(files, result)
|
||||
assert any("i18n: OK" in s for s in result.summary)
|
||||
|
||||
def test_malformed_hunk_header_no_line_number(self) -> None:
|
||||
"""A @@ header without a +N line number is handled gracefully."""
|
||||
result = ReviewResult()
|
||||
files = [{"filename": "src/devx/cli.py", "patch": '@@ -1,2 @@\n+click.echo("Hello world")\n'}]
|
||||
check_i18n(files, result)
|
||||
assert result.has_issues
|
||||
assert any("i18n" in i["body"] for i in result.issues)
|
||||
|
||||
|
||||
class TestCheckResourceManagement:
|
||||
def test_open_without_with_triggers_warning(self) -> None:
|
||||
@@ -366,6 +412,14 @@ class TestCheckResourceManagement:
|
||||
check_resource_management(files, result)
|
||||
assert any("Resource management: OK" in s for s in result.summary)
|
||||
|
||||
def test_malformed_hunk_header_no_line_number(self) -> None:
|
||||
"""A @@ header without a +N line number is handled gracefully."""
|
||||
result = ReviewResult()
|
||||
files = [{"filename": "src/devx/cli.py", "patch": '@@ -1,2 @@\n+f = open("file.txt")\n'}]
|
||||
check_resource_management(files, result)
|
||||
assert result.has_issues
|
||||
assert any("resource" in i["body"].lower() for i in result.issues)
|
||||
|
||||
|
||||
class TestCheckFunctionLength:
|
||||
def test_long_function_triggers_warning(self) -> None:
|
||||
@@ -429,6 +483,13 @@ class TestCheckFunctionLength:
|
||||
assert result.has_issues
|
||||
assert "foo" in result.issues[0]["body"]
|
||||
|
||||
def test_malformed_hunk_header_no_line_number(self) -> None:
|
||||
"""A @@ header without a +N line number is handled gracefully."""
|
||||
result = ReviewResult()
|
||||
files = [{"filename": "src/devx/cli.py", "patch": "@@ -1,2 @@\n+def foo():\n+ pass\n"}]
|
||||
check_function_length(files, result)
|
||||
assert not result.has_issues
|
||||
|
||||
|
||||
class TestCheckDocumentation:
|
||||
def test_src_changes_without_docs_warns(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user