---

name: ♻️ 🧪

on:   # yamllint disable-line rule:truthy
  workflow_call:

env:
  devpi-password: abcd1234
  devpi-username: root
  devpi-port: 3141

  FORCE_COLOR: 1  # Request colored output from CLI tools supporting it
  MYPY_FORCE_COLOR: 1  # MyPy's color enforcement
  PIP_DISABLE_PIP_VERSION_CHECK: 1
  PIP_NO_PYTHON_VERSION_WARNING: 1
  PIP_NO_WARN_SCRIPT_LOCATION: 1
  PY_COLORS: 1  # Recognized by the `py` package, dependency of `pytest`
  TOX_PARALLEL_NO_SPINNER: 1
  TOX_TESTENV_PASSENV: >-  # Make tox-wrapped tools see color requests
    FORCE_COLOR
    MYPY_FORCE_COLOR
    NO_COLOR
    PY_COLORS
    PYTEST_THEME
    PYTEST_THEME_MODE

jobs:
  fail-fast:

    strategy:
      matrix:
        os: [macos-latest, windows-latest]

    runs-on: ${{ matrix.os }}

    timeout-minutes: 2

    steps:
    - name: Check out the action locally
      uses: actions/checkout@v4
      with:
        path: test
    - name: Fail-fast in unsupported environments
      continue-on-error: true
      id: fail-fast
      uses: ./test
    - name: Error if action did not fail-fast in unsupported environments
      if: steps.fail-fast.outcome == 'success'
      run: |
        >&2 echo This action should fail-fast in unsupported environments.
        exit 1

  smoke-test:

    strategy:
      matrix:
        os:
        - ubuntu-24.04
        - ubuntu-22.04

    runs-on: ${{ matrix.os }}

    services:
      devpi:
        image: muccg/devpi
        env:
          DEVPI_PASSWORD: ${{ env.devpi-password }}
        ports:
        - 3141

    timeout-minutes: 2

    steps:
    - name: Check out the action locally
      uses: actions/checkout@v4
      with:
        path: test
    - name: Install the packaging-related tools
      run: python3 -m pip install build twine
      env:
        PIP_CONSTRAINT: test/requirements/runtime.txt
    - name: Create the stub package importable directory
      run: mkdir -pv src/test_package
    - name: Populate the stub package `__init__.py`
      run: echo '__version__ = "0.1"' > src/test_package/__init__.py
    - name: Populate the stub package `README.md`
      run: echo "# Test Package" > README.md
    - name: Populate the stub package `pyproject.toml`
      run: echo "$CONTENTS" > pyproject.toml
      env:
        CONTENTS: |
          [build-system]
          requires = [
            "setuptools == 75.8.0",
          ]
          build-backend = "setuptools.build_meta"

          [project]
          name = "test-package"
          version = "0.1"
          readme = "README.md"
    - name: Build the stub package sdist and wheel distributions
      run: python3 -m build
    - name: Create the Rust package directory
      run: mkdir -pv rust-example
    - name: Initialize a Rust project
      run: cargo init
      working-directory: rust-example
    - name: Populate the Rust package `pyproject.toml`
      run: echo "$CONTENTS" > pyproject.toml
      env:
        CONTENTS: |
          [build-system]
          requires = [
            "maturin ~=1.0",
          ]
          build-backend = "maturin"
      working-directory: rust-example
    - name: Build the stub package sdist and wheel distributions
      run: python3 -m build -o ../dist/
      working-directory: rust-example
    - name: Register the stub package in devpi
      run: |
        for dist in dist/*.tar.gz
        do
          echo "Registering ${dist}..."
          twine register "${dist}"
        done
      env:
        TWINE_USERNAME: ${{ env.devpi-username }}
        TWINE_PASSWORD: ${{ env.devpi-password }}
        TWINE_REPOSITORY_URL: >-
          http://localhost:${{
            job.services.devpi.ports[env.devpi-port]
          }}/${{
            env.devpi-username
          }}/public/
    - name: ✅ Smoke-test the locally checked out action
      uses: ./test
      env:
        DEBUG: >-
          true
        PATH: utter-nonsense
      with:
        user: ${{ env.devpi-username }}
        password: ${{ env.devpi-password }}
        repository-url: >-
          http://devpi:${{ env.devpi-port }}/${{ env.devpi-username }}/public/

...