name: Test Bats Windows

on:
  workflow_dispatch:
    inputs:
      email:
        description: 'Email address to receive bats failure notification'
        required: true
        default: ''
  repository_dispatch:
    types: [ bats-windows ]

jobs:
  get-files:
    name: Get file list
    runs-on: ubuntu-22.04
    outputs:
      files: ${{ steps.get_file_list.outputs.files }}
    steps:
      - uses: actions/checkout@v4
        if: ${{ github.event_name == 'repository_dispatch' }}
        with:
          ref: ${{ github.event.client_payload.ref }}
      - uses: actions/checkout@v4
        if: ${{ github.event_name == 'workflow_dispatch' }}
      - name: Get file list
        id: get_file_list
        run: |
          files=$(ls *.bats)

          SAVEIFS=$IFS
          IFS=$'\n'

          file_arr=($files)
          echo "files=${file_arr[@]}" >> $GITHUB_OUTPUT

          IFS=$SAVEIFS
        working-directory: ./integration-tests/bats
  format-files-output:
    name: Format files output
    runs-on: ubuntu-22.04
    needs: get-files
    outputs:
      files: ${{ steps.format_files.outputs.files }}
    steps:
      - name: Format
        id: format_files
        uses: actions/github-script@v7
        env:
          FILES: ${{ needs.get-files.outputs.files }}
        with:
          debug: true
          github-token: ${{ secrets.REPO_ACCESS_TOKEN || secrets.GITHUB_TOKEN }}
          script: |
            try {
              const { FILES } = process.env;
              const fileList = FILES.split(" ");
              core.setOutput("files", JSON.stringify(fileList));
              process.exit(0);
            } catch(err) {
              console.log("Error:", err);
              process.exit(1);
            }
  test-per-file:
    name: Test file
    needs: format-files-output
    defaults:
      run:
        shell: bash
    runs-on: windows-2019
    env:
      use_credentials: ${{ secrets.AWS_SECRET_ACCESS_KEY != '' && secrets.AWS_ACCESS_KEY_ID != '' }}
    strategy:
      matrix:
        file: ${{ fromJson(needs.format-files-output.outputs.files) }}
    steps:
      - name: Conditionally Set ENV VARS for AWS tests
        run: |
          if [[ $use_credentials == true ]]; then
            echo "AWS_SDK_LOAD_CONFIG=1" >> $GITHUB_ENV
            echo "AWS_REGION=us-west-2" >> $GITHUB_ENV
            echo "DOLT_BATS_AWS_TABLE=dolt-ci-bats-manifests-us-west-2" >> $GITHUB_ENV
            echo "DOLT_BATS_AWS_BUCKET=dolt-ci-bats-chunks-us-west-2" >> $GITHUB_ENV
            echo "DOLT_BATS_AWS_EXISTING_REPO=aws_remote_bats_tests" >> $GITHUB_ENV
          fi
      - name: Configure AWS Credentials
        if: ${{ env.use_credentials == 'true' }}
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-west-2
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
          role-duration-seconds: 3600
      - uses: actions/checkout@v4
        if: ${{ github.event_name == 'repository_dispatch' }}
        with:
          ref: ${{ github.event.client_payload.ref }}
      - name: Setup Go 1.x
        uses: actions/setup-go@v5
        with:
          go-version-file: go/go.mod
        id: go
      - name: Setup Python 3.x
        uses: actions/setup-python@v5
        with:
          python-version: "3.10"
      - uses: actions/checkout@v4
        if: ${{ github.event_name == 'workflow_dispatch' }}
      - uses: actions/setup-node@v4
        with:
          node-version: ^16
      - name: Create CI Bin
        run: |
          mkdir -p ./.ci_bin
          echo "$(pwd)/.ci_bin" >> $GITHUB_PATH
      - name: Install Bats Windows
        run: |
          git clone https://github.com/bats-core/bats-core.git
          cd bats-core
          ./install.sh $HOME
        working-directory: ./.ci_bin
      - name: Install wslpath
        run: |
          choco install wget
          wget 'https://raw.githubusercontent.com/laurent22/wslpath/master/wslpath'
          chmod 755 wslpath
          mv wslpath /usr/bin/
          cp /c/tools/php/php /usr/bin/
      - name: Install Python Deps
        run: |
          pip install mysql-connector-python
          pip install pandas
          pip install pyarrow
      - name: Install Dolt
        working-directory: ./go
        run: |
          go build -mod=readonly -o ../.ci_bin/dolt ./cmd/dolt/.

          go build -mod=readonly -o ../.ci_bin/remotesrv ./utils/remotesrv/.
          go build -mod=readonly -o ../.ci_bin/noms ./store/cmd/noms/.
      - name: Setup Dolt Config
        run: |
          dolt config --global --add user.name 'Dolthub Actions'
          dolt config --global --add user.email 'actions@dolthub.com'
      - name: Test file
        run: bats --tap ${{ matrix.file }}
        working-directory: ./integration-tests/bats
        env:
          IS_WINDOWS: true
          WINDOWS_BASE_DIR: "/d/a"
          BATS_TEST_RETRIES: "3"

  report-bats-failure:
    name: Report Bats Windows Failure via Email
    needs: test-per-file
    runs-on: ubuntu-22.04
    if: always() && (needs.test-per-file.result == 'failure')
    steps:
      - uses: actions/checkout@v4
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-west-2
      - name: Send Email
        if: ${{ github.event_name == 'workflow_dispatch' }}
        uses: ./.github/actions/ses-email-action
        with:
          region: us-west-2
          version: ${{ github.ref }}
          template: 'BatsWindowsFailureTemplate'
          toAddresses: '["${{ github.event.inputs.email }}"]'
          workflowURL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
      - name: Send Email
        if: ${{ github.event_name == 'repository_dispatch' }}
        uses: ./.github/actions/ses-email-action
        with:
          region: us-west-2
          version: ${{ github.event.client_payload.ref }}
          template: 'BatsWindowsFailureTemplate'
          toAddresses: '["${{ github.event.client_payload.actor_email }}", "tim@dolthub.com"]'
          workflowURL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
