# 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'
  DISABLE_COVERAGE: 'true'

jobs:
  define-docker-image:
    runs-on: ubuntu-latest
    outputs:
      docker-image: ${{ steps.define-image.outputs.docker-image }}
    steps:
      - uses: actions/checkout@v4
      - 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
      - name: Docker image is ${{ steps.define-image.outputs.docker-image }}
        run: echo "Docker image is ${{ steps.define-image.outputs.docker-image }}"

##########
## SDKs ##
##########

  meilisearch-dotnet-tests:
    needs: define-docker-image
    name: .NET SDK tests
    runs-on: ubuntu-latest
    env:
      MEILISEARCH_VERSION: ${{ needs.define-docker-image.outputs.docker-image }}

    steps:
      - uses: actions/checkout@v4
        with:
          repository: meilisearch/meilisearch-dotnet
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: "6.0.x"
      - name: Install dependencies
        run: dotnet restore
      - name: Build
        run: dotnet build --configuration Release --no-restore
      - name: Meilisearch (latest version) setup with Docker
        run: docker compose up -d
      - name: Run tests
        run: dotnet test --no-restore --verbosity normal

  meilisearch-dart-tests:
    needs: define-docker-image
    name: Dart 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@v4
        with:
          repository: meilisearch/meilisearch-dart
      - uses: dart-lang/setup-dart@v1
        with:
          sdk: 'latest'
      - name: Install dependencies
        run: dart pub get
      - name: Run integration tests
        run: dart test --concurrency=4

  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@v5
        with:
          go-version: stable
      - uses: actions/checkout@v4
        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-java-tests:
    needs: define-docker-image
    name: Java 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@v4
        with:
          repository: meilisearch/meilisearch-java
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: 8
          distribution: 'zulu'
          cache: gradle
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      - name: Build and run unit and integration tests
        run: ./gradlew build integrationTest

  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@v4
        with:
          repository: meilisearch/meilisearch-js
      - name: Setup node
        uses: actions/setup-node@v4
        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

  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@v4
        with:
          repository: meilisearch/meilisearch-php
      - name: Install PHP
        uses: shivammathur/setup-php@v2
      - 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@v4
        with:
          repository: meilisearch/meilisearch-python
      - name: Set up Python
        uses: actions/setup-python@v5
      - 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-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@v4
        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@v4
        with:
          repository: meilisearch/meilisearch-rust
      - name: Build
        run: cargo build --verbose
      - name: Run tests
        run: cargo test --verbose

  meilisearch-swift-tests:
    needs: define-docker-image
    name: Swift 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@v4
        with:
          repository: meilisearch/meilisearch-swift
      - name: Run tests
        run: swift test

########################
## FRONT-END PLUGINS ##
########################

  meilisearch-js-plugins-tests:
    needs: define-docker-image
    name: meilisearch-js-plugins 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@v4
        with:
          repository: meilisearch/meilisearch-js-plugins
      - name: Setup node
        uses: actions/setup-node@v4
        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

########################
## BACK-END PLUGINS ###
########################

  meilisearch-rails-tests:
    needs: define-docker-image
    name: meilisearch-rails 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@v4
        with:
          repository: meilisearch/meilisearch-rails
      - name: Set up Ruby 3
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3
          bundler-cache: true
      - name: Run tests
        run: bundle exec rspec

  meilisearch-symfony-tests:
    needs: define-docker-image
    name: meilisearch-symfony 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@v4
        with:
          repository: meilisearch/meilisearch-symfony
      - name: Install PHP
        uses: shivammathur/setup-php@v2
        with:
          tools: composer:v2, flex
      - name: Validate composer.json and composer.lock
        run: composer validate
      - name: Install dependencies
        run: composer install --prefer-dist --no-progress --quiet
      - name: Remove doctrine/annotations
        run: composer remove --dev doctrine/annotations
      - name: Run test suite
        run: composer test:unit