name: Test invoke.py pip
on:
  push:
    branches:
      - 'main'
    paths:
      - 'pyproject.toml'
      - 'invokeai/**'
      - '!invokeai/frontend/web/**'
  pull_request:
    paths:
      - 'pyproject.toml'
      - 'invokeai/**'
      - '!invokeai/frontend/web/**'
    types:
      - 'ready_for_review'
      - 'opened'
      - 'synchronize'
  merge_group:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  matrix:
    if: github.event.pull_request.draft == false
    strategy:
      matrix:
        python-version:
          # - '3.9'
          - '3.10'
        pytorch:
          # - linux-cuda-11_6
          - linux-cuda-11_7
          - linux-rocm-5_2
          - linux-cpu
          - macos-default
          - windows-cpu
          # - windows-cuda-11_6
          # - windows-cuda-11_7
        include:
          # - pytorch: linux-cuda-11_6
          #   os: ubuntu-22.04
          #   extra-index-url: 'https://download.pytorch.org/whl/cu116'
          #   github-env: $GITHUB_ENV
          - pytorch: linux-cuda-11_7
            os: ubuntu-22.04
            github-env: $GITHUB_ENV
          - pytorch: linux-rocm-5_2
            os: ubuntu-22.04
            extra-index-url: 'https://download.pytorch.org/whl/rocm5.2'
            github-env: $GITHUB_ENV
          - pytorch: linux-cpu
            os: ubuntu-22.04
            extra-index-url: 'https://download.pytorch.org/whl/cpu'
            github-env: $GITHUB_ENV
          - pytorch: macos-default
            os: macOS-12
            github-env: $GITHUB_ENV
          - pytorch: windows-cpu
            os: windows-2022
            github-env: $env:GITHUB_ENV
          # - pytorch: windows-cuda-11_6
          #   os: windows-2022
          #   extra-index-url: 'https://download.pytorch.org/whl/cu116'
          #   github-env: $env:GITHUB_ENV
          # - pytorch: windows-cuda-11_7
          #   os: windows-2022
          #   extra-index-url: 'https://download.pytorch.org/whl/cu117'
          #   github-env: $env:GITHUB_ENV
    name: ${{ matrix.pytorch }} on ${{ matrix.python-version }}
    runs-on: ${{ matrix.os }}
    env:
      PIP_USE_PEP517: '1'
    steps:
      - name: Checkout sources
        id: checkout-sources
        uses: actions/checkout@v3

      - name: set test prompt to main branch validation
        run: echo "TEST_PROMPTS=tests/validate_pr_prompt.txt" >> ${{ matrix.github-env }}

      - name: setup python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
          cache: pip
          cache-dependency-path: pyproject.toml

      - name: install invokeai
        env:
          PIP_EXTRA_INDEX_URL: ${{ matrix.extra-index-url }}
        run: >
          pip3 install
          --editable=".[test]"

      - name: run pytest
        id: run-pytest
        run: pytest

      - name: run invokeai-configure
        id: run-preload-models
        env:
          HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGINGFACE_TOKEN }}
        run: >
          invokeai-configure
          --yes
          --default_only
          --full-precision
        # can't use fp16 weights without a GPU

      - name: run invokeai
        id: run-invokeai
        env:
          # Set offline mode to make sure configure preloaded successfully.
          HF_HUB_OFFLINE: 1
          HF_DATASETS_OFFLINE: 1
          TRANSFORMERS_OFFLINE: 1
          INVOKEAI_OUTDIR: ${{ github.workspace }}/results
        run: >
          invokeai
          --no-patchmatch
          --no-nsfw_checker
          --precision=float32
          --always_use_cpu
          --use_memory_db
          --outdir ${{ env.INVOKEAI_OUTDIR }}/${{ matrix.python-version }}/${{ matrix.pytorch }}
          --from_file ${{ env.TEST_PROMPTS }}

      - name: Archive results
        id: archive-results
        env:
          INVOKEAI_OUTDIR: ${{ github.workspace }}/results
        uses: actions/upload-artifact@v3
        with:
          name: results
          path: ${{ env.INVOKEAI_OUTDIR }}