"""disk_quota.py 单元测试。 不连真 DB ── parse_bytes / scan_user_dir / skip dotfile 行为 / 不存在路径, 都纯 Python 文件系统操作可单测。upsert / check_disk_quota 需要 DB,跳过(集成测覆盖)。 """ from __future__ import annotations import sys import tempfile import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from core.storage.disk_quota import parse_bytes, scan_user_dir class TestParseBytes(unittest.TestCase): def test_int_passthrough(self): self.assertEqual(parse_bytes(1024), 1024) self.assertEqual(parse_bytes(0), 0) def test_gb(self): self.assertEqual(parse_bytes("5gb"), 5 * 1024 ** 3) self.assertEqual(parse_bytes("5g"), 5 * 1024 ** 3) self.assertEqual(parse_bytes("5GB"), 5 * 1024 ** 3) def test_mb(self): self.assertEqual(parse_bytes("500mb"), 500 * 1024 ** 2) self.assertEqual(parse_bytes("500m"), 500 * 1024 ** 2) def test_kb(self): self.assertEqual(parse_bytes("1kb"), 1024) def test_bytes(self): self.assertEqual(parse_bytes("1024b"), 1024) self.assertEqual(parse_bytes("1024"), 1024) def test_float_suffix(self): self.assertEqual(parse_bytes("1.5gb"), int(1.5 * 1024 ** 3)) def test_invalid(self): self.assertIsNone(parse_bytes("")) self.assertIsNone(parse_bytes("xxx")) self.assertIsNone(parse_bytes("1.2.3")) self.assertIsNone(parse_bytes(None)) class TestScanUserDir(unittest.TestCase): def test_empty_dir(self): with tempfile.TemporaryDirectory() as d: b, c = scan_user_dir(Path(d)) self.assertEqual((b, c), (0, 0)) def test_nonexistent(self): b, c = scan_user_dir(Path("/nonexistent/path/xxx")) self.assertEqual((b, c), (0, 0)) def test_count_and_size(self): with tempfile.TemporaryDirectory() as d: root = Path(d) (root / "a.txt").write_bytes(b"hello") # 5 (root / "sub").mkdir() (root / "sub" / "b.txt").write_bytes(b"world!") # 6 (root / "sub" / "c.txt").write_bytes(b"x" * 1000) # 1000 b, c = scan_user_dir(root) self.assertEqual(b, 1011) self.assertEqual(c, 3) def test_skip_dotfile_toplevel(self): """顶层 .zcbot_tmp / .memory 被跳过(开发期临时 + 用户记忆,不算配额)。""" with tempfile.TemporaryDirectory() as d: root = Path(d) (root / "a.txt").write_bytes(b"counted") # 7 (root / ".zcbot_tmp").mkdir() (root / ".zcbot_tmp" / "skipped.py").write_bytes(b"x" * 99999) (root / ".memory").mkdir() (root / ".memory" / "core.md").write_bytes(b"x" * 99999) b, c = scan_user_dir(root) self.assertEqual(b, 7) self.assertEqual(c, 1) if __name__ == "__main__": unittest.main()