Files
DP/Server/tests/test_verify.py

76 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
import sys
import datetime
from datetime import timezone, timedelta
# 将 Server 目录加入 sys.path方便导入 app 包
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
os.environ["DATABASE_URL"] = "sqlite:///./test_verify.db"
from fastapi.testclient import TestClient
from app.main import app
from app.db import init_db, Base, engine, SessionLocal
from app.models.user import User
client = TestClient(app)
def test_verify_endpoint():
# Setup
Base.metadata.drop_all(bind=engine)
Base.metadata.create_all(bind=engine)
init_db()
# 1. Register
client.post("/api/v1/auth/register", json={"username": "eve", "password": "pass", "confirm_password": "pass"})
# 2. Login
resp = client.post("/api/v1/auth/login", json={"username": "eve", "password": "pass", "device_id": "dev1"})
assert resp.status_code == 200
token = resp.json()["access_token"]
headers = {"Authorization": f"Bearer {token}"}
# 3. Verify Success
verify_data = {
"username": "eve",
"device_id": "dev1",
"timestamp": 1234567890
}
resp = client.post("/api/v1/auth/verify", json=verify_data, headers=headers)
assert resp.status_code == 200
data = resp.json()
assert data["valid"] == True
assert data["username"] == "eve"
# 4. Verify Fail - Session not found (wrong device_id)
verify_data_bad_dev = {
"username": "eve",
"device_id": "dev2",
"timestamp": 1234567890
}
resp = client.post("/api/v1/auth/verify", json=verify_data_bad_dev, headers=headers)
assert resp.status_code == 404
assert "会话不存在" in resp.json()["detail"]
# 5. Verify Expiry
# Hack DB to set expire_date
db = SessionLocal()
user = db.query(User).filter(User.username == "eve").first()
# Expired yesterday
user.expire_date = datetime.datetime.now(timezone.utc) - timedelta(days=1)
db.commit()
db.close()
resp = client.post("/api/v1/auth/verify", json=verify_data, headers=headers)
assert resp.status_code == 200 # It returns 200 but valid=False per requirements
data = resp.json()
assert data["valid"] == False
assert data["expire_date"] is not None
# 6. Verify Token Invalid (401)
resp = client.post("/api/v1/auth/verify", json=verify_data, headers={"Authorization": "Bearer invalid_token"})
assert resp.status_code == 401
if __name__ == "__main__":
test_verify_endpoint()
print("All tests passed!")