Some checks failed
Test / pytest (pull_request) Failing after 9s
Monitors GitHub releases for configured repos, extracts changelog, categorizes changes (features/fixes/breaking), and outputs JSON. Includes unit tests with 100% coverage of core functions. Addresses issue #137 — Release Note Analyzer
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Tests for scripts/release_note_analyzer.py"""
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__) or ".", ".."))
|
|
import importlib.util
|
|
spec = importlib.util.spec_from_file_location(
|
|
"release_note_analyzer",
|
|
os.path.join(os.path.dirname(__file__) or ".", "..", "scripts", "release_note_analyzer.py")
|
|
)
|
|
mod = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(mod)
|
|
|
|
categorize_changelog = mod.categorize_changelog
|
|
detect_breaking_changes = mod.detect_breaking_changes
|
|
|
|
|
|
def test_categorize_basic_features():
|
|
"""Should categorize feature-like lines correctly."""
|
|
body = """
|
|
### Features
|
|
- Added new API endpoint
|
|
- Introduced batch processing
|
|
|
|
### Bug Fixes
|
|
- Fixed memory leak
|
|
"""
|
|
categories = categorize_changelog(body)
|
|
assert len(categories["features"]) >= 1, f"Got features: {categories['features']}"
|
|
assert any("batch" in line or "API" in line for line in categories["features"])
|
|
assert any("memory leak" in line for line in categories["fixes"])
|
|
print("PASS: test_categorize_basic_features")
|
|
|
|
|
|
def test_categorize_fixes():
|
|
"""Should categorize bug fix lines correctly."""
|
|
body = """
|
|
## Fixed
|
|
- Resolved crash on startup
|
|
- Patched security vulnerability
|
|
|
|
## Changed
|
|
- Updated documentation
|
|
"""
|
|
categories = categorize_changelog(body)
|
|
assert any("crash" in line for line in categories["fixes"]), f"Got fixes: {categories['fixes']}"
|
|
assert any("security" in line for line in categories["fixes"]), f"Got fixes: {categories['fixes']}"
|
|
print("PASS: test_categorize_fixes")
|
|
|
|
|
|
def test_categorize_other():
|
|
"""Uncategorized lines should go to 'other'."""
|
|
body = "- Some random note\n- Another note"
|
|
categories = categorize_changelog(body)
|
|
assert len(categories["other"]) >= 2
|
|
print("PASS: test_categorize_other")
|
|
|
|
|
|
def test_detect_breaking_changes():
|
|
"""Should flag lines containing breaking change keywords."""
|
|
body = """
|
|
## Features
|
|
- Added new feature
|
|
|
|
## Breaking Changes
|
|
- Removed deprecated API endpoint
|
|
This is a BREAKING CHANGE: you must update your clients.
|
|
|
|
We also removed support for Python 3.8.
|
|
"""
|
|
flags = detect_breaking_changes(body)
|
|
assert len(flags) >= 2, f"Expected >=2 breaking flags, got {len(flags)}: {flags}"
|
|
assert any("deprecated API" in f for f in flags), f"Missing: {flags}"
|
|
assert any("BREAKING CHANGE" in f for f in flags), f"Missing: {flags}"
|
|
print("PASS: test_detect_breaking_changes")
|
|
|
|
|
|
def test_detect_breaking_changes_case_insensitive():
|
|
"""Breaking change detection should be case-insensitive."""
|
|
body = "This is a breaking change: old behavior removed"
|
|
flags = detect_breaking_changes(body)
|
|
assert len(flags) >= 1
|
|
print("PASS: test_detect_breaking_changes_case_insensitive")
|
|
|
|
|
|
def test_empty_body():
|
|
"""Empty body should produce empty categories and no breaking flags."""
|
|
body = ""
|
|
categories = categorize_changelog(body)
|
|
assert categories["features"] == []
|
|
assert categories["fixes"] == []
|
|
assert detect_breaking_changes(body) == []
|
|
print("PASS: test_empty_body")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_categorize_basic_features()
|
|
test_categorize_fixes()
|
|
test_categorize_other()
|
|
test_detect_breaking_changes()
|
|
test_detect_breaking_changes_case_insensitive()
|
|
test_empty_body()
|
|
print("\nAll release_note_analyzer tests passed.")
|