*Note*: Before submitting this pull request, please review our [contributing
guidelines](https://docs.celeryq.dev/en/main/contributing.html).

## Description

<!-- Please describe your pull request.

NOTE: All patches should be made against main, not a maintenance branch like
3.1, 2.5, etc.  That is unless the bug is already fixed in main, but not in
that version series.

If it fixes a bug or resolves a feature request,
be sure to link to that issue via (Fixes #4412) for example.
-->

Fixes #8499.  The `isoparse` from dateutil is more correct about what it supports, handling the 'Z' timezone as well, which earlier versions of Python didn't support.  

I'm not 100% sure where the user is providing the eta as a string to, since apply_async notes it to be a datetime.  If someone can point me to that and a simple test case, I'll add some additional date strings there to catch this in the future.

Replaces datetime.fromisoformat with the more lenient dateutil parser. *Note*: Before submitting this pull request, please review our [contributing
guidelines](https://docs.celeryq.dev/en/main/contributing.html).

## Description

<!-- Please describe your pull request.

NOTE: All patches should be made against main, not a maintenance branch like
3.1, 2.5, etc.  That is unless the bug is already fixed in main, but not in
that version series.

If it fixes a bug or resolves a feature request,
be sure to link to that issue via (Fixes #4412) for example.
-->

Fixes #8499.  The `isoparse` from dateutil is more correct about what it supports, handling the 'Z' timezone as well, which earlier versions of Python didn't support.  

I'm not 100% sure where the user is providing the eta as a string to, since apply_async notes it to be a datetime.  If someone can point me to that and a simple test case, I'll add some additional date strings there to catch this in the future.

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: Celery

on:
  push:
    branches: [ 'main']
    paths:
        - '**.py'
        - '**.txt'
        - '.github/workflows/python-package.yml'
        - '**.toml'
  pull_request:
    branches: [ 'main']
    paths:
        - '**.py'
        - '**.txt'
        - '**.toml'
        - '.github/workflows/python-package.yml'

permissions:
  contents: read # to fetch code (actions/checkout)

jobs:
  Unit:

    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.8', '3.9', '3.10', '3.11', 'pypy-3.9', 'pypy-3.10']
        os: ["ubuntu-latest", "windows-latest"]
        exclude:
            - python-version: 'pypy-3.9'
              os: "windows-latest"
            - python-version: 'pypy-3.10'
              os: "windows-latest"
            
    steps:
    - name: Install apt packages
      if: startsWith(matrix.os, 'ubuntu-')
      run: |
        sudo apt-get update && sudo apt-get install -f libcurl4-openssl-dev libssl-dev libgnutls28-dev httping expect libmemcached-dev
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
        cache: 'pip'
        cache-dependency-path: '**/setup.py'

    - name: Install tox
      run: python -m pip install --upgrade pip 'tox' tox-gh-actions
    - name: >
        Run tox for
        "${{ matrix.python-version }}-unit"
      timeout-minutes: 30
      run: |
        tox --verbose --verbose

    - uses: codecov/codecov-action@v3
      with:
        flags: unittests # optional
        fail_ci_if_error: true # optional (default = false)
        verbose: true # optional (default = false)

  Integration:
      needs:
      - Unit
      if: needs.Unit.result == 'success'
      timeout-minutes: 240

      runs-on: ubuntu-latest
      strategy:
          fail-fast: false
          matrix:
              python-version: ['3.8', '3.9', '3.10', '3.11']
              toxenv: ['redis', 'rabbitmq', 'rabbitmq_redis']

      services:
          redis:
              image: redis
              ports:
                  - 6379:6379
              env:
                  REDIS_HOST: localhost
                  REDIS_PORT: 6379
          rabbitmq:
              image: rabbitmq
              ports:
                  - 5672:5672
              env:
                  RABBITMQ_DEFAULT_USER: guest
                  RABBITMQ_DEFAULT_PASS: guest

      steps:
          -   name: Install apt packages
              run: |
                  sudo apt-get update && sudo apt-get install -f libcurl4-openssl-dev libssl-dev libgnutls28-dev httping expect libmemcached-dev

          -   uses: actions/checkout@v4
          -   name: Set up Python ${{ matrix.python-version }}
              uses: actions/setup-python@v4
              with:
                  python-version: ${{ matrix.python-version }}
                  cache: 'pip'
                  cache-dependency-path: '**/setup.py'
          -   name: Install tox
              run: python -m pip install --upgrade pip 'tox' tox-gh-actions
          -   name: >
                  Run tox for
                  "${{ matrix.python-version }}-integration-${{ matrix.toxenv }}"
              timeout-minutes: 60
              run: >
                  tox --verbose --verbose -e
                  "${{ matrix.python-version }}-integration-${{ matrix.toxenv }}" -vv

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: Celery

on:
  push:
    branches: [ 'main']
    paths:
        - '**.py'
        - '**.txt'
        - '.github/workflows/python-package.yml'
        - '**.toml'
  pull_request:
    branches: [ 'main']
    paths:
        - '**.py'
        - '**.txt'
        - '**.toml'
        - '.github/workflows/python-package.yml'

permissions:
  contents: read # to fetch code (actions/checkout)

jobs:
  Unit:

    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.8', '3.9', '3.10', '3.11', 'pypy-3.9', 'pypy-3.10']
        os: ["ubuntu-latest", "windows-latest"]
        exclude:
            - python-version: 'pypy-3.9'
              os: "windows-latest"
            - python-version: 'pypy-3.10'
              os: "windows-latest"

    steps:
    - name: Install apt packages
      if: startsWith(matrix.os, 'ubuntu-')
      run: |
        sudo apt-get update && sudo apt-get install -f libcurl4-openssl-dev libssl-dev libgnutls28-dev httping expect libmemcached-dev
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
        cache: 'pip'
        cache-dependency-path: '**/setup.py'

    - name: Install tox
      run: python -m pip install --upgrade pip 'tox' tox-gh-actions
    - name: >
        Run tox for
        "${{ matrix.python-version }}-unit"
      timeout-minutes: 30
      run: |
        tox --verbose --verbose

    - uses: codecov/codecov-action@v3
      with:
        flags: unittests # optional
        fail_ci_if_error: true # optional (default = false)
        verbose: true # optional (default = false)

  Integration:
      needs:
      - Unit
      if: needs.Unit.result == 'success'
      timeout-minutes: 240

      runs-on: ubuntu-latest
      strategy:
          fail-fast: false
          matrix:
              python-version: ['3.8', '3.9', '3.10', '3.11']
              toxenv: ['redis', 'rabbitmq', 'rabbitmq_redis']

      services:
          redis:
              image: redis
              ports:
                  - 6379:6379
              env:
                  REDIS_HOST: localhost
                  REDIS_PORT: 6379
          rabbitmq:
              image: rabbitmq
              ports:
                  - 5672:5672
              env:
                  RABBITMQ_DEFAULT_USER: guest
                  RABBITMQ_DEFAULT_PASS: guest

      steps:
          -   name: Install apt packages
              run: |
                  sudo apt-get update && sudo apt-get install -f libcurl4-openssl-dev libssl-dev libgnutls28-dev httping expect libmemcached-dev

          -   uses: actions/checkout@v4
          -   name: Set up Python ${{ matrix.python-version }}
              uses: actions/setup-python@v4
              with:
                  python-version: ${{ matrix.python-version }}
                  cache: 'pip'
                  cache-dependency-path: '**/setup.py'
          -   name: Install tox
              run: python -m pip install --upgrade pip 'tox' tox-gh-actions
          -   name: >
                  Run tox for
                  "${{ matrix.python-version }}-integration-${{ matrix.toxenv }}"
              timeout-minutes: 60
              run: >
                  tox --verbose --verbose -e
                  "${{ matrix.python-version }}-integration-${{ matrix.toxenv }}" -vv
