Files
Nexus/tests/test_refresh_token_null_version.py
T
Nexus Agent 7ea94a60ab fix(auth,servers): 修复 refresh 自动登出与服务器状态未知
API 返回 status 字段供前端显示在线状态;token_version 为 NULL 时 refresh cookie 含 :None 导致续期 401。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-07 22:53:29 +08:00

54 lines
1.8 KiB
Python

"""Refresh token when admin.token_version is NULL (legacy cookie contains ':None')."""
from unittest.mock import AsyncMock, MagicMock
import pytest
from server.application.services.auth_service import (
AuthService,
_admin_token_version,
_parse_refresh_token_version,
)
from server.domain.models import Admin
def test_admin_token_version_null_is_zero():
admin = Admin(id=1, username="a", password_hash="x", token_version=None)
assert _admin_token_version(admin) == 0
def test_parse_refresh_token_version_accepts_none_literal():
assert _parse_refresh_token_version("None") == 0
assert _parse_refresh_token_version("0") == 0
@pytest.mark.asyncio
async def test_refresh_succeeds_with_legacy_none_version_cookie(monkeypatch):
admin = Admin(id=1, username="admin", password_hash="x", is_active=True, token_version=None)
service = AuthService(AsyncMock(), AsyncMock(), AsyncMock())
service.admin_repo.get_by_id = AsyncMock(return_value=admin)
service._audit = AsyncMock()
service._create_access_token = MagicMock(return_value="access")
service._create_refresh_token = MagicMock(return_value="new:1:0")
service._rotate_refresh_token = AsyncMock(return_value=True)
token = "legacysecret:1:None"
async def membership(_admin_id, _token):
return True
monkeypatch.setattr(service, "_refresh_token_membership", membership)
result = await service.refresh_token(token, ip_address="127.0.0.1")
assert result["success"] is True
assert result["access_token"] == "access"
def test_create_refresh_token_uses_zero_not_none_string():
admin = Admin(id=1, username="admin", password_hash="x", token_version=None)
service = AuthService(AsyncMock(), AsyncMock(), AsyncMock())
raw = service._create_refresh_token(admin)
assert raw.endswith(":1:0")
assert "None" not in raw