Skip to content

Commit fabfe66

Browse files
authored
Added examples/range (celery#169)
1 parent 9269dee commit fabfe66

File tree

7 files changed

+152
-0
lines changed

7 files changed

+152
-0
lines changed

.github/workflows/examples.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,39 @@ jobs:
5555
run: |
5656
pytest -vv tests -n auto
5757
58+
range:
59+
runs-on: ${{ matrix.os }}
60+
61+
strategy:
62+
fail-fast: false
63+
matrix:
64+
python-version: ["3.12"]
65+
os: ["ubuntu-latest"]
66+
67+
steps:
68+
- name: Install apt packages
69+
if: startsWith(matrix.os, 'ubuntu-')
70+
run: |
71+
sudo apt update
72+
- uses: actions/checkout@v4
73+
- name: Set up Python ${{ matrix.python-version }}
74+
uses: actions/setup-python@v5
75+
with:
76+
python-version: ${{ matrix.python-version }}
77+
cache: 'pip'
78+
cache-dependency-path: '**/setup.py'
79+
- name: Install dependencies
80+
working-directory: examples/range
81+
run: |
82+
python -m pip install --upgrade pip
83+
pip install -r requirements.txt
84+
85+
- name: Run tests
86+
working-directory: examples/range
87+
timeout-minutes: 5
88+
run: |
89+
pytest -vv tests -n auto
90+
5891
django:
5992
runs-on: ${{ matrix.os }}
6093

examples/range/pytest.ini

Whitespace-only changes.

examples/range/requirements.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pytest>=7.4.4
2+
# pytest-celery>=1.0.0
3+
git+https://github.com/celery/pytest-celery.git
4+
pytest-xdist>=3.5.0
5+
pytest-subtests>=0.11.0

examples/range/tests/__init__.py

Whitespace-only changes.

examples/range/tests/conftest.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from __future__ import annotations
2+
3+
import requests
4+
from packaging.version import parse as parse_version
5+
6+
7+
def get_celery_versions(start_version: str, end_version: str) -> list[str]:
8+
url = "https://pypi.org/pypi/celery/json"
9+
response = requests.get(url)
10+
data = response.json()
11+
all_versions = data["releases"].keys()
12+
13+
filtered_versions = [
14+
v
15+
for v in all_versions
16+
if (
17+
parse_version(start_version) <= parse_version(v) <= parse_version(end_version)
18+
and not parse_version(v).is_prerelease
19+
)
20+
]
21+
22+
return sorted(filtered_versions, key=parse_version)

examples/range/tests/test_range.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import pytest
2+
from celery.canvas import Signature
3+
from celery.result import AsyncResult
4+
5+
from pytest_celery import RESULT_TIMEOUT
6+
from pytest_celery import CeleryTestSetup
7+
from pytest_celery import ping
8+
from tests.conftest import get_celery_versions
9+
10+
11+
class TestRange:
12+
@pytest.fixture(scope="session", params=get_celery_versions("v4.4.7", "v5.0.0"))
13+
def celery_version(self, request: pytest.FixtureRequest) -> str:
14+
return request.param
15+
16+
def test_ping(self, celery_setup: CeleryTestSetup, celery_version: str):
17+
sig: Signature = ping.s()
18+
res: AsyncResult = sig.apply_async()
19+
assert res.get(timeout=RESULT_TIMEOUT) == "pong"
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import pytest
2+
from pytest_docker_tools import build
3+
from pytest_docker_tools import container
4+
from pytest_docker_tools import fxtr
5+
6+
from pytest_celery import DEFAULT_WORKER_CONTAINER_TIMEOUT
7+
from pytest_celery import DEFAULT_WORKER_VOLUME
8+
from pytest_celery import WORKER_DOCKERFILE_ROOTDIR
9+
from pytest_celery import CeleryTestSetup
10+
from pytest_celery import CeleryTestWorker
11+
from pytest_celery import CeleryWorkerCluster
12+
from pytest_celery import CeleryWorkerContainer
13+
from tests.conftest import get_celery_versions
14+
15+
versions_range = get_celery_versions("v5.0.0", "v5.0.5")
16+
versions_list = ["v4.4.7", "v5.2.7", "v5.3.0"]
17+
18+
19+
def generate_workers(versions: list[str]) -> list[str]:
20+
worker_containers = list()
21+
for v in versions:
22+
img = f"worker_v{v.replace('.', '_')}_image"
23+
globals()[img] = build(
24+
path=WORKER_DOCKERFILE_ROOTDIR,
25+
tag=f"pytest-celery/examples/worker:v{v}",
26+
buildargs={
27+
"CELERY_VERSION": v,
28+
"CELERY_LOG_LEVEL": fxtr("default_worker_celery_log_level"),
29+
"CELERY_WORKER_NAME": fxtr("default_worker_celery_worker_name"),
30+
"CELERY_WORKER_QUEUE": fxtr("default_worker_celery_worker_queue"),
31+
},
32+
)
33+
cnt = f"worker_v{v.replace('.', '_')}_container"
34+
globals()[cnt] = container(
35+
image="{" + f"{img}.id" + "}",
36+
environment=fxtr("default_worker_env"),
37+
network="{default_pytest_celery_network.name}",
38+
volumes={"{default_worker_volume.name}": DEFAULT_WORKER_VOLUME},
39+
wrapper_class=CeleryWorkerContainer,
40+
timeout=DEFAULT_WORKER_CONTAINER_TIMEOUT,
41+
)
42+
worker_containers.append(cnt)
43+
return worker_containers
44+
45+
46+
class TestClusterList:
47+
@pytest.fixture(params=[generate_workers(versions_list)])
48+
def celery_worker_cluster(self, request: pytest.FixtureRequest) -> CeleryWorkerCluster:
49+
nodes: list[CeleryWorkerContainer] = [request.getfixturevalue(worker) for worker in request.param]
50+
cluster = CeleryWorkerCluster(*nodes)
51+
yield cluster
52+
cluster.teardown()
53+
54+
def test_worker_cluster_with_fixed_list(self, celery_setup: CeleryTestSetup, subtests):
55+
worker: CeleryTestWorker
56+
for version, worker in zip(versions_list, celery_setup.worker_cluster):
57+
with subtests.test(msg=f"Found worker {version} in cluster"):
58+
assert f"{worker.hostname()} {version}" in worker.logs()
59+
60+
61+
class TestClusterRange:
62+
@pytest.fixture(params=[generate_workers(versions_range)])
63+
def celery_worker_cluster(self, request: pytest.FixtureRequest) -> CeleryWorkerCluster:
64+
nodes: list[CeleryWorkerContainer] = [request.getfixturevalue(worker) for worker in request.param]
65+
cluster = CeleryWorkerCluster(*nodes)
66+
yield cluster
67+
cluster.teardown()
68+
69+
def test_worker_cluster_with_versions_range(self, celery_setup: CeleryTestSetup, subtests):
70+
worker: CeleryTestWorker
71+
for version, worker in zip(versions_range, celery_setup.worker_cluster):
72+
with subtests.test(msg=f"Found worker v{version} in cluster"):
73+
assert f"{worker.hostname()} v{version}" in worker.logs()

0 commit comments

Comments
 (0)