2026-02-04 18:49:38 +08:00
|
|
|
"""Web TUI 模块测试"""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
from minenasai.webtui.auth import AuthManager, AuthToken
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestAuthToken:
|
|
|
|
|
"""AuthToken 测试"""
|
|
|
|
|
|
|
|
|
|
def test_token_not_expired(self):
|
|
|
|
|
"""测试未过期令牌"""
|
|
|
|
|
token = AuthToken(
|
|
|
|
|
token="test",
|
|
|
|
|
user_id="user1",
|
|
|
|
|
created_at=time.time(),
|
|
|
|
|
expires_at=time.time() + 3600,
|
|
|
|
|
)
|
|
|
|
|
assert not token.is_expired
|
|
|
|
|
assert token.remaining_time > 0
|
|
|
|
|
|
|
|
|
|
def test_token_expired(self):
|
|
|
|
|
"""测试已过期令牌"""
|
|
|
|
|
token = AuthToken(
|
|
|
|
|
token="test",
|
|
|
|
|
user_id="user1",
|
|
|
|
|
created_at=time.time() - 7200,
|
|
|
|
|
expires_at=time.time() - 3600,
|
|
|
|
|
)
|
|
|
|
|
assert token.is_expired
|
|
|
|
|
assert token.remaining_time == 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestAuthManager:
|
|
|
|
|
"""AuthManager 测试"""
|
|
|
|
|
|
|
|
|
|
def setup_method(self):
|
|
|
|
|
"""初始化"""
|
|
|
|
|
self.manager = AuthManager(secret_key="test-secret-key")
|
|
|
|
|
|
|
|
|
|
def test_generate_token(self):
|
|
|
|
|
"""测试生成令牌"""
|
|
|
|
|
token = self.manager.generate_token("user1")
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert token is not None
|
|
|
|
|
assert len(token) > 20
|
|
|
|
|
|
|
|
|
|
def test_verify_token(self):
|
|
|
|
|
"""测试验证令牌"""
|
|
|
|
|
token = self.manager.generate_token("user1")
|
|
|
|
|
auth_token = self.manager.verify_token(token)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert auth_token is not None
|
|
|
|
|
assert auth_token.user_id == "user1"
|
|
|
|
|
|
|
|
|
|
def test_verify_invalid_token(self):
|
|
|
|
|
"""测试验证无效令牌"""
|
|
|
|
|
auth_token = self.manager.verify_token("invalid-token")
|
|
|
|
|
assert auth_token is None
|
|
|
|
|
|
|
|
|
|
def test_verify_expired_token(self):
|
|
|
|
|
"""测试验证过期令牌"""
|
|
|
|
|
token = self.manager.generate_token("user1", expires_in=0)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
# 等待过期
|
|
|
|
|
time.sleep(0.1)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
auth_token = self.manager.verify_token(token)
|
|
|
|
|
assert auth_token is None
|
|
|
|
|
|
|
|
|
|
def test_revoke_token(self):
|
|
|
|
|
"""测试撤销令牌"""
|
|
|
|
|
token = self.manager.generate_token("user1")
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert self.manager.revoke_token(token) is True
|
|
|
|
|
assert self.manager.verify_token(token) is None
|
|
|
|
|
|
|
|
|
|
def test_revoke_nonexistent_token(self):
|
|
|
|
|
"""测试撤销不存在的令牌"""
|
|
|
|
|
assert self.manager.revoke_token("nonexistent") is False
|
|
|
|
|
|
|
|
|
|
def test_revoke_user_tokens(self):
|
|
|
|
|
"""测试撤销用户所有令牌"""
|
|
|
|
|
self.manager.generate_token("user1")
|
|
|
|
|
self.manager.generate_token("user1")
|
|
|
|
|
self.manager.generate_token("user2")
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
count = self.manager.revoke_user_tokens("user1")
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert count == 2
|
|
|
|
|
assert self.manager.get_stats()["total_tokens"] == 1
|
|
|
|
|
|
|
|
|
|
def test_refresh_token(self):
|
|
|
|
|
"""测试刷新令牌"""
|
|
|
|
|
old_token = self.manager.generate_token("user1")
|
|
|
|
|
new_token = self.manager.refresh_token(old_token)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert new_token is not None
|
|
|
|
|
assert new_token != old_token
|
|
|
|
|
assert self.manager.verify_token(old_token) is None
|
|
|
|
|
assert self.manager.verify_token(new_token) is not None
|
|
|
|
|
|
|
|
|
|
def test_token_metadata(self):
|
|
|
|
|
"""测试令牌元数据"""
|
|
|
|
|
metadata = {"channel": "wework", "task_id": "123"}
|
|
|
|
|
token = self.manager.generate_token("user1", metadata=metadata)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
auth_token = self.manager.verify_token(token)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert auth_token is not None
|
|
|
|
|
assert auth_token.metadata == metadata
|
|
|
|
|
|
|
|
|
|
def test_cleanup_expired(self):
|
|
|
|
|
"""测试清理过期令牌"""
|
|
|
|
|
self.manager.generate_token("user1", expires_in=0)
|
|
|
|
|
self.manager.generate_token("user2", expires_in=3600)
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
time.sleep(0.1)
|
|
|
|
|
count = self.manager.cleanup_expired()
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert count == 1
|
|
|
|
|
assert self.manager.get_stats()["total_tokens"] == 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestSSHManager:
|
|
|
|
|
"""SSHManager 测试(不实际连接)"""
|
|
|
|
|
|
|
|
|
|
def test_import_ssh_manager(self):
|
|
|
|
|
"""测试导入 SSH 管理器"""
|
|
|
|
|
from minenasai.webtui import SSHManager, get_ssh_manager
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
manager = get_ssh_manager()
|
|
|
|
|
assert isinstance(manager, SSHManager)
|
|
|
|
|
|
|
|
|
|
def test_ssh_manager_stats(self):
|
|
|
|
|
"""测试 SSH 管理器统计"""
|
|
|
|
|
from minenasai.webtui import SSHManager
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
manager = SSHManager()
|
|
|
|
|
stats = manager.get_stats()
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert "active_sessions" in stats
|
|
|
|
|
assert stats["active_sessions"] == 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestWebTUIServer:
|
|
|
|
|
"""Web TUI 服务器测试"""
|
|
|
|
|
|
|
|
|
|
def test_import_server(self):
|
|
|
|
|
"""测试导入服务器"""
|
|
|
|
|
from minenasai.webtui.server import app
|
2026-02-05 15:43:08 +08:00
|
|
|
|
2026-02-04 18:49:38 +08:00
|
|
|
assert app is not None
|
|
|
|
|
assert app.title == "MineNASAI Web TUI"
|