import sys
import unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from starlette.applications import Starlette # noqa: E402
from starlette.responses import HTMLResponse, JSONResponse # noqa: E402
from starlette.routing import Route # noqa: E402
from starlette.testclient import TestClient # noqa: E402
import gradio_runtime # noqa: E402
GRADIO_INDEX = """
Gradio
app"""
TITLE = "Pocket 3D AI | SkyeBrowse"
HEAD = ''
GOOGLEBOT = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
CHROME = "Mozilla/5.0 (Macintosh) AppleWebKit/537.36 Chrome/141.0 Safari/537.36"
def served_app(title=TITLE):
kwargs = gradio_runtime.build_launch_kwargs(None, "", "", HEAD, title=title)
routes = [
Route("/", lambda request: HTMLResponse(GRADIO_INDEX)),
Route("/config", lambda request: JSONResponse({"head": kwargs["head"]})),
]
return TestClient(Starlette(routes=routes, **kwargs["app_kwargs"]), follow_redirects=False)
class DocumentHeadTest(unittest.TestCase):
def test_page_html_carries_title_and_head_without_gradio_defaults(self):
html = served_app().get("/?__theme=light", headers={"Accept": "text/html"}).text
self.assertIn(f"{TITLE}", html)
self.assertIn(HEAD, html)
self.assertNotIn('content="Gradio"', html)
self.assertNotIn("@Gradio", html)
self.assertEqual(html.count(""), 1)
def test_config_head_is_empty_so_embeds_do_not_inherit_it(self):
self.assertEqual(served_app().get("/config").json()["head"], "")
def test_without_title_head_stays_in_config(self):
self.assertEqual(served_app(title="").get("/config").json()["head"], HEAD)
def test_browsers_are_redirected_to_light_theme(self):
response = served_app().get("/", headers={"Accept": "text/html", "User-Agent": CHROME})
self.assertEqual(response.status_code, 307)
self.assertIn("__theme=light", response.headers["location"])
def test_crawlers_get_the_page_without_a_redirect(self):
response = served_app().get("/", headers={"Accept": "text/html", "User-Agent": GOOGLEBOT})
self.assertEqual(response.status_code, 200)
self.assertIn(HEAD, response.text)
if __name__ == "__main__":
unittest.main()