mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-02 08:56:38 +08:00
test: add Playwright e2e test suite for frontend and API
This commit is contained in:
@@ -0,0 +1,185 @@
|
||||
"""
|
||||
Test API endpoints for FLVX backend.
|
||||
Tests API responses directly without browser.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
from utils.api_client import APIClient
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPIHealth:
|
||||
"""API health check tests."""
|
||||
|
||||
def test_api_endpoint_reachable(self, api_client: APIClient):
|
||||
"""Test that API endpoint is reachable."""
|
||||
response = api_client.post("/captcha/check")
|
||||
assert "code" in response
|
||||
|
||||
def test_captcha_check_endpoint(self, api_client: APIClient):
|
||||
"""Test captcha check endpoint."""
|
||||
response = api_client.post("/captcha/check")
|
||||
assert response["code"] == 0
|
||||
assert "data" in response
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPIAuthentication:
|
||||
"""API authentication tests."""
|
||||
|
||||
def test_login_success(self, api_client: APIClient):
|
||||
"""Test successful login."""
|
||||
response = api_client.login("admin_user", "admin_user")
|
||||
assert response["code"] == 0
|
||||
assert "token" in response["data"]
|
||||
assert api_client.token is not None
|
||||
|
||||
def test_login_invalid_user(self, api_client: APIClient):
|
||||
"""Test login with invalid user."""
|
||||
response = api_client.login("nonexistent", "password")
|
||||
assert response["code"] != 0
|
||||
|
||||
def test_login_invalid_password(self, api_client: APIClient):
|
||||
"""Test login with invalid password."""
|
||||
response = api_client.login("admin_user", "wrong_password")
|
||||
assert response["code"] != 0
|
||||
|
||||
def test_login_empty_username(self, api_client: APIClient):
|
||||
"""Test login with empty username."""
|
||||
response = api_client.login("", "password")
|
||||
assert response["code"] != 0
|
||||
|
||||
def test_login_empty_password(self, api_client: APIClient):
|
||||
"""Test login with empty password."""
|
||||
response = api_client.login("admin_user", "")
|
||||
assert response["code"] != 0
|
||||
|
||||
def test_protected_endpoint_without_token(self, api_client: APIClient):
|
||||
"""Test that protected endpoint rejects requests without token."""
|
||||
response = api_client.post("/user/list")
|
||||
assert response["code"] == 401
|
||||
|
||||
def test_protected_endpoint_with_token(self, authenticated_api: APIClient):
|
||||
"""Test that protected endpoint accepts requests with token."""
|
||||
response = authenticated_api.post("/user/list")
|
||||
assert response["code"] == 0
|
||||
assert isinstance(response["data"], list)
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPIUserManagement:
|
||||
"""API user management tests."""
|
||||
|
||||
def test_list_users(self, authenticated_api: APIClient):
|
||||
"""Test listing users."""
|
||||
response = authenticated_api.post("/user/list")
|
||||
assert response["code"] == 0
|
||||
users = response["data"]
|
||||
assert isinstance(users, list)
|
||||
|
||||
def test_create_and_delete_user(self, authenticated_api: APIClient):
|
||||
"""Test creating and deleting a user."""
|
||||
import uuid
|
||||
|
||||
username = f"test_api_user_{uuid.uuid4().hex[:8]}"
|
||||
|
||||
create_response = authenticated_api.create_user(username, "test123", name="Test User")
|
||||
assert create_response.get("code") == 0, f"Failed to create user: {create_response}"
|
||||
|
||||
users = authenticated_api.list_users(username)
|
||||
user_id = None
|
||||
for u in users:
|
||||
if u.get("user") == username:
|
||||
user_id = u.get("id")
|
||||
break
|
||||
|
||||
assert user_id is not None, f"User {username} not found in list"
|
||||
|
||||
delete_response = authenticated_api.delete_user(user_id)
|
||||
assert delete_response.get("code") == 0
|
||||
|
||||
def test_create_duplicate_user(self, authenticated_api: APIClient):
|
||||
"""Test that creating duplicate user fails."""
|
||||
import uuid
|
||||
|
||||
username = f"test_dup_user_{uuid.uuid4().hex[:8]}"
|
||||
|
||||
create1 = authenticated_api.create_user(username, "test123")
|
||||
assert create1.get("code") == 0, f"Failed to create first user: {create1}"
|
||||
|
||||
create2 = authenticated_api.create_user(username, "test456")
|
||||
assert create2.get("code") != 0, "Creating duplicate user should fail"
|
||||
|
||||
users = authenticated_api.list_users(username)
|
||||
for u in users:
|
||||
if u.get("user") == username:
|
||||
authenticated_api.delete_user(u.get("id"))
|
||||
break
|
||||
|
||||
def test_user_package_endpoint(self, authenticated_api: APIClient):
|
||||
"""Test user package endpoint."""
|
||||
response = authenticated_api.post("/user/package")
|
||||
assert response["code"] == 0
|
||||
assert "userInfo" in response["data"]
|
||||
assert "tunnelPermissions" in response["data"]
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPIConfig:
|
||||
"""API configuration tests."""
|
||||
|
||||
def test_get_configs(self, authenticated_api: APIClient):
|
||||
"""Test getting all configs."""
|
||||
response = authenticated_api.post("/config/list")
|
||||
assert response["code"] == 0
|
||||
assert isinstance(response["data"], dict)
|
||||
|
||||
def test_get_single_config(self, authenticated_api: APIClient):
|
||||
"""Test getting a single config."""
|
||||
response = authenticated_api.post("/config/get", {"name": "app_name"})
|
||||
if response["code"] == 0:
|
||||
assert "value" in response["data"]
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPINodeManagement:
|
||||
"""API node management tests."""
|
||||
|
||||
def test_list_nodes(self, authenticated_api: APIClient):
|
||||
"""Test listing nodes."""
|
||||
response = authenticated_api.post("/node/list")
|
||||
assert response["code"] == 0
|
||||
assert isinstance(response["data"], list)
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPITunnelManagement:
|
||||
"""API tunnel management tests."""
|
||||
|
||||
def test_list_tunnels(self, authenticated_api: APIClient):
|
||||
"""Test listing tunnels."""
|
||||
response = authenticated_api.post("/tunnel/list")
|
||||
assert response["code"] == 0
|
||||
assert isinstance(response["data"], list)
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPIForwardManagement:
|
||||
"""API forward management tests."""
|
||||
|
||||
def test_list_forwards(self, authenticated_api: APIClient):
|
||||
"""Test listing forwards."""
|
||||
response = authenticated_api.post("/forward/list")
|
||||
assert response["code"] == 0
|
||||
assert isinstance(response["data"], list)
|
||||
|
||||
|
||||
@pytest.mark.api
|
||||
class TestAPIBackup:
|
||||
"""API backup tests."""
|
||||
|
||||
def test_backup_export(self, authenticated_api: APIClient):
|
||||
"""Test backup export."""
|
||||
response = authenticated_api.backup_export()
|
||||
assert "version" in response, f"Expected version in backup response: {response}"
|
||||
Reference in New Issue
Block a user