luminos/tests/test_recency.py
Jeff Smith 6875cf5ed1 feat(tests): add unit test coverage for all testable modules (#37)
129 tests across cache, filetypes, code, disk, recency, tree, report,
and capabilities. Uses stdlib unittest only — no new dependencies.
Also updates CLAUDE.md development workflow to require test coverage
for all future changes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:57:26 -06:00

75 lines
2.8 KiB
Python

"""Tests for luminos_lib/recency.py"""
import unittest
from unittest.mock import patch, MagicMock
from luminos_lib.recency import find_recent_files
class TestFindRecentFiles(unittest.TestCase):
def _mock_find(self, lines):
output = "\n".join(lines)
return MagicMock(returncode=0, stdout=output)
def test_returns_sorted_by_recency(self):
lines = [
"1000.0\t/tmp/old.py",
"2000.0\t/tmp/new.py",
"1500.0\t/tmp/mid.py",
]
with patch("subprocess.run", return_value=self._mock_find(lines)):
result = find_recent_files("/tmp")
self.assertEqual(result[0]["name"], "new.py")
self.assertEqual(result[1]["name"], "mid.py")
self.assertEqual(result[2]["name"], "old.py")
def test_limits_to_n(self):
lines = [f"{i}.0\t/tmp/file{i}.py" for i in range(20)]
with patch("subprocess.run", return_value=self._mock_find(lines)):
result = find_recent_files("/tmp", n=5)
self.assertEqual(len(result), 5)
def test_entry_fields(self):
lines = ["1700000000.0\t/tmp/subdir/script.py"]
with patch("subprocess.run", return_value=self._mock_find(lines)):
result = find_recent_files("/tmp")
self.assertEqual(len(result), 1)
entry = result[0]
self.assertEqual(entry["name"], "script.py")
self.assertEqual(entry["path"], "/tmp/subdir/script.py")
self.assertIsInstance(entry["modified"], float)
self.assertIsInstance(entry["modified_human"], str)
def test_timeout_returns_empty(self):
import subprocess
with patch("subprocess.run", side_effect=subprocess.TimeoutExpired("find", 30)):
result = find_recent_files("/tmp")
self.assertEqual(result, [])
def test_file_not_found_returns_empty(self):
with patch("subprocess.run", side_effect=FileNotFoundError):
result = find_recent_files("/tmp")
self.assertEqual(result, [])
def test_nonzero_returncode_returns_empty(self):
mock = MagicMock(returncode=1, stdout="")
with patch("subprocess.run", return_value=mock):
result = find_recent_files("/tmp")
self.assertEqual(result, [])
def test_empty_output_returns_empty(self):
mock = MagicMock(returncode=0, stdout="")
with patch("subprocess.run", return_value=mock):
result = find_recent_files("/tmp")
self.assertEqual(result, [])
def test_malformed_lines_skipped(self):
lines = ["notvalid", "1000.0\t/tmp/good.py", "alsoinvalid"]
with patch("subprocess.run", return_value=self._mock_find(lines)):
result = find_recent_files("/tmp")
self.assertEqual(len(result), 1)
self.assertEqual(result[0]["name"], "good.py")
if __name__ == "__main__":
unittest.main()