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 webdriver_manager.chrome import ChromeDriverManager
  9. from nicegui import Client, globals
  10. from nicegui.elements import plotly, pyplot
  11. from nicegui.page import page
  12. from .screen import Screen
  13. icecream.install()
  14. @pytest.fixture
  15. def chrome_options(chrome_options: webdriver.ChromeOptions) -> webdriver.ChromeOptions:
  16. chrome_options.add_argument('headless')
  17. chrome_options.add_argument('disable-gpu')
  18. chrome_options.add_argument('window-size=600x600')
  19. return chrome_options
  20. @pytest.fixture
  21. def capabilities(capabilities: Dict) -> Dict:
  22. capabilities['goog:loggingPrefs'] = {'browser': 'ALL'}
  23. return capabilities
  24. @pytest.fixture(autouse=True)
  25. def reset_globals() -> Generator[None, None, None]:
  26. print('!!! resetting globals !!!')
  27. for path in {'/'}.union(globals.page_routes.values()):
  28. globals.app.remove_route(path)
  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()