Skip to content

Commit 6021ddb

Browse files
committed
Revert "Revert "🐛 fix wrong project name in billing center usage view (ITISFoundation#7798)""
This reverts commit f27e9ad.
1 parent 384a2a1 commit 6021ddb

File tree

7 files changed

+202
-41
lines changed

7 files changed

+202
-41
lines changed

packages/celery-library/requirements/_base.txt

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ certifi==2025.4.26
7070
# requests
7171
charset-normalizer==3.4.2
7272
# via requests
73-
click==8.1.8
73+
click==8.2.1
7474
# via
7575
# celery
7676
# click-didyoumean
@@ -97,7 +97,7 @@ exceptiongroup==1.3.0
9797
# via aio-pika
9898
fast-depends==2.4.12
9999
# via faststream
100-
faststream==0.5.41
100+
faststream==0.5.42
101101
# via -r requirements/../../../packages/service-library/requirements/_base.in
102102
frozenlist==1.6.2
103103
# via
@@ -117,7 +117,7 @@ idna==3.10
117117
# yarl
118118
importlib-metadata==8.6.1
119119
# via opentelemetry-api
120-
jsonschema==4.23.0
120+
jsonschema==4.24.0
121121
# via
122122
# -r requirements/../../../packages/models-library/requirements/_base.in
123123
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
@@ -129,7 +129,7 @@ markdown-it-py==3.0.0
129129
# via rich
130130
mdurl==0.1.2
131131
# via markdown-it-py
132-
multidict==6.4.3
132+
multidict==6.4.4
133133
# via
134134
# aiohttp
135135
# yarl
@@ -139,6 +139,7 @@ opentelemetry-api==1.33.1
139139
# opentelemetry-exporter-otlp-proto-grpc
140140
# opentelemetry-exporter-otlp-proto-http
141141
# opentelemetry-instrumentation
142+
# opentelemetry-instrumentation-aio-pika
142143
# opentelemetry-instrumentation-logging
143144
# opentelemetry-instrumentation-redis
144145
# opentelemetry-instrumentation-requests
@@ -156,9 +157,12 @@ opentelemetry-exporter-otlp-proto-http==1.33.1
156157
# via opentelemetry-exporter-otlp
157158
opentelemetry-instrumentation==0.54b1
158159
# via
160+
# opentelemetry-instrumentation-aio-pika
159161
# opentelemetry-instrumentation-logging
160162
# opentelemetry-instrumentation-redis
161163
# opentelemetry-instrumentation-requests
164+
opentelemetry-instrumentation-aio-pika==0.54b1
165+
# via -r requirements/../../../packages/service-library/requirements/_base.in
162166
opentelemetry-instrumentation-logging==0.54b1
163167
# via -r requirements/../../../packages/service-library/requirements/_base.in
164168
opentelemetry-instrumentation-redis==0.54b1
@@ -225,7 +229,7 @@ psutil==7.0.0
225229
# via -r requirements/../../../packages/service-library/requirements/_base.in
226230
pycryptodome==3.23.0
227231
# via stream-zip
228-
pydantic==2.11.4
232+
pydantic==2.11.5
229233
# via
230234
# -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
231235
# -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
@@ -285,7 +289,7 @@ pydantic-settings==2.7.0
285289
# -r requirements/../../../packages/settings-library/requirements/_base.in
286290
pygments==2.19.1
287291
# via rich
288-
pyinstrument==5.0.1
292+
pyinstrument==5.0.2
289293
# via -r requirements/../../../packages/service-library/requirements/_base.in
290294
python-dateutil==2.9.0.post0
291295
# via
@@ -347,7 +351,7 @@ rich==14.0.0
347351
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
348352
# -r requirements/../../../packages/settings-library/requirements/_base.in
349353
# typer
350-
rpds-py==0.25.0
354+
rpds-py==0.25.1
351355
# via
352356
# jsonschema
353357
# referencing
@@ -367,7 +371,7 @@ toolz==1.0.0
367371
# via -r requirements/../../../packages/service-library/requirements/_base.in
368372
tqdm==4.67.1
369373
# via -r requirements/../../../packages/service-library/requirements/_base.in
370-
typer==0.15.4
374+
typer==0.16.0
371375
# via
372376
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
373377
# -r requirements/../../../packages/settings-library/requirements/_base.in
@@ -385,7 +389,7 @@ typing-extensions==4.14.0
385389
# pydantic-extra-types
386390
# typer
387391
# typing-inspection
388-
typing-inspection==0.4.0
392+
typing-inspection==0.4.1
389393
# via pydantic
390394
tzdata==2025.2
391395
# via kombu
@@ -415,12 +419,13 @@ wrapt==1.17.2
415419
# via
416420
# deprecated
417421
# opentelemetry-instrumentation
422+
# opentelemetry-instrumentation-aio-pika
418423
# opentelemetry-instrumentation-redis
419424
yarl==1.20.0
420425
# via
421426
# -r requirements/../../../packages/service-library/requirements/_base.in
422427
# aio-pika
423428
# aiohttp
424429
# aiormq
425-
zipp==3.21.0
430+
zipp==3.22.0
426431
# via importlib-metadata

packages/celery-library/requirements/_test.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ coverage
1313
faker
1414
fakeredis
1515
fastapi
16+
docker
1617
httpx
1718
pint
1819
pytest

packages/celery-library/requirements/_test.txt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ idna==3.10
8585
# -c requirements/_base.txt
8686
# anyio
8787
# httpx
88+
# requests
8889
iniconfig==2.1.0
8990
# via pytest
9091
kombu==5.5.4
@@ -116,7 +117,7 @@ psutil==7.0.0
116117
# pytest-celery
117118
py-cpuinfo==9.0.0
118119
# via pytest-benchmark
119-
pydantic==2.11.4
120+
pydantic==2.11.5
120121
# via
121122
# -c requirements/../../../requirements/constraints.txt
122123
# -c requirements/_base.txt
@@ -140,10 +141,8 @@ pytest==8.4.0
140141
# pytest-instafail
141142
# pytest-mock
142143
# pytest-sugar
143-
pytest-asyncio==0.23.8
144-
# via
145-
# -c requirements/../../../requirements/constraints.txt
146-
# -r requirements/_test.in
144+
pytest-asyncio==1.0.0
145+
# via -r requirements/_test.in
147146
pytest-benchmark==5.1.0
148147
# via -r requirements/_test.in
149148
pytest-celery==1.2.0
@@ -156,7 +155,7 @@ pytest-icdiff==0.9
156155
# via -r requirements/_test.in
157156
pytest-instafail==0.5.0
158157
# via -r requirements/_test.in
159-
pytest-mock==3.14.0
158+
pytest-mock==3.14.1
160159
# via -r requirements/_test.in
161160
pytest-runner==6.0.1
162161
# via -r requirements/_test.in
@@ -217,7 +216,7 @@ typing-extensions==4.14.0
217216
# pydantic
218217
# pydantic-core
219218
# typing-inspection
220-
typing-inspection==0.4.0
219+
typing-inspection==0.4.1
221220
# via
222221
# -c requirements/_base.txt
223222
# pydantic

packages/celery-library/requirements/_tools.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ bump2version==1.0.1
88
# via -r requirements/../../../requirements/devenv.txt
99
cfgv==3.4.0
1010
# via pre-commit
11-
click==8.1.8
11+
click==8.2.1
1212
# via
1313
# -c requirements/_base.txt
1414
# -c requirements/_test.txt
@@ -20,7 +20,7 @@ distlib==0.3.9
2020
# via virtualenv
2121
filelock==3.18.0
2222
# via virtualenv
23-
identify==2.6.10
23+
identify==2.6.12
2424
# via pre-commit
2525
isort==6.0.1
2626
# via
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from collections.abc import AsyncIterator, Awaitable, Callable
2+
from functools import partial
3+
from typing import Final
4+
5+
import pytest
6+
from asgi_lifespan import LifespanManager
7+
from celery import Celery
8+
from celery.contrib.testing.worker import TestWorkController, start_worker
9+
from celery.signals import worker_init, worker_shutdown
10+
from celery.worker.worker import WorkController
11+
from celery_library import setup_celery_client
12+
from celery_library.routes.rpc import router as async_jobs_router
13+
from celery_library.signals import on_worker_init, on_worker_shutdown
14+
from celery_library.utils import get_celery_worker
15+
from celery_library.worker import CeleryTaskWorker
16+
from faker import Faker
17+
from fastapi import FastAPI
18+
from models_library.products import ProductName
19+
from models_library.rabbitmq_basic_types import RPCNamespace
20+
from models_library.users import UserID
21+
from pydantic import TypeAdapter
22+
from servicelib.rabbitmq import RabbitMQRPCClient
23+
from settings_library.celery import CelerySettings
24+
from settings_library.rabbit import RabbitSettings
25+
from settings_library.redis import RedisSettings
26+
27+
pytest_simcore_core_services_selection = [
28+
"rabbit",
29+
"redis",
30+
"postgres",
31+
]
32+
33+
pytest_plugins = [
34+
"pytest_simcore.docker_compose",
35+
"pytest_simcore.docker_swarm",
36+
"pytest_simcore.rabbit_service",
37+
"pytest_simcore.redis_service",
38+
"pytest_simcore.repository_paths",
39+
]
40+
41+
_LIFESPAN_TIMEOUT: Final[int] = 10
42+
43+
44+
@pytest.fixture
45+
def rpc_namespace() -> RPCNamespace:
46+
return TypeAdapter(RPCNamespace).validate_python("test")
47+
48+
49+
@pytest.fixture
50+
def celery_settings(
51+
rabbit_service: RabbitSettings,
52+
redis_service: RedisSettings,
53+
) -> CelerySettings:
54+
return CelerySettings.create_from_envs()
55+
56+
57+
@pytest.fixture
58+
async def initialized_fast_api(
59+
rabbitmq_rpc_client: Callable[[str], Awaitable[RabbitMQRPCClient]],
60+
celery_settings: CelerySettings,
61+
rpc_namespace: RPCNamespace,
62+
) -> AsyncIterator[FastAPI]:
63+
app = FastAPI(
64+
title="master_fastapi_app",
65+
description="Service that manages osparc storage backend",
66+
version="0.0.0",
67+
)
68+
69+
setup_celery_client(app, celery_settings=celery_settings)
70+
rpc_client = await rabbitmq_rpc_client("celery_test_client")
71+
app.state.rabbitmq_rpc_client = rpc_client
72+
73+
async def startup() -> None:
74+
rpc_server = app.state.rabbitmq_rpc_client
75+
assert isinstance(rpc_server, RabbitMQRPCClient)
76+
await rpc_server.register_router(async_jobs_router, rpc_namespace, app)
77+
78+
app.add_event_handler("startup", startup)
79+
80+
async with LifespanManager(
81+
app, startup_timeout=_LIFESPAN_TIMEOUT, shutdown_timeout=_LIFESPAN_TIMEOUT
82+
):
83+
yield app
84+
85+
86+
@pytest.fixture
87+
def register_celery_tasks() -> Callable[[Celery], None]:
88+
"""override if tasks are needed"""
89+
90+
def _(celery_app: Celery) -> None: ...
91+
92+
return _
93+
94+
95+
@pytest.fixture
96+
async def celery_worker_controller(
97+
celery_settings: CelerySettings,
98+
celery_app: Celery,
99+
register_celery_tasks: Callable[[Celery], None],
100+
) -> AsyncIterator[TestWorkController]:
101+
102+
def _create_app() -> FastAPI:
103+
104+
return FastAPI(
105+
title="worker_fastapi_app",
106+
description="Test application for celery_library",
107+
version="0.0.0",
108+
)
109+
110+
def _on_worker_init_wrapper(sender: WorkController, **_kwargs) -> None:
111+
return partial(on_worker_init, _create_app, celery_settings)(sender, **_kwargs)
112+
113+
worker_init.connect(_on_worker_init_wrapper)
114+
worker_shutdown.connect(on_worker_shutdown)
115+
116+
register_celery_tasks(celery_app)
117+
118+
with start_worker(
119+
celery_app,
120+
pool="threads",
121+
concurrency=1,
122+
loglevel="info",
123+
perform_ping_check=False,
124+
queues="default,cpu_bound",
125+
) as worker:
126+
yield worker
127+
128+
129+
@pytest.fixture
130+
def with_celery_worker(
131+
celery_worker_controller: TestWorkController,
132+
) -> CeleryTaskWorker:
133+
assert isinstance(celery_worker_controller.app, Celery)
134+
return get_celery_worker(celery_worker_controller.app)
135+
136+
137+
@pytest.fixture
138+
def user_id(faker: Faker) -> UserID:
139+
return TypeAdapter(UserID).validate_python(faker.pyint(min_value=1, max_value=1000))
140+
141+
142+
@pytest.fixture
143+
def product_name() -> ProductName:
144+
return TypeAdapter(ProductName).validate_python("pytest-product")

0 commit comments

Comments
 (0)