3f966a230e
CI / Lint, Typecheck & Test (push) Successful in 2m5s
将 13 个工具入口文件重构为通过 px.run_yaml 调用 YAML 配置, 辅助函数移至 _ops 模块。新增 run_yaml 便捷函数支持 job 选择 和传递依赖收集,修复 _build_cmd 列表变量展开,新增 bump_project_version 高层函数封装版本号更新+git 提交流程。
135 lines
4.6 KiB
Python
135 lines
4.6 KiB
Python
"""Tests for cli.filelevel module."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
import pyflowx as px
|
|
from pyflowx.cli import filelevel
|
|
from pyflowx.cli._ops import files
|
|
|
|
|
|
# ---------------------------------------------------------------------- #
|
|
# remove_marks
|
|
# ---------------------------------------------------------------------- #
|
|
class TestRemoveMarks:
|
|
"""Test remove_marks function."""
|
|
|
|
def test_remove_marks_single_mark(self) -> None:
|
|
"""Should remove single mark."""
|
|
stem = "filename(PUB)"
|
|
result = files.remove_marks(stem, ["PUB"])
|
|
assert result == "filename"
|
|
|
|
def test_remove_marks_multiple_marks(self) -> None:
|
|
"""Should remove multiple marks."""
|
|
stem = "filename(PUB)(NOR)"
|
|
result = files.remove_marks(stem, ["PUB", "NOR"])
|
|
assert result == "filename"
|
|
|
|
def test_remove_marks_no_marks(self) -> None:
|
|
"""Should not change stem without marks."""
|
|
stem = "filename"
|
|
result = files.remove_marks(stem, ["PUB"])
|
|
assert result == "filename"
|
|
|
|
|
|
# ---------------------------------------------------------------------- #
|
|
# process_file_level
|
|
# ---------------------------------------------------------------------- #
|
|
class TestProcessFileLevel:
|
|
"""Test process_file_level function."""
|
|
|
|
def test_process_file_level_set_pub(self, tmp_path: Path) -> None:
|
|
"""Should set PUB level."""
|
|
test_file = tmp_path / "test.txt"
|
|
test_file.write_text("test content")
|
|
|
|
files.process_file_level(test_file, level=1)
|
|
# File should be renamed with PUB level
|
|
|
|
def test_process_file_level_set_int(self, tmp_path: Path) -> None:
|
|
"""Should set INT level."""
|
|
test_file = tmp_path / "test.txt"
|
|
test_file.write_text("test content")
|
|
|
|
files.process_file_level(test_file, level=2)
|
|
# File should be renamed with INT level
|
|
|
|
def test_process_file_level_clear(self, tmp_path: Path) -> None:
|
|
"""Should clear level."""
|
|
test_file = tmp_path / "test(PUB).txt"
|
|
test_file.write_text("test content")
|
|
|
|
files.process_file_level(test_file, level=0)
|
|
# File should be renamed without level
|
|
|
|
def test_process_file_level_invalid_level(self, tmp_path: Path) -> None:
|
|
"""Should handle invalid level."""
|
|
test_file = tmp_path / "test.txt"
|
|
test_file.write_text("test content")
|
|
|
|
files.process_file_level(test_file, level=5)
|
|
# Should print error message
|
|
|
|
def test_process_file_level_nonexistent_file(self, tmp_path: Path) -> None:
|
|
"""Should handle nonexistent file."""
|
|
test_file = tmp_path / "nonexistent.txt"
|
|
|
|
files.process_file_level(test_file, level=1)
|
|
# Should print error message
|
|
|
|
|
|
# ---------------------------------------------------------------------- #
|
|
# process_files_level
|
|
# ---------------------------------------------------------------------- #
|
|
class TestProcessFilesLevel:
|
|
"""Test process_files_level function."""
|
|
|
|
def test_process_files_level_batch(self, tmp_path: Path) -> None:
|
|
"""Should process multiple files."""
|
|
file_list = []
|
|
for i in range(3):
|
|
test_file = tmp_path / f"test{i}.txt"
|
|
test_file.write_text(f"content{i}")
|
|
file_list.append(test_file)
|
|
|
|
files.process_files_level(file_list, level=1)
|
|
# All files should be processed
|
|
|
|
|
|
# ---------------------------------------------------------------------- #
|
|
# main function
|
|
# ---------------------------------------------------------------------- #
|
|
class TestMain:
|
|
"""Test main function."""
|
|
|
|
def test_main_set_command(self, tmp_path: Path) -> None:
|
|
"""main() should handle set command."""
|
|
test_file = tmp_path / "test.txt"
|
|
test_file.write_text("test content")
|
|
|
|
with patch("sys.argv", ["filelevel", "set", str(test_file), "--level", "1"]), patch.object(
|
|
px, "run"
|
|
) as mock_run:
|
|
filelevel.main()
|
|
assert mock_run.called
|
|
|
|
def test_main_set_command_level_2(self, tmp_path: Path) -> None:
|
|
"""main() should handle set command with level 2."""
|
|
test_file = tmp_path / "test.txt"
|
|
test_file.write_text("test content")
|
|
|
|
with patch("sys.argv", ["filelevel", "set", str(test_file), "--level", "2"]), patch.object(
|
|
px, "run"
|
|
) as mock_run:
|
|
filelevel.main()
|
|
assert mock_run.called
|
|
|
|
def test_main_with_no_args_shows_help(self) -> None:
|
|
"""main() with no args should show help."""
|
|
with patch("sys.argv", ["filelevel"]):
|
|
filelevel.main()
|
|
# Should print help and return
|