Skip to content

Commit d80fa37

Browse files
authored
Merge branch 'master' into fix/catch-getUser
2 parents dbd4e2a + eac9d86 commit d80fa37

File tree

5 files changed

+104
-78
lines changed

5 files changed

+104
-78
lines changed

packages/pytest-simcore/src/pytest_simcore/helpers/playwright.py

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@
1010
from enum import Enum, unique
1111
from typing import Any, Final
1212

13-
import httpx
1413
from playwright._impl._sync_base import EventContextManager
15-
from playwright.sync_api import FrameLocator, Page, Request
14+
from playwright.sync_api import APIRequestContext, FrameLocator, Page, Request
1615
from playwright.sync_api import TimeoutError as PlaywrightTimeoutError
1716
from playwright.sync_api import WebSocket
1817
from pydantic import AnyUrl
@@ -179,7 +178,7 @@ def _attempt_reconnect(self, logger: logging.Logger) -> None:
179178
self.ws.expect_event(event, predicate)
180179

181180
except Exception as e: # pylint: disable=broad-except
182-
logger.error("🚨 Failed to reconnect WebSocket: %s", e)
181+
logger.exception("🚨 Failed to reconnect WebSocket: %s", e)
183182

184183
def expect_event(
185184
self,
@@ -294,6 +293,7 @@ class SocketIONodeProgressCompleteWaiter:
294293
node_id: str
295294
logger: logging.Logger
296295
product_url: AnyUrl
296+
api_request_context: APIRequestContext
297297
_current_progress: dict[NodeProgressType, float] = field(
298298
default_factory=defaultdict
299299
)
@@ -326,7 +326,7 @@ def __call__(self, message: str) -> bool:
326326
self.logger.info(
327327
"Current startup progress [expected number of node-progress-types=%d]: %s",
328328
len(NodeProgressType.required_types_for_started_service()),
329-
f"{json.dumps({k:round(v,1) for k,v in self._current_progress.items()})}",
329+
f"{json.dumps({k: round(v, 2) for k, v in self._current_progress.items()})}",
330330
)
331331

332332
return self.got_expected_node_progress_types() and all(
@@ -337,23 +337,25 @@ def __call__(self, message: str) -> bool:
337337
_current_timestamp = datetime.now(UTC)
338338
if _current_timestamp - self._last_poll_timestamp > timedelta(seconds=5):
339339
url = f"https://{self.node_id}.services.{self.get_partial_product_url()}"
340-
response = httpx.get(url, timeout=10)
341-
self.logger.info(
342-
"Querying the service endpoint from the E2E test. Url: %s Response: %s TIP: %s",
340+
response = self.api_request_context.get(url, timeout=1000)
341+
level = logging.DEBUG
342+
if (response.status >= 400) and (response.status not in (502, 503)):
343+
level = logging.ERROR
344+
self.logger.log(
345+
level,
346+
"Querying service endpoint in case we missed some websocket messages. Url: %s Response: '%s' TIP: %s",
343347
url,
344-
response,
348+
f"{response.status}: {response.text()}",
345349
(
346-
"Response 401 is OK. It means that service is ready."
347-
if response.status_code == 401
348-
else "We are emulating the frontend; a 500 response is acceptable if the service is not yet ready."
350+
"We are emulating the frontend; a 5XX response is acceptable if the service is not yet ready."
349351
),
350352
)
351-
if response.status_code <= 401:
353+
354+
if response.status <= 400:
352355
# NOTE: If the response status is less than 400, it means that the backend is ready (There are some services that respond with a 3XX)
353-
# MD: for now I have included 401 - as this also means that backend is ready
354356
if self.got_expected_node_progress_types():
355357
self.logger.warning(
356-
"⚠️ Progress bar didn't receive 100 percent but service is already running: %s ⚠️", # https://github.com/ITISFoundation/osparc-simcore/issues/6449
358+
"⚠️ Progress bar didn't receive 100 percent but service is already running: %s. TIP: we missed some websocket messages! ⚠️", # https://github.com/ITISFoundation/osparc-simcore/issues/6449
357359
self.get_current_progress(),
358360
)
359361
return True
@@ -408,8 +410,9 @@ def _node_started_predicate(request: Request) -> bool:
408410

409411

410412
def _trigger_service_start(page: Page, node_id: str) -> None:
411-
with log_context(logging.INFO, msg="trigger start button"), page.expect_request(
412-
_node_started_predicate, timeout=35 * SECOND
413+
with (
414+
log_context(logging.INFO, msg="trigger start button"),
415+
page.expect_request(_node_started_predicate, timeout=35 * SECOND),
413416
):
414417
page.get_by_test_id(f"Start_{node_id}").click()
415418

@@ -433,12 +436,14 @@ def expected_service_running(
433436
logging.INFO, msg=f"Waiting for node to run. Timeout: {timeout}"
434437
) as ctx:
435438
waiter = SocketIONodeProgressCompleteWaiter(
436-
node_id=node_id, logger=ctx.logger, product_url=product_url
439+
node_id=node_id,
440+
logger=ctx.logger,
441+
product_url=product_url,
442+
api_request_context=page.request,
437443
)
438444
service_running = ServiceRunning(iframe_locator=None)
439445

440446
try:
441-
442447
with websocket.expect_event("framereceived", waiter, timeout=timeout):
443448
if press_start_button:
444449
_trigger_service_start(page, node_id)
@@ -475,7 +480,10 @@ def wait_for_service_running(
475480
logging.INFO, msg=f"Waiting for node to run. Timeout: {timeout}"
476481
) as ctx:
477482
waiter = SocketIONodeProgressCompleteWaiter(
478-
node_id=node_id, logger=ctx.logger, product_url=product_url
483+
node_id=node_id,
484+
logger=ctx.logger,
485+
product_url=product_url,
486+
api_request_context=page.request,
479487
)
480488
with websocket.expect_event("framereceived", waiter, timeout=timeout):
481489
if press_start_button:
Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
annotated-types==0.7.0
22
# via pydantic
3-
anyio==4.6.2.post1
3+
anyio==4.8.0
44
# via httpx
55
arrow==1.3.0
66
# via -r requirements/_test.in
7-
certifi==2024.8.30
7+
certifi==2024.12.14
88
# via
99
# httpcore
1010
# httpx
1111
# requests
12-
charset-normalizer==3.3.2
12+
charset-normalizer==3.4.1
1313
# via requests
14-
dnspython==2.6.1
14+
dnspython==2.7.0
1515
# via email-validator
1616
docker==7.1.0
1717
# via -r requirements/_test.in
1818
email-validator==2.2.0
1919
# via pydantic
20-
faker==29.0.0
20+
faker==33.3.1
2121
# via -r requirements/_test.in
22-
greenlet==3.0.3
22+
greenlet==3.1.1
2323
# via playwright
2424
h11==0.14.0
2525
# via httpcore
2626
httpcore==1.0.7
2727
# via httpx
28-
httpx==0.27.2
28+
httpx==0.28.1
2929
# via -r requirements/_test.in
3030
idna==3.10
3131
# via
@@ -35,25 +35,25 @@ idna==3.10
3535
# requests
3636
iniconfig==2.0.0
3737
# via pytest
38-
jinja2==3.1.4
38+
jinja2==3.1.5
3939
# via pytest-html
40-
markupsafe==2.1.5
40+
markupsafe==3.0.2
4141
# via jinja2
42-
packaging==24.1
42+
packaging==24.2
4343
# via
4444
# pytest
4545
# pytest-sugar
46-
playwright==1.47.0
46+
playwright==1.49.1
4747
# via pytest-playwright
4848
pluggy==1.5.0
4949
# via pytest
50-
pydantic==2.10.3
50+
pydantic==2.10.5
5151
# via -r requirements/_test.in
52-
pydantic-core==2.27.1
52+
pydantic-core==2.27.2
5353
# via pydantic
5454
pyee==12.0.0
5555
# via playwright
56-
pytest==8.3.3
56+
pytest==8.3.4
5757
# via
5858
# pytest-base-url
5959
# pytest-html
@@ -69,7 +69,7 @@ pytest-instafail==0.5.0
6969
# via -r requirements/_test.in
7070
pytest-metadata==3.1.1
7171
# via pytest-html
72-
pytest-playwright==0.5.2
72+
pytest-playwright==0.6.2
7373
# via -r requirements/_test.in
7474
pytest-runner==6.0.1
7575
# via -r requirements/_test.in
@@ -87,26 +87,26 @@ requests==2.32.3
8787
# via
8888
# docker
8989
# pytest-base-url
90-
six==1.16.0
90+
six==1.17.0
9191
# via python-dateutil
9292
sniffio==1.3.1
93-
# via
94-
# anyio
95-
# httpx
93+
# via anyio
9694
tenacity==9.0.0
9795
# via -r requirements/_test.in
98-
termcolor==2.4.0
96+
termcolor==2.5.0
9997
# via pytest-sugar
10098
text-unidecode==1.3
10199
# via python-slugify
102-
types-python-dateutil==2.9.0.20240906
100+
types-python-dateutil==2.9.0.20241206
103101
# via arrow
104102
typing-extensions==4.12.2
105103
# via
104+
# anyio
105+
# faker
106106
# pydantic
107107
# pydantic-core
108108
# pyee
109-
urllib3==2.2.3
109+
urllib3==2.3.0
110110
# via
111111
# docker
112112
# requests
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
1-
astroid==3.3.4
1+
astroid==3.3.8
22
# via pylint
3-
black==24.8.0
3+
black==24.10.0
44
# via -r requirements/../../../requirements/devenv.txt
5-
build==1.2.2
5+
build==1.2.2.post1
66
# via pip-tools
77
bump2version==1.0.1
88
# via -r requirements/../../../requirements/devenv.txt
99
cfgv==3.4.0
1010
# via pre-commit
11-
click==8.1.7
11+
click==8.1.8
1212
# via
1313
# black
1414
# pip-tools
15-
dill==0.3.8
15+
dill==0.3.9
1616
# via pylint
17-
distlib==0.3.8
17+
distlib==0.3.9
1818
# via virtualenv
1919
filelock==3.16.1
2020
# via virtualenv
21-
identify==2.6.1
21+
identify==2.6.5
2222
# via pre-commit
2323
isort==5.13.2
2424
# via
2525
# -r requirements/../../../requirements/devenv.txt
2626
# pylint
2727
mccabe==0.7.0
2828
# via pylint
29-
mypy==1.12.0
29+
mypy==1.14.1
3030
# via -r requirements/../../../requirements/devenv.txt
3131
mypy-extensions==1.0.0
3232
# via
3333
# black
3434
# mypy
3535
nodeenv==1.9.1
3636
# via pre-commit
37-
packaging==24.1
37+
packaging==24.2
3838
# via
3939
# -c requirements/_test.txt
4040
# black
4141
# build
4242
pathspec==0.12.1
4343
# via black
44-
pip==24.2
44+
pip==24.3.1
4545
# via pip-tools
4646
pip-tools==7.4.1
4747
# via -r requirements/../../../requirements/devenv.txt
@@ -50,11 +50,11 @@ platformdirs==4.3.6
5050
# black
5151
# pylint
5252
# virtualenv
53-
pre-commit==3.8.0
53+
pre-commit==4.0.1
5454
# via -r requirements/../../../requirements/devenv.txt
55-
pylint==3.3.0
55+
pylint==3.3.3
5656
# via -r requirements/../../../requirements/devenv.txt
57-
pyproject-hooks==1.1.0
57+
pyproject-hooks==1.2.0
5858
# via
5959
# build
6060
# pip-tools
@@ -63,17 +63,17 @@ pyyaml==6.0.2
6363
# -c requirements/../../../requirements/constraints.txt
6464
# -c requirements/_test.txt
6565
# pre-commit
66-
ruff==0.6.7
66+
ruff==0.9.1
6767
# via -r requirements/../../../requirements/devenv.txt
68-
setuptools==75.1.0
68+
setuptools==75.8.0
6969
# via pip-tools
7070
tomlkit==0.13.2
7171
# via pylint
7272
typing-extensions==4.12.2
7373
# via
7474
# -c requirements/_test.txt
7575
# mypy
76-
virtualenv==20.26.5
76+
virtualenv==20.29.0
7777
# via pre-commit
78-
wheel==0.44.0
78+
wheel==0.45.1
7979
# via pip-tools

tests/e2e-playwright/tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import arrow
2020
import pytest
2121
from faker import Faker
22-
from playwright.sync_api import APIRequestContext, BrowserContext, Page, expect
22+
from playwright.sync_api import APIRequestContext, Browser, BrowserContext, Page, expect
2323
from playwright.sync_api._generated import Playwright
2424
from pydantic import AnyUrl, TypeAdapter
2525
from pytest_simcore.helpers.faker_factories import DEFAULT_TEST_PASSWORD
@@ -329,6 +329,7 @@ def store_browser_context() -> bool:
329329

330330
@pytest.fixture
331331
def log_in_and_out(
332+
browser: Browser,
332333
page: Page,
333334
product_url: AnyUrl,
334335
user_name: str,
@@ -340,7 +341,7 @@ def log_in_and_out(
340341
) -> Iterator[RestartableWebSocket]:
341342
with log_context(
342343
logging.INFO,
343-
f"Open {product_url=} using {user_name=}/{user_password=}/{auto_register=}",
344+
f"Open {product_url=} using {user_name=}/{user_password=}/{auto_register=} with {browser.browser_type.name}:{browser.version}({browser.browser_type.executable_path})",
344345
):
345346
response = page.goto(f"{product_url}")
346347
assert response

0 commit comments

Comments
 (0)