Skip to content

Commit e66c26e

Browse files
committed
add github workflow
1 parent 804d123 commit e66c26e

File tree

4 files changed

+169
-0
lines changed

4 files changed

+169
-0
lines changed

.github/workflows/poetry.yml

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
name: Python Package
2+
3+
on:
4+
push:
5+
branches: [master]
6+
tags:
7+
- v*
8+
pull_request:
9+
branches: [master]
10+
11+
jobs:
12+
test:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v2
16+
17+
- name: Set up Python 3.8
18+
uses: actions/setup-python@v2
19+
with:
20+
python-version: 3.8
21+
22+
- name: Install dependencies
23+
run: |
24+
python -m pip install --upgrade pip
25+
pip install poetry
26+
poetry install
27+
28+
- name: Run tests with coverage
29+
run: |
30+
poetry run pytest tests -vv
31+
32+
publish:
33+
runs-on: ubuntu-latest
34+
needs: test # 声明依赖于先前的测试作业
35+
if: startsWith(github.ref, 'refs/tags/') # 仅在标签推送时运行
36+
steps:
37+
- uses: actions/checkout@v3
38+
39+
- name: Set up Python
40+
uses: actions/setup-python@v4
41+
with:
42+
python-version: 3.9
43+
44+
- name: Install dependencies
45+
run: |
46+
python -m pip install --upgrade pip
47+
pip install poetry
48+
49+
- name: Build
50+
run: |
51+
poetry self add "poetry-dynamic-versioning[plugin]"
52+
rm -fr dist/ && poetry build
53+
54+
- name: Publish distribution 📦 to PyPI
55+
uses: pypa/gh-action-pypi-publish@release/v1
56+
with:
57+
password: ${{ secrets.PYPI_TOKEN }}

pytest.ini

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[pytest]
2+
testpaths = tests
3+
python_files = test_*.py
4+
python_classes = Test*
5+
python_functions = test_*

tests/conftest.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import os
2+
import pytest
3+
4+
@pytest.fixture(autouse=True)
5+
def clean_env():
6+
"""清理测试环境变量"""
7+
# 备份现有环境变量
8+
old_env = {}
9+
for key in ["SERVEFS_ROOT", "SERVEFS_DEBUG"]:
10+
if key in os.environ:
11+
old_env[key] = os.environ[key]
12+
del os.environ[key]
13+
14+
yield
15+
16+
# 恢复环境变量
17+
for key, value in old_env.items():
18+
os.environ[key] = value

tests/test_cli.py

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import os
2+
from pathlib import Path
3+
from unittest.mock import patch
4+
5+
import pytest
6+
from typer.testing import CliRunner
7+
8+
from servefs.cli import app
9+
10+
runner = CliRunner()
11+
12+
def test_version():
13+
"""测试版本信息显示"""
14+
result = runner.invoke(app, ["--version"])
15+
assert result.exit_code == 0
16+
assert "servefs version:" in result.stdout
17+
18+
def test_help():
19+
"""测试帮助信息显示"""
20+
result = runner.invoke(app, ["--help"])
21+
assert result.exit_code == 0
22+
assert "Usage:" in result.stdout
23+
24+
def test_invalid_port():
25+
"""测试无效端口号"""
26+
result = runner.invoke(app, ["--port", "99999"])
27+
assert result.exit_code == 2
28+
assert "Invalid value for '--port'" in result.stdout
29+
30+
def test_invalid_root():
31+
"""测试无效根目录"""
32+
result = runner.invoke(app, ["--root", "/nonexistent/path"])
33+
assert result.exit_code == 2
34+
assert "Invalid value for '--root'" in result.stdout
35+
36+
@pytest.fixture
37+
def temp_dir(tmp_path):
38+
"""创建临时目录"""
39+
return tmp_path
40+
41+
def test_server_start(temp_dir):
42+
"""测试服务器启动"""
43+
with patch("servefs.cli.uvicorn.run") as mock_run:
44+
result = runner.invoke(app, [
45+
"--root", str(temp_dir),
46+
"--port", "8888",
47+
"--host", "127.0.0.1",
48+
"--debug"
49+
])
50+
51+
assert result.exit_code == 0
52+
# 验证环境变量设置
53+
assert os.environ["SERVEFS_ROOT"] == str(temp_dir.absolute())
54+
assert os.environ["SERVEFS_DEBUG"] == "true"
55+
56+
# 验证服务器启动参数
57+
mock_run.assert_called_once_with(
58+
"servefs.main:app",
59+
host="127.0.0.1",
60+
port=8888,
61+
log_level="info"
62+
)
63+
64+
def test_default_options():
65+
"""测试默认选项"""
66+
with patch("servefs.cli.uvicorn.run") as mock_run:
67+
result = runner.invoke(app)
68+
69+
assert result.exit_code == 0
70+
# 验证默认环境变量
71+
assert os.environ["SERVEFS_ROOT"] == str(Path(".").absolute())
72+
assert os.environ["SERVEFS_DEBUG"] == "false"
73+
74+
# 验证默认服务器参数
75+
mock_run.assert_called_once_with(
76+
"servefs.main:app",
77+
host="0.0.0.0",
78+
port=8000,
79+
log_level="info"
80+
)
81+
82+
def test_debug_mode():
83+
"""测试调试模式"""
84+
with patch("servefs.cli.uvicorn.run") as mock_run:
85+
result = runner.invoke(app, ["--debug"])
86+
87+
assert result.exit_code == 0
88+
assert os.environ["SERVEFS_DEBUG"] == "true"
89+
assert "Developer mode: enabled" in result.stdout

0 commit comments

Comments
 (0)