Files
timmy-config/tests/test_pr_backlog_triage.py
Alexander Whitestone f05c014143
Some checks failed
Architecture Lint / Linter Tests (pull_request) Successful in 24s
Smoke Test / smoke (pull_request) Failing after 19s
Validate Config / YAML Lint (pull_request) Failing after 15s
Validate Config / JSON Validate (pull_request) Successful in 15s
Validate Config / Python Syntax & Import Check (pull_request) Failing after 42s
Validate Config / Shell Script Lint (pull_request) Failing after 37s
Validate Config / Cron Syntax Check (pull_request) Successful in 8s
Validate Config / Deploy Script Dry Run (pull_request) Successful in 6s
Validate Config / Playbook Schema Validation (pull_request) Successful in 13s
PR Checklist / pr-checklist (pull_request) Failing after 3m19s
Architecture Lint / Lint Repository (pull_request) Has been cancelled
Validate Config / Python Test Suite (pull_request) Has been cancelled
test: Add PR backlog triage tests (#658)
2026-04-17 05:32:20 +00:00

189 lines
5.6 KiB
Python

#!/usr/bin/env python3
"""Tests for pr_backlog_triage.py — issue #658."""
import json
import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
from pr_backlog_triage import (
categorize_pr,
extract_refs,
find_duplicates,
find_stale,
format_report,
format_json,
)
class TestCategorize:
def test_training_data(self):
pr = {"title": "feat: 500 emotional weather pairs (#603)"}
assert categorize_pr(pr) == "training_data"
def test_scene_description(self):
pr = {"title": "feat: 100 jazz scene descriptions (#612)"}
assert categorize_pr(pr) == "training_data"
def test_bug_fix(self):
pr = {"title": "fix: broken import in cli.py"}
assert categorize_pr(pr) == "bug_fix"
def test_feature(self):
pr = {"title": "feat: add token budget tracker"}
assert categorize_pr(pr) == "feature"
def test_docs(self):
pr = {"title": "docs: update README with new config format"}
assert categorize_pr(pr) == "docs"
def test_ops(self):
pr = {"title": "ops: deploy config to Ezra VPS"}
assert categorize_pr(pr) == "ops"
def test_other(self):
pr = {"title": "chore: cleanup whitespace"}
assert categorize_pr(pr) == "other"
def test_case_insensitive(self):
pr = {"title": "FIX: resolve import error"}
assert categorize_pr(pr) == "bug_fix"
def test_empty_title(self):
pr = {"title": ""}
assert categorize_pr(pr) == "other"
def test_none_title(self):
pr = {}
assert categorize_pr(pr) == "other"
class TestExtractRefs:
def test_single_ref(self):
pr = {"title": "Fix #123", "body": "Closes #123"}
assert extract_refs(pr) == [123]
def test_multiple_refs(self):
pr = {"title": "Fix #123", "body": "Related to #456 and #789"}
assert extract_refs(pr) == [123, 456, 789]
def test_deduplication(self):
pr = {"title": "#100", "body": "Fixes #100"}
assert extract_refs(pr) == [100]
def test_no_refs(self):
pr = {"title": "No issue here", "body": "Just a PR"}
assert extract_refs(pr) == []
def test_empty_body(self):
pr = {"title": "Fix #42", "body": None}
assert extract_refs(pr) == [42]
class TestFindDuplicates:
def test_no_duplicates(self):
prs = [
{"number": 1, "title": "Fix #10", "body": ""},
{"number": 2, "title": "Fix #11", "body": ""},
]
assert find_duplicates(prs) == {}
def test_duplicates_found(self):
prs = [
{"number": 1, "title": "Fix #10", "body": ""},
{"number": 2, "title": "Also fix #10", "body": ""},
]
dupes = find_duplicates(prs)
assert 10 in dupes
assert dupes[10] == [1, 2]
def test_triple_duplicate(self):
prs = [
{"number": 1, "title": "#42", "body": ""},
{"number": 2, "title": "#42", "body": ""},
{"number": 3, "title": "#42", "body": ""},
]
dupes = find_duplicates(prs)
assert len(dupes[42]) == 3
class TestFindStale:
def test_no_stale(self):
prs = [{"number": 1, "title": "Fix #10", "body": ""}]
closed = set()
assert find_stale(prs, closed) == []
def test_stale_found(self):
prs = [{"number": 1, "title": "Fix #10", "body": ""}]
closed = {10}
stale = find_stale(prs, closed)
assert len(stale) == 1
assert stale[0]["pr"] == 1
assert stale[0]["closed_refs"] == [10]
def test_mixed_refs(self):
prs = [{"number": 1, "title": "Fix #10 and #20", "body": ""}]
closed = {10}
stale = find_stale(prs, closed)
assert stale[0]["closed_refs"] == [10]
class TestFormatReport:
def test_basic_report(self):
analysis = {
"repo": "test/repo",
"total_open": 5,
"categories": {"feature": 3, "bug_fix": 2},
"category_details": {
"feature": [
{"number": 1, "title": "feat: x", "refs": [10], "head": "f1",
"additions": 10, "deletions": 5, "changed_files": 2, "created": "2026-04-01"}
],
"bug_fix": [],
},
"duplicates": {},
"stale_prs": [],
"closed_issues_checked": 100,
}
report = format_report(analysis)
assert "test/repo" in report
assert "5" in report
assert "feature" in report
def test_stale_in_report(self):
analysis = {
"repo": "test/repo",
"total_open": 1,
"categories": {"feature": 1},
"category_details": {},
"duplicates": {},
"stale_prs": [{"pr": 5, "closed_refs": [10]}],
"closed_issues_checked": 50,
}
report = format_report(analysis)
assert "#5" in report
assert "#10" in report
def test_duplicates_in_report(self):
analysis = {
"repo": "test/repo",
"total_open": 2,
"categories": {"bug_fix": 2},
"category_details": {},
"duplicates": {42: [1, 2]},
"stale_prs": [],
"closed_issues_checked": 0,
}
report = format_report(analysis)
assert "Duplicate" in report
assert "#42" in report
class TestFormatJson:
def test_valid_json(self):
analysis = {"repo": "test", "total_open": 0}
out = format_json(analysis)
parsed = json.loads(out)
assert parsed["repo"] == "test"