name: E2E

on:
  pull_request:
    types: [edited, labeled]

jobs:
  
  get-selected-tags-and-containers:
    if:  ${{ contains(github.event.pull_request.labels.*.name, 'run e2e') }}
    runs-on: ubuntu-latest
    outputs:
      tags: ${{steps.get_tags.outputs.result}}
      containers: ${{ steps.get_containers.outputs.result}}

    steps:
      - name: Get tags
        id: get_tags
        uses: actions/github-script@v6
        env: 
          pullRequestBody: ${{ github.event.pull_request.body }}
        with:
          result-encoding: string
          script: |
                  const { pullRequestBody } = process.env
                  const tags = ["@critical"];
                  try{
                    const removedPullRequestBodyBeforeTests = pullRequestBody.split(`### Do you want to run more stable tests?`);
                    const removedPullRequestBodyAfterTests = removedPullRequestBodyBeforeTests[1].split(`CONTAINERS`);
                    let tagsInString = removedPullRequestBodyAfterTests[0];
                    tagsInString = tagsInString.split('\n');
                    tagsInString.forEach(line => {
                      if (line.includes('[x]')) tags.push(line.replace(/[0-9]+\. \[x\] /, "@stable+@"))
                    });
                    const tagsToReturn = tags.join(",").toString();
                    return tagsToReturn.replace(/\r/g, '')
                  }catch{
                    return '@critical'
                  }
      - name: get-containers
        id: get_containers
        uses: actions/github-script@v6
        env:
          pullRequestBody: ${{ github.event.pull_request.body }}
        with:
          script: |
                  const { pullRequestBody } = process.env
                  const containers = [];
                    const numberOfContainersRegex = /CONTAINERS=(\d*)/
                    const numberOfContainers = pullRequestBody.match(numberOfContainersRegex);
                    for(let i=1; i<=numberOfContainers[1]; i++){
                      containers.push(i)
                    }
                  return {"containers": containers}
  install-cypress:
    needs: get-selected-tags-and-containers
    runs-on: ubuntu-latest
    steps:

      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version-file: '.nvmrc'
          
      - name: Wait for Deploy and tests
        uses: lewagon/wait-on-check-action@v1.0.0
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          running-workflow-name: e2e
          check-name: deploy
          wait-interval: 10

      - name: Cypress install
        uses: cypress-io/github-action@v4
        with:
          # Disable running of tests within install job
          runTests: false
    
  run-tests-in-parallel-on-label:
    needs: [get-selected-tags-and-containers, install-cypress]
    runs-on: ubuntu-latest
    env:
        NODE_OPTIONS: "--max_old_space_size=4096"
    container: cypress/browsers:node18.12.0-chrome106-ff106
    strategy:
      fail-fast: false
      max-parallel: 10
      matrix: ${{ fromJson(needs.get-selected-tags-and-containers.outputs.containers) }}
        # run copies of the current job in parallel
    steps:

      - uses: rlespinasse/github-slug-action@3.1.0

      - name: Set domain
        id: set-domain
        run: |
          echo "domain=${{ env.GITHUB_HEAD_REF_SLUG_URL }}.dashboard.saleor.rocks" >> $GITHUB_OUTPUT
      - name: Get API_URI
        id: api_uri
        # Search for API_URI in PR description and use default if not defined
        env:
          pull_request_body: ${{ github.event.pull_request.body }}
          prefix: API_URI=
          pattern: (http|https)://[a-zA-Z0-9.-]+/graphql/?
          fallback_uri: ${{ secrets.CYPRESS_API_URI }}
        run: |
          echo "custom_api_uri=$(echo "$pull_request_body" | grep -Eo "$prefix$pattern" | sed s/$prefix// | head -n 1 | { read custom_uri; if [ -z "$custom_uri" ]; then echo "$fallback_uri"; else echo "$custom_uri"; fi })" >> $GITHUB_OUTPUT
      - name: Checkout
        uses: actions/checkout@v2

      - name: Cypress run
        uses: cypress-io/github-action@v4
        env:
          API_URI: ${{ steps.api_uri.outputs.custom_api_uri }}
          APP_MOUNT_URI: ${{ secrets.APP_MOUNT_URI }}
          CYPRESS_baseUrl: https://${{ steps.set-domain.outputs.domain }}/
          CYPRESS_USER_NAME: ${{ secrets.CYPRESS_USER_NAME }}
          CYPRESS_SECOND_USER_NAME: ${{ secrets.CYPRESS_SECOND_USER_NAME }}
          CYPRESS_USER_PASSWORD: ${{ secrets.CYPRESS_USER_PASSWORD }}
          CYPRESS_PERMISSIONS_USERS_PASSWORD: ${{ secrets.CYPRESS_PERMISSIONS_USERS_PASSWORD }}
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
          CYPRESS_mailHogUrl: ${{ secrets.CYPRESS_MAILHOG }}
          COMMIT_INFO_MESSAGE: ${{ needs.get-selected-tags-and-containers.outputs.tags }} tests triggered on PR - https://github.com/${{ github.repository }}/pull/${{ github.ref_name }}
          CYPRESS_grepTags: ${{ needs.get-selected-tags-and-containers.outputs.tags }}
        with:
          parallel: true
          group: 'UI - Chrome'
          record: true
          tag: e2eTestsOnPR
