conftest.py 2.5 KB

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