conftest.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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.openapi_schema = None
  28. globals.app.middleware_stack = None
  29. globals.app.user_middleware.clear()
  30. # NOTE favicon routes must be removed separately because they are not "pages"
  31. [globals.app.routes.remove(r) for r in globals.app.routes if r.path.endswith('/favicon.ico')]
  32. importlib.reload(globals)
  33. globals.app.storage.clear()
  34. globals.index_client = Client(page('/'), shared=True).__enter__()
  35. globals.app.get('/')(globals.index_client.build_response)
  36. @pytest.fixture(scope='session', autouse=True)
  37. def remove_all_screenshots() -> None:
  38. if os.path.exists(Screen.SCREENSHOT_DIR):
  39. for name in os.listdir(Screen.SCREENSHOT_DIR):
  40. os.remove(os.path.join(Screen.SCREENSHOT_DIR, name))
  41. @pytest.fixture(scope='function')
  42. def driver(chrome_options: webdriver.ChromeOptions) -> webdriver.Chrome:
  43. s = Service(ChromeDriverManager().install())
  44. driver = webdriver.Chrome(service=s, options=chrome_options)
  45. driver.implicitly_wait(Screen.IMPLICIT_WAIT)
  46. driver.set_page_load_timeout(4)
  47. yield driver
  48. driver.quit()
  49. @pytest.fixture
  50. def screen(driver: webdriver.Chrome, request: pytest.FixtureRequest, caplog: pytest.LogCaptureFixture) \
  51. -> Generator[Screen, None, None]:
  52. screen = Screen(driver, caplog)
  53. yield screen
  54. if screen.is_open:
  55. screen.shot(request.node.name)
  56. logs = screen.caplog.get_records('call')
  57. assert not logs, f'There were unexpected logs:\n-------\n{logs}\n-------'
  58. screen.stop_server()