Tox has [released 4.9.0](https://github.com/tox-dev/tox/releases/tag/4.9.0) which fixed a bug where non existing environments did NOT fail, so since tox 4.9.0 they now DO fail: https://github.com/tox-dev/tox/issues/2858

We are relying on the previous behavior (the bugged one) so until we can fix it, I'm limiting tox as it breaks every PR right now which is worse than the limitation itself (which is not recommended).

We need to fix this soon so we can remove this limitation @auvipy @thedrow 
Limit tox to < 4.9. Tox has [released 4.9.0](https://github.com/tox-dev/tox/releases/tag/4.9.0) which fixed a bug where non existing environments did NOT fail, so since tox 4.9.0 they now DO fail: https://github.com/tox-dev/tox/issues/2858

We are relying on the previous behavior (the bugged one) so until we can fix it, I'm limiting tox as it breaks every PR right now which is worse than the limitation itself (which is not recommended).

We need to fix this soon so we can remove this limitation @auvipy @thedrow 
[tox]
requires =
    tox-gh-actions
envlist =
    {3.8,3.9,3.10,3.11,pypy3}-unit
    {3.8,3.9,3.10,3.11,pypy3}-integration-{rabbitmq_redis,rabbitmq,redis,dynamodb,azureblockblob,cache,cassandra,elasticsearch}

    flake8
    apicheck
    configcheck
    bandit


[gh-actions]
python =
    3.8: 3.8-unit
    3.9: 3.9-unit
    3.10: 3.10-unit
    3.11: 3.11-unit
    pypy-3: pypy3-unit

[testenv]
sitepackages = False
recreate = False
passenv =
    AZUREBLOCKBLOB_URL

deps=
    -r{toxinidir}/requirements/test.txt
    -r{toxinidir}/requirements/pkgutils.txt

    3.8,3.9,3.10,3.11: -r{toxinidir}/requirements/test-ci-default.txt
    3.8,3.9,3.10,3.11: -r{toxinidir}/requirements/docs.txt
    pypy3: -r{toxinidir}/requirements/test-ci-default.txt

    integration: -r{toxinidir}/requirements/test-integration.txt

    linkcheck,apicheck,configcheck: -r{toxinidir}/requirements/docs.txt
    lint: pre-commit
    bandit: bandit

commands =
    unit: pytest --maxfail=10 --capture=no -v --cov=celery --cov-report=xml --cov-report term {posargs}
    integration: pytest -xsv t/integration {posargs}
setenv =
    PIP_EXTRA_INDEX_URL=https://celery.github.io/celery-wheelhouse/repo/simple/
    BOTO_CONFIG = /dev/null
    WORKER_LOGLEVEL = INFO
    PYTHONIOENCODING = UTF-8

    cache: TEST_BROKER=redis://
    cache: TEST_BACKEND=cache+pylibmc://

    cassandra: TEST_BROKER=redis://
    cassandra: TEST_BACKEND=cassandra://

    elasticsearch: TEST_BROKER=redis://
    elasticsearch: TEST_BACKEND=elasticsearch://@localhost:9200

    rabbitmq: TEST_BROKER=pyamqp://
    rabbitmq: TEST_BACKEND=rpc

    redis: TEST_BROKER=redis://
    redis: TEST_BACKEND=redis://

    rabbitmq_redis: TEST_BROKER=pyamqp://
    rabbitmq_redis: TEST_BACKEND=redis://

    dynamodb: TEST_BROKER=redis://
    dynamodb: TEST_BACKEND=dynamodb://@localhost:8000
    dynamodb: AWS_ACCESS_KEY_ID=test_aws_key_id
    dynamodb: AWS_SECRET_ACCESS_KEY=test_aws_secret_key

    azureblockblob: TEST_BROKER=redis://
    azureblockblob: TEST_BACKEND=azureblockblob://DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;

basepython =
    3.8: python3.8
    3.9: python3.9
    3.10: python3.10
    3.11: python3.11
    pypy3: pypy3
    mypy: python3.8
    lint,apicheck,linkcheck,configcheck,bandit: python3.9
usedevelop = True

[testenv:mypy]
commands = python -m mypy --config-file pyproject.toml

[testenv:apicheck]
setenv =
    PYTHONHASHSEED = 100
commands =
    sphinx-build -j2 -b apicheck -d {envtmpdir}/doctrees docs docs/_build/apicheck

[testenv:configcheck]
commands =
    sphinx-build -j2 -b configcheck -d {envtmpdir}/doctrees docs docs/_build/configcheck

[testenv:linkcheck]
commands =
    sphinx-build -j2 -b linkcheck -d {envtmpdir}/doctrees docs docs/_build/linkcheck

[testenv:bandit]
commands =
    bandit -b bandit.json -r celery/

[testenv:lint]
commands =
    pre-commit {posargs:run --all-files --show-diff-on-failure}

[tox]
requires =
    tox<4.9
    tox-gh-actions
envlist =
    {3.8,3.9,3.10,3.11,pypy3}-unit
    {3.8,3.9,3.10,3.11,pypy3}-integration-{rabbitmq_redis,rabbitmq,redis,dynamodb,azureblockblob,cache,cassandra,elasticsearch}

    flake8
    apicheck
    configcheck
    bandit


[gh-actions]
python =
    3.8: 3.8-unit
    3.9: 3.9-unit
    3.10: 3.10-unit
    3.11: 3.11-unit
    pypy-3: pypy3-unit

[testenv]
sitepackages = False
recreate = False
passenv =
    AZUREBLOCKBLOB_URL

deps=
    -r{toxinidir}/requirements/test.txt
    -r{toxinidir}/requirements/pkgutils.txt

    3.8,3.9,3.10,3.11: -r{toxinidir}/requirements/test-ci-default.txt
    3.8,3.9,3.10,3.11: -r{toxinidir}/requirements/docs.txt
    pypy3: -r{toxinidir}/requirements/test-ci-default.txt

    integration: -r{toxinidir}/requirements/test-integration.txt

    linkcheck,apicheck,configcheck: -r{toxinidir}/requirements/docs.txt
    lint: pre-commit
    bandit: bandit

commands =
    unit: pytest --maxfail=10 --capture=no -v --cov=celery --cov-report=xml --cov-report term {posargs}
    integration: pytest -xsv t/integration {posargs}
setenv =
    PIP_EXTRA_INDEX_URL=https://celery.github.io/celery-wheelhouse/repo/simple/
    BOTO_CONFIG = /dev/null
    WORKER_LOGLEVEL = INFO
    PYTHONIOENCODING = UTF-8

    cache: TEST_BROKER=redis://
    cache: TEST_BACKEND=cache+pylibmc://

    cassandra: TEST_BROKER=redis://
    cassandra: TEST_BACKEND=cassandra://

    elasticsearch: TEST_BROKER=redis://
    elasticsearch: TEST_BACKEND=elasticsearch://@localhost:9200

    rabbitmq: TEST_BROKER=pyamqp://
    rabbitmq: TEST_BACKEND=rpc

    redis: TEST_BROKER=redis://
    redis: TEST_BACKEND=redis://

    rabbitmq_redis: TEST_BROKER=pyamqp://
    rabbitmq_redis: TEST_BACKEND=redis://

    dynamodb: TEST_BROKER=redis://
    dynamodb: TEST_BACKEND=dynamodb://@localhost:8000
    dynamodb: AWS_ACCESS_KEY_ID=test_aws_key_id
    dynamodb: AWS_SECRET_ACCESS_KEY=test_aws_secret_key

    azureblockblob: TEST_BROKER=redis://
    azureblockblob: TEST_BACKEND=azureblockblob://DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;

basepython =
    3.8: python3.8
    3.9: python3.9
    3.10: python3.10
    3.11: python3.11
    pypy3: pypy3
    mypy: python3.8
    lint,apicheck,linkcheck,configcheck,bandit: python3.9
usedevelop = True

[testenv:mypy]
commands = python -m mypy --config-file pyproject.toml

[testenv:apicheck]
setenv =
    PYTHONHASHSEED = 100
commands =
    sphinx-build -j2 -b apicheck -d {envtmpdir}/doctrees docs docs/_build/apicheck

[testenv:configcheck]
commands =
    sphinx-build -j2 -b configcheck -d {envtmpdir}/doctrees docs docs/_build/configcheck

[testenv:linkcheck]
commands =
    sphinx-build -j2 -b linkcheck -d {envtmpdir}/doctrees docs docs/_build/linkcheck

[testenv:bandit]
commands =
    bandit -b bandit.json -r celery/

[testenv:lint]
commands =
    pre-commit {posargs:run --all-files --show-diff-on-failure}
