# 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}"}