94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
import pytest
|
|
from fastapi.testclient import TestClient
|
|
from main import app, current_user_ctx, UserService
|
|
from contextvars import ContextVar
|
|
|
|
client = TestClient(app)
|
|
|
|
|
|
def test_read_users_me_with_valid_token():
|
|
"""测试有效令牌获取用户信息"""
|
|
response = client.get(
|
|
"/users/me",
|
|
headers={"Authorization": "Bearer valid_token_123"}
|
|
)
|
|
assert response.status_code == 200
|
|
assert response.json()["id"] == 123
|
|
assert response.json()["username"] == "john_doe"
|
|
|
|
|
|
def test_read_users_me_with_invalid_token():
|
|
"""测试无效令牌"""
|
|
response = client.get(
|
|
"/users/me",
|
|
headers={"Authorization": "Bearer invalid_token"}
|
|
)
|
|
assert response.status_code == 401
|
|
assert response.json()["detail"] == "Invalid credentials"
|
|
|
|
|
|
def test_create_task_with_user_context():
|
|
"""测试创建任务时用户上下文是否正确"""
|
|
response = client.post(
|
|
"/tasks",
|
|
json={"title": "Test task", "description": "Test description"},
|
|
headers={"Authorization": "Bearer valid_token_123"}
|
|
)
|
|
assert response.status_code == 200
|
|
# 检查响应中是否包含正确的用户ID
|
|
assert response.json()["task"]["created_by"] == 123
|
|
|
|
|
|
def test_get_tasks_with_different_users():
|
|
"""测试不同用户获取任务"""
|
|
# 用户1
|
|
response1 = client.get(
|
|
"/tasks",
|
|
headers={"Authorization": "Bearer valid_token_123"}
|
|
)
|
|
assert response1.status_code == 200
|
|
# 这里应该只返回用户1的任务
|
|
|
|
# 用户2
|
|
response2 = client.get(
|
|
"/tasks",
|
|
headers={"Authorization": "Bearer valid_token_456"}
|
|
)
|
|
assert response2.status_code == 200
|
|
# 这里应该只返回用户2的任务
|
|
|
|
|
|
def test_context_outside_request():
|
|
"""测试在请求上下文外获取用户(应该失败)"""
|
|
try:
|
|
UserService.get_current_user()
|
|
assert False, "Should have raised an exception"
|
|
except RuntimeError as e:
|
|
assert "No current user available" in str(e)
|
|
|
|
|
|
# 手动设置上下文进行测试
|
|
def test_user_service_with_manual_context():
|
|
"""测试手动设置上下文后获取用户"""
|
|
test_user = {"id": 999, "username": "test_user"}
|
|
token = current_user_ctx.set(test_user)
|
|
|
|
try:
|
|
user_id = UserService.get_current_user_id()
|
|
assert user_id == 999
|
|
|
|
user = UserService.get_current_user()
|
|
assert user["username"] == "test_user"
|
|
finally:
|
|
current_user_ctx.reset(token)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# pytest.main([__file__, "-v"])
|
|
test_read_users_me_with_valid_token()
|
|
test_read_users_me_with_invalid_token()
|
|
test_create_task_with_user_context()
|
|
test_get_tasks_with_different_users()
|
|
test_context_outside_request()
|
|
test_user_service_with_manual_context()
|