feat: customize site banners and login notices
This commit is contained in:
@@ -2,7 +2,7 @@ import os
|
||||
from types import SimpleNamespace
|
||||
import tempfile
|
||||
import unittest
|
||||
from unittest.mock import AsyncMock, patch
|
||||
from unittest.mock import AsyncMock, call, patch
|
||||
|
||||
import httpx
|
||||
from fastapi import HTTPException
|
||||
@@ -298,6 +298,9 @@ class SiteInfoTests(unittest.TestCase):
|
||||
site_banner_enabled=False,
|
||||
site_banner_message="",
|
||||
site_banner_tone="info",
|
||||
site_banner_background_color=None,
|
||||
site_banner_border_color=None,
|
||||
site_login_message="",
|
||||
site_login_show_jellyfin_login=True,
|
||||
site_login_show_local_login=True,
|
||||
site_login_show_forgot_password=True,
|
||||
@@ -310,6 +313,49 @@ class SiteInfoTests(unittest.TestCase):
|
||||
|
||||
self.assertEqual(info["navigation"], {"showRequests": False})
|
||||
|
||||
def test_site_public_exposes_safe_banner_colours_and_login_message(self) -> None:
|
||||
runtime = settings.model_copy(update={
|
||||
"site_banner_enabled": True,
|
||||
"site_banner_message": "Planned maintenance",
|
||||
"site_banner_tone": "warning",
|
||||
"site_banner_background_color": "#123ABC",
|
||||
"site_banner_border_color": "red",
|
||||
"site_login_message": "Use your Grizzlyflix account to sign in.",
|
||||
})
|
||||
|
||||
with patch.object(site_router, "get_runtime_settings", return_value=runtime):
|
||||
info = site_router._build_site_info(False)
|
||||
|
||||
self.assertEqual(info["banner"]["backgroundColor"], "#123abc")
|
||||
self.assertIsNone(info["banner"]["borderColor"])
|
||||
self.assertEqual(info["login"]["message"], "Use your Grizzlyflix account to sign in.")
|
||||
|
||||
|
||||
class SiteSettingValidationTests(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_banner_colours_are_normalized_before_saving(self) -> None:
|
||||
with patch.object(admin_router, "set_setting") as save:
|
||||
result = await admin_router.update_settings({
|
||||
"site_banner_background_color": "#A1B2C3",
|
||||
"site_banner_border_color": "#010203",
|
||||
})
|
||||
|
||||
self.assertEqual(result, {"status": "ok", "updated": 2})
|
||||
self.assertEqual(
|
||||
save.call_args_list,
|
||||
[
|
||||
call("site_banner_background_color", "#a1b2c3"),
|
||||
call("site_banner_border_color", "#010203"),
|
||||
],
|
||||
)
|
||||
|
||||
async def test_banner_colours_reject_unsafe_css_values(self) -> None:
|
||||
with self.assertRaises(HTTPException) as raised:
|
||||
await admin_router.update_settings({
|
||||
"site_banner_border_color": "red; background: url(example)",
|
||||
})
|
||||
|
||||
self.assertEqual(raised.exception.status_code, 400)
|
||||
|
||||
|
||||
class RequestCacheTests(unittest.TestCase):
|
||||
def tearDown(self) -> None:
|
||||
|
||||
Reference in New Issue
Block a user