123 lines
3.3 KiB
Python
123 lines
3.3 KiB
Python
|
|
# tests/conftest.py - pytest fixtures for 甲辰藏品系统
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
# 设置项目路径
|
|||
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|||
|
|
|
|||
|
|
# 设置环境变量(测试环境使用SQLite内存数据库)
|
|||
|
|
os.environ["SECRET_KEY"] = "test-secret-key-for-testing-only"
|
|||
|
|
os.environ["DATABASE_URL"] = "sqlite:///./test.db"
|
|||
|
|
os.environ["ALGORITHM"] = "HS256"
|
|||
|
|
os.environ["ACCESS_TOKEN_EXPIRE_MINUTES"] = "60"
|
|||
|
|
|
|||
|
|
import pytest
|
|||
|
|
from fastapi.testclient import TestClient
|
|||
|
|
from sqlalchemy import create_engine, event
|
|||
|
|
from sqlalchemy.orm import sessionmaker
|
|||
|
|
from sqlalchemy.pool import StaticPool
|
|||
|
|
|
|||
|
|
from app.core.database import Base, get_db
|
|||
|
|
from app.main import app
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ========== 数据库 Fixture ==========
|
|||
|
|
|
|||
|
|
# 使用SQLite内存数据库进行测试
|
|||
|
|
TEST_DATABASE_URL = "sqlite:///:memory:"
|
|||
|
|
|
|||
|
|
engine = create_engine(
|
|||
|
|
TEST_DATABASE_URL,
|
|||
|
|
connect_args={"check_same_thread": False},
|
|||
|
|
poolclass=StaticPool,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 启用外键约束(SQLite需要)
|
|||
|
|
@event.listens_for(engine, "connect")
|
|||
|
|
def set_sqlite_pragma(dbapi_connection, connection_record):
|
|||
|
|
cursor = dbapi_connection.cursor()
|
|||
|
|
cursor.execute("PRAGMA foreign_keys=ON")
|
|||
|
|
cursor.close()
|
|||
|
|
|
|||
|
|
|
|||
|
|
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture(scope="function")
|
|||
|
|
def db_session():
|
|||
|
|
"""每次测试创建新的数据库表,测试结束后清理"""
|
|||
|
|
Base.metadata.create_all(bind=engine)
|
|||
|
|
session = TestingSessionLocal()
|
|||
|
|
try:
|
|||
|
|
yield session
|
|||
|
|
finally:
|
|||
|
|
session.close()
|
|||
|
|
Base.metadata.drop_all(bind=engine)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture(scope="function")
|
|||
|
|
def client(db_session):
|
|||
|
|
"""FastAPI测试客户端,使用测试数据库"""
|
|||
|
|
def override_get_db():
|
|||
|
|
try:
|
|||
|
|
yield db_session
|
|||
|
|
finally:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
app.dependency_overrides[get_db] = override_get_db
|
|||
|
|
with TestClient(app) as test_client:
|
|||
|
|
yield test_client
|
|||
|
|
app.dependency_overrides.clear()
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture(scope="function")
|
|||
|
|
def sample_user_data():
|
|||
|
|
"""示例用户注册数据"""
|
|||
|
|
return {
|
|||
|
|
"f01_01_name": "testuser",
|
|||
|
|
"password": "testpass123",
|
|||
|
|
"email": "test@example.com",
|
|||
|
|
"phone": "13800138000",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture(scope="function")
|
|||
|
|
def registered_user(db_session, sample_user_data):
|
|||
|
|
"""创建一个已注册的用户(带密码哈希)"""
|
|||
|
|
from app.core.auth import get_password_hash
|
|||
|
|
from app.models.models import User
|
|||
|
|
import uuid
|
|||
|
|
|
|||
|
|
hashed_password = get_password_hash(sample_user_data["password"])
|
|||
|
|
user = User(
|
|||
|
|
f99_90_id=str(uuid.uuid4()),
|
|||
|
|
f99_91_user_id=str(uuid.uuid4()),
|
|||
|
|
user_code="201",
|
|||
|
|
f01_01_name=sample_user_data["f01_01_name"],
|
|||
|
|
email=sample_user_data["email"],
|
|||
|
|
phone=sample_user_data["phone"],
|
|||
|
|
password=hashed_password,
|
|||
|
|
role="user",
|
|||
|
|
)
|
|||
|
|
db_session.add(user)
|
|||
|
|
db_session.commit()
|
|||
|
|
db_session.refresh(user)
|
|||
|
|
return user
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture(scope="function")
|
|||
|
|
def auth_token(registered_user):
|
|||
|
|
"""生成已注册用户的访问令牌"""
|
|||
|
|
from app.core.auth import create_access_token
|
|||
|
|
|
|||
|
|
token = create_access_token(data={"sub": registered_user.f99_90_id})
|
|||
|
|
return token
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.fixture(scope="function")
|
|||
|
|
def auth_headers(auth_token):
|
|||
|
|
"""带Bearer令牌的请求头"""
|
|||
|
|
return {"Authorization": f"Bearer {auth_token}"}
|