conftest.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import importlib
  2. import os
  3. import shutil
  4. from typing import Dict, Generator
  5. import icecream
  6. import pytest
  7. from selenium import webdriver
  8. from selenium.webdriver.chrome.service import Service
  9. from webdriver_manager.chrome import ChromeDriverManager
  10. from nicegui import Client, globals
  11. from nicegui.page import page
  12. from .test_helpers import DOWNLOAD_DIR
  13. from .screen import Screen
  14. icecream.install()
  15. @pytest.fixture
  16. def chrome_options(chrome_options: webdriver.ChromeOptions) -> webdriver.ChromeOptions:
  17. chrome_options.add_argument('headless')
  18. chrome_options.add_argument('disable-gpu')
  19. chrome_options.add_argument('window-size=600x600')
  20. chrome_options.add_experimental_option('prefs', {
  21. "download.default_directory": str(DOWNLOAD_DIR),
  22. "download.prompt_for_download": False, # To auto download the file
  23. "download.directory_upgrade": True,
  24. })
  25. return chrome_options
  26. @pytest.fixture
  27. def capabilities(capabilities: Dict) -> Dict:
  28. capabilities['goog:loggingPrefs'] = {'browser': 'ALL'}
  29. return capabilities
  30. @pytest.fixture(autouse=True)
  31. def reset_globals() -> Generator[None, None, None]:
  32. for path in {'/'}.union(globals.page_routes.values()):
  33. globals.app.remove_route(path)
  34. globals.app.middleware_stack = None
  35. globals.app.user_middleware.clear()
  36. # NOTE favicon routes must be removed separately because they are not "pages"
  37. [globals.app.routes.remove(r) for r in globals.app.routes if r.path.endswith('/favicon.ico')]
  38. importlib.reload(globals)
  39. globals.app.storage.clear()
  40. globals.index_client = Client(page('/'), shared=True).__enter__()
  41. globals.app.get('/')(globals.index_client.build_response)
  42. @pytest.fixture(scope='session', autouse=True)
  43. def remove_all_screenshots() -> None:
  44. if os.path.exists(Screen.SCREENSHOT_DIR):
  45. for name in os.listdir(Screen.SCREENSHOT_DIR):
  46. os.remove(os.path.join(Screen.SCREENSHOT_DIR, name))
  47. @pytest.fixture(scope='function')
  48. def driver(chrome_options: webdriver.ChromeOptions) -> webdriver.Chrome:
  49. s = Service(ChromeDriverManager().install())
  50. driver = webdriver.Chrome(service=s, options=chrome_options)
  51. driver.implicitly_wait(Screen.IMPLICIT_WAIT)
  52. driver.set_page_load_timeout(4)
  53. yield driver
  54. driver.quit()
  55. @pytest.fixture
  56. def screen(driver: webdriver.Chrome, request: pytest.FixtureRequest, caplog: pytest.LogCaptureFixture) \
  57. -> Generator[Screen, None, None]:
  58. screen = Screen(driver, caplog)
  59. yield screen
  60. if screen.is_open:
  61. screen.shot(request.node.name)
  62. logs = screen.caplog.get_records('call')
  63. assert not logs, f'There were unexpected logs:\n-------\n{logs}\n-------'
  64. screen.stop_server()
  65. shutil.rmtree(DOWNLOAD_DIR)