65 lines
2.5 KiB
Python
65 lines
2.5 KiB
Python
"""Tests for setup-time runtime checks ported from setup.ts."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
from src.setup import (
|
|
MIN_PYTHON_VERSION,
|
|
SetupReport,
|
|
check_runtime_requirements,
|
|
run_setup,
|
|
)
|
|
|
|
|
|
class RuntimeRequirementCheckTest(unittest.TestCase):
|
|
def test_python_check_passes_on_current_runtime(self) -> None:
|
|
checks = {check.name: check for check in check_runtime_requirements()}
|
|
self.assertTrue(checks['python_version'].ok)
|
|
self.assertGreaterEqual(sys.version_info[:2], MIN_PYTHON_VERSION)
|
|
|
|
def test_python_check_fails_when_below_minimum(self) -> None:
|
|
# Force a lower version_info via patching to verify the failure branch.
|
|
fake_version = mock.Mock()
|
|
fake_version.__getitem__ = lambda self, idx: (3, 8)[idx] if isinstance(idx, int) else (3, 8)[idx]
|
|
with mock.patch('src.setup.sys') as fake_sys:
|
|
fake_sys.version_info = (3, 8, 0)
|
|
checks = {check.name: check for check in check_runtime_requirements()}
|
|
self.assertFalse(checks['python_version'].ok)
|
|
self.assertIn('below required', checks['python_version'].detail)
|
|
|
|
def test_includes_platform_and_implementation(self) -> None:
|
|
names = {check.name for check in check_runtime_requirements()}
|
|
self.assertIn('python_implementation', names)
|
|
self.assertIn('platform', names)
|
|
|
|
|
|
class SetupReportTest(unittest.TestCase):
|
|
def test_run_setup_reports_runtime_and_release_notes(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
(Path(tmp) / 'CHANGELOG.md').write_text(
|
|
'# Changelog\n\n## 9.9.9\n- big release\n', encoding='utf-8',
|
|
)
|
|
report = run_setup(cwd=Path(tmp), trusted=True, last_seen_version='0.0.1')
|
|
self.assertIsInstance(report, SetupReport)
|
|
self.assertGreaterEqual(len(report.runtime_checks), 3)
|
|
self.assertIn('big release', report.release_notes)
|
|
markdown = report.as_markdown()
|
|
self.assertIn('Runtime checks', markdown)
|
|
self.assertIn('Release notes', markdown)
|
|
self.assertFalse(report.has_blocking_issues())
|
|
|
|
def test_no_release_notes_when_changelog_missing(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
report = run_setup(cwd=Path(tmp), trusted=True)
|
|
self.assertEqual(report.release_notes, ())
|
|
self.assertNotIn('Release notes', report.as_markdown())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|