conftest.py 2.4 KB

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