Files
LandPPT/tests/test_auth_oauth_visibility.py
T
sligterandClaude Opus 4.6 6153e56441 feat: modularize services and expand platform workflows
Add OAuth, community, credits, startup, export, and narration workflows while splitting oversized route and PPT service modules into dedicated components with broader regression coverage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 21:04:37 +08:00

152 lines
4.5 KiB
Python

import importlib
import sys
import types
import pytest
from starlette.requests import Request
class _CaptureTemplates:
def __init__(self):
self.calls = []
def TemplateResponse(self, template_name, context):
self.calls.append((template_name, context))
return {
"template_name": template_name,
"context": context,
}
def _import_auth_routes(monkeypatch):
import fastapi.templating
class _DummyTemplates:
def __init__(self, *args, **kwargs):
self.env = types.SimpleNamespace(globals={})
def TemplateResponse(self, *args, **kwargs):
raise AssertionError("测试中应替换为捕获模板对象")
monkeypatch.setattr(fastapi.templating, "Jinja2Templates", _DummyTemplates)
sys.modules.pop("landppt.auth.routes", None)
return importlib.import_module("landppt.auth.routes")
def _build_request(path: str) -> Request:
return Request(
{
"type": "http",
"http_version": "1.1",
"method": "GET",
"scheme": "http",
"path": path,
"raw_path": path.encode("utf-8"),
"query_string": b"",
"headers": [],
"client": ("127.0.0.1", 12345),
"server": ("testserver", 80),
}
)
def _patch_common_dependencies(monkeypatch, auth_routes, config):
from landppt.database import database as database_module
from landppt.database import repositories as repositories_module
templates = _CaptureTemplates()
monkeypatch.setattr(auth_routes, "templates", templates)
monkeypatch.setattr(auth_routes, "get_current_user", lambda request: None)
monkeypatch.setattr(auth_routes, "_turnstile_template_ctx", lambda: {})
async def _fake_registration_template_ctx():
return {"invite_code_required_for_registration": True}
monkeypatch.setattr(auth_routes, "_registration_template_ctx", _fake_registration_template_ctx)
class _FakeAsyncSession:
async def __aenter__(self):
return object()
async def __aexit__(self, exc_type, exc, tb):
return False
class _FakeUserConfigRepository:
def __init__(self, session):
self.session = session
async def get_all_configs(self, user_id=None):
return {
key: {"value": value}
for key, value in config.items()
}
monkeypatch.setattr(
database_module,
"AsyncSessionLocal",
lambda: _FakeAsyncSession(),
)
monkeypatch.setattr(repositories_module, "UserConfigRepository", _FakeUserConfigRepository)
return templates
@pytest.mark.asyncio
@pytest.mark.parametrize(
("page_func_name", "path", "template_name"),
[
("login_page", "/auth/login", "pages/auth/login.html"),
("register_page", "/auth/register", "pages/auth/register.html"),
],
)
async def test_auth_pages_hide_oauth_buttons_when_provider_disabled(
monkeypatch,
page_func_name,
path,
template_name,
):
auth_routes = _import_auth_routes(monkeypatch)
page_func = getattr(auth_routes, page_func_name)
templates = _patch_common_dependencies(
monkeypatch,
auth_routes,
{
"github_oauth_enabled": False,
"github_client_id": "github-client-id",
"github_client_secret": "github-client-secret",
"linuxdo_oauth_enabled": False,
"linuxdo_client_id": "linuxdo-client-id",
"linuxdo_client_secret": "linuxdo-client-secret",
},
)
response = await page_func(_build_request(path))
assert response["template_name"] == template_name
assert templates.calls
context = response["context"]
assert context["github_oauth_enabled"] is False
assert context["linuxdo_oauth_enabled"] is False
@pytest.mark.asyncio
async def test_oauth_template_ctx_requires_complete_credentials_before_showing_button(monkeypatch):
auth_routes = _import_auth_routes(monkeypatch)
_patch_common_dependencies(
monkeypatch,
auth_routes,
{
"github_oauth_enabled": True,
"github_client_id": "github-client-id",
"github_client_secret": "",
"linuxdo_oauth_enabled": True,
"linuxdo_client_id": "linuxdo-client-id",
"linuxdo_client_secret": "",
},
)
flags = await auth_routes._load_system_oauth_flags()
assert flags == {
"github_oauth_enabled": False,
"linuxdo_oauth_enabled": False,
}