test_favicon.py 2.2 KB

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