# If any test fails, the engine team should ensure the "breaking" changes are expected and contact the integration team
name: SDKs tests

on:
  workflow_dispatch:
    inputs:
      docker_image:
        description: 'The Meilisearch Docker image used'
        required: false
        default: nightly
  schedule:
    - cron: "0 6 * * MON" # Every Monday at 6:00AM

env:
  MEILI_MASTER_KEY: 'masterKey'
  MEILI_NO_ANALYTICS: 'true'

jobs:
  define-docker-image:
    runs-on: ubuntu-latest
    outputs:
      docker-image: ${{ steps.define-image.outputs.docker-image }}
    steps:
      - uses: actions/checkout@v3
      - name: Define the Docker image we need to use
        id: define-image
        run: |
          event=${{ github.event_name }}
          echo "docker-image=nightly" >> $GITHUB_OUTPUT
          if [[ $event == 'workflow_dispatch' ]]; then
            echo "docker-image=${{ github.event.inputs.docker_image }}" >> $GITHUB_OUTPUT
          fi

  meilisearch-js-tests:
    needs: define-docker-image
    name: JS SDK tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/meilisearch-js
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          cache: 'yarn'
      - name: Install dependencies
        run: yarn --dev
      - name: Run tests
        run: yarn test
      - name: Build project
        run: yarn build
      - name: Run ESM env
        run: yarn test:env:esm
      - name: Run Node.js env
        run: yarn test:env:nodejs
      - name: Run node typescript env
        run: yarn test:env:node-ts
      - name: Run Browser env
        run: yarn test:env:browser

  instant-meilisearch-tests:
    needs: define-docker-image
    name: instant-meilisearch tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/instant-meilisearch
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          cache: yarn
      - name: Install dependencies
        run: yarn install
      - name: Run tests
        run: yarn test
      - name: Build all the playgrounds and the packages
        run: yarn build

  meilisearch-php-tests:
    needs: define-docker-image
    name: PHP SDK tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/meilisearch-php
      - name: Install PHP
        uses: shivammathur/setup-php@v2
        with:
          coverage: none
      - name: Validate composer.json and composer.lock
        run: composer validate
      - name: Install dependencies
        run: |
          composer remove --dev friendsofphp/php-cs-fixer --no-update --no-interaction
          composer update --prefer-dist --no-progress
      - name: Run test suite - default HTTP client (Guzzle 7)
        run: |
          sh scripts/tests.sh
          composer remove --dev guzzlehttp/guzzle http-interop/http-factory-guzzle

  meilisearch-python-tests:
    needs: define-docker-image
    name: Python SDK tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/meilisearch-python
      - name: Set up Python
        uses: actions/setup-python@v4
      - name: Install pipenv
        uses: dschep/install-pipenv-action@v1
      - name: Install dependencies
        run: pipenv install --dev --python=${{ matrix.python-version }}
      - name: Test with pytest
        run: pipenv run pytest

  meilisearch-go-tests:
    needs: define-docker-image
    name: Go SDK tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: stable
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/meilisearch-go
      - name: Get dependencies
        run: |
          go get -v -t -d ./...
          if [ -f Gopkg.toml ]; then
            curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
            dep ensure
          fi
      - name: Run integration tests
        run: go test -v ./...

  meilisearch-ruby-tests:
    needs: define-docker-image
    name: Ruby SDK tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/meilisearch-ruby
      - name: Set up Ruby 3
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3
      - name: Install ruby dependencies
        run: bundle install --with test
      - name: Run test suite
        run: bundle exec rspec

  meilisearch-rust-tests:
    needs: define-docker-image
    name: Rust SDK tests
    runs-on: ubuntu-latest
    services:
      meilisearch:
        image: getmeili/meilisearch:${{ needs.define-docker-image.outputs.docker-image }}
        env:
          MEILI_MASTER_KEY: ${{ env.MEILI_MASTER_KEY }}
          MEILI_NO_ANALYTICS: ${{ env.MEILI_NO_ANALYTICS }}
        ports:
          - '7700:7700'
    steps:
      - uses: actions/checkout@v3
        with:
          repository: meilisearch/meilisearch-rust
      - name: Build
        run: cargo build --verbose
      - name: Run tests
        run: cargo test --verbose