test_favicon.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from pathlib import Path
  2. import requests
  3. from bs4 import BeautifulSoup
  4. from nicegui import ui
  5. from .screen import PORT, Screen
  6. DEFAULT_FAVICON_PATH = Path(__file__).parent.parent / 'nicegui' / 'static' / 'favicon.ico'
  7. LOGO_FAVICON_PATH = Path(__file__).parent.parent / 'website' / 'static' / 'logo_square.png'
  8. def assert_favicon_url_starts_with(screen: Screen, content: str):
  9. soup = BeautifulSoup(screen.selenium.page_source, 'html.parser')
  10. icon_link = soup.find("link", rel="icon")
  11. assert icon_link['href'].startswith(content)
  12. def assert_favicon(file: Path, url_path: str = '/favicon.ico'):
  13. response = requests.get(f'http://localhost:{PORT}{url_path}')
  14. assert response.status_code == 200
  15. assert file.read_bytes() == response.content
  16. def test_default(screen: Screen):
  17. ui.label('Hello, world')
  18. screen.open('/')
  19. assert_favicon(DEFAULT_FAVICON_PATH)
  20. def test_emoji(screen: Screen):
  21. ui.label('Hello, world')
  22. screen.ui_run_kwargs['favicon'] = '👋'
  23. screen.open('/')
  24. assert_favicon_url_starts_with(screen, 'data:image/svg+xml')
  25. # the default favicon is still available (for example when accessing a plain FastAPI route with the browser)
  26. assert_favicon(DEFAULT_FAVICON_PATH)
  27. def test_custom_file(screen: Screen):
  28. ui.label('Hello, world')
  29. screen.ui_run_kwargs['favicon'] = LOGO_FAVICON_PATH
  30. screen.open('/')
  31. assert_favicon_url_starts_with(screen, '/favicon.ico')
  32. assert_favicon(screen.ui_run_kwargs['favicon'])
  33. def test_page_specific_icon(screen: Screen):
  34. @ui.page('/subpage', favicon=LOGO_FAVICON_PATH)
  35. def sub():
  36. ui.label('Subpage')
  37. ui.label('Main')
  38. screen.open('/subpage')
  39. assert_favicon(LOGO_FAVICON_PATH, url_path='/subpage/favicon.ico')
  40. screen.open('/')
  41. def test_page_specific_emoji(screen: Screen):
  42. @ui.page('/subpage', favicon='👋')
  43. def sub():
  44. ui.label('Subpage')
  45. ui.label('Main')
  46. screen.open('/subpage')
  47. assert_favicon_url_starts_with(screen, 'data:image/svg+xml')
  48. screen.open('/')
  49. assert_favicon(DEFAULT_FAVICON_PATH)