# -*- coding: utf-8 -*- """纯 FastAPI 模式(api_prefix='')测试:前端全部路径由 FastAPI 服务。""" import warnings import pytest from fastapi.testclient import TestClient warnings.filterwarnings('ignore') # 前端实际调用的路径(从 index.html / site_auth.js 抽取的代表集合) FRONTEND_PATHS = [ '/', '/health', '/api/info', '/song', '/search', '/playlist', '/album', '/toplist', '/artist_songs', '/comments', '/auth/me', '/auth/login', '/auth/logout', '/auth/heartbeat', '/auth/register', '/auth/send_code', '/auth/redeem', '/auth/forgot_password', '/auth/ann_seen', '/auth/admin_login/email', '/auth/admin_login/verify', '/user/status', '/user/logout', '/user/qr/create', '/user/qr/check', '/user/playlists', '/user/playlist', '/user/collect', '/user/comment', '/account/vip', '/global/playlists', '/global/playlist', '/api/playlist/play', '/download', '/download/batch_zip', '/download/result', '/download/batch_zip/result', '/podcast/parse', '/podcast/programs', '/podcast/search', '/podcast/hot', '/podcast/download', '/podcast/download/batch_zip', '/api/topen', '/api/queue', '/api/batch_progress', '/api/task/cancel', '/api/task/heartbeat', '/api/task/list', '/api/fe_error', '/audio_stream', '/admin/qr/create', '/admin/qr/check', '/admin/cookie/status', '/admin/cookie/delete', '/admin/logs', '/admin/site/users', '/admin/site/logs', '/admin/site/cards/list', '/admin/site/ann/get', '/admin/site/play_key/get', '/admin/site/backup/list', '/admin/site/smtp/get', '/admin/site/user/cookie', ] @pytest.fixture() def root_client(tmp_path, monkeypatch): """root 模式应用(不挂 Flask 兜底、前缀为空)。""" import auth_system as auth import core.db as db monkeypatch.setattr(auth, 'DATA_DIR', tmp_path) monkeypatch.setattr(auth, 'DB_PATH', tmp_path / 'site.db') monkeypatch.setattr(auth, 'BACKUP_DIR', tmp_path / 'backups') monkeypatch.setattr(auth, 'SECRET_KEY_PATH', tmp_path / 'secret.key') monkeypatch.setattr(db, 'DATA_DIR', tmp_path) monkeypatch.setattr(db, 'DB_PATH', tmp_path / 'site.db') auth.init_db() monkeypatch.setattr('web.deps.secret_key', lambda: 'root-mode-secret') from web.app import create_app return TestClient(create_app(api_prefix='')) @pytest.mark.parametrize('path', FRONTEND_PATHS) def test_frontend_path_not_404(root_client, path): """前端调用的每条路径都必须有 FastAPI 路由(不得 404)。""" r = root_client.post(path, json={}) assert r.status_code != 404, f'{path} 在纯 FastAPI 模式下 404' def test_root_page_served(root_client): r = root_client.get('/') assert r.status_code == 200 assert r.headers.get('cache-control', '').startswith('no-cache') def test_no_api_v1_prefix_in_root_mode(root_client): """根路径模式下不再有 /api/v1 前缀(Flask 时代的比对前缀已废弃)。""" r = root_client.post('/api/v1/song', json={}) assert r.status_code == 404