52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
"""集成冒烟测试:登录链路 + 各模块只读接口(需 MySQL/Redis 运行,默认跳过)。"""
|
|
|
|
import pytest
|
|
|
|
pytestmark = pytest.mark.integration
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_login_flow(client):
|
|
"""完整登录链路:/api/v1/captcha → 解析验证码 → /api/v1/login 获取 token。"""
|
|
import redis as redis_lib
|
|
|
|
from core.config import REDIS_AUTH, REDIS_HOST, REDIS_INDEX, REDIS_PASSWORD, REDIS_PORT
|
|
|
|
r = await client.get("/api/v1/captcha")
|
|
body = r.json()
|
|
assert body["code"] == 0
|
|
idkey = body.get("idkey")
|
|
assert idkey
|
|
|
|
# 从 Redis 读取验证码明文(带认证参数,与 app 连接一致)
|
|
redis_client = redis_lib.Redis(
|
|
host=REDIS_HOST, port=REDIS_PORT,
|
|
password=REDIS_PASSWORD if REDIS_AUTH else None,
|
|
db=REDIS_INDEX,
|
|
)
|
|
code = redis_client.get(idkey).decode()
|
|
|
|
resp = await client.post("/api/v1/login", json={
|
|
"username": "admin", "password": "123456",
|
|
"code": code, "key": idkey,
|
|
})
|
|
login = resp.json()
|
|
assert login["code"] == 0
|
|
assert login["data"]["access_token"]
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_admin_read_endpoints(client, admin_headers):
|
|
"""管理员 token 可访问代表性只读接口。"""
|
|
for path in ("/api/v1/user/page", "/api/v1/dept/list", "/api/v1/menu/list",
|
|
"/api/v1/index/menu", "/api/v1/job/page"):
|
|
resp = await client.get(path, headers=admin_headers)
|
|
assert resp.json()["code"] == 0, f"{path} failed"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_unauthorized_blocked(client):
|
|
"""无 token 访问受保护接口应返回 401。"""
|
|
resp = await client.get("/api/v1/user/page")
|
|
assert resp.json()["code"] == 401
|