# Produce a build of element-web with this version of react-sdk
# and any matching branches of element-web and js-sdk, output it
# as an artifact and run integration tests.
name: Element Web - Build and Test
on:
  pull_request: { }
  push:
    branches: [ develop, master ]
  repository_dispatch:
    types: [ upstream-sdk-notify ]
env:
  # These must be set for fetchdep.sh to get the right branch
  REPOSITORY: ${{ github.repository }}
  PR_NUMBER: ${{ github.event.pull_request.number }}
jobs:
  build:
    name: "Build Element-Web"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-node@v3
        with:
          cache: 'yarn'

      - name: Fetch layered build
        id: layered_build
        run: |
          scripts/ci/layered.sh
          JSSDK_SHA=$(git -C matrix-js-sdk rev-parse --short=12 HEAD)
          REACT_SHA=$(git rev-parse --short=12 HEAD)
          VECTOR_SHA=$(git -C element-web rev-parse --short=12 HEAD)
          echo "::set-output name=VERSION::$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA"

      - name: Copy config
        run: cp element.io/develop/config.json config.json
        working-directory: ./element-web

      - name: Build
        env:
          CI_PACKAGE: true
          VERSION: "${{ steps.layered_build.outputs.VERSION }}"
        run: yarn build
        working-directory: ./element-web

      - name: Upload Artifact
        uses: actions/upload-artifact@v2
        with:
          name: previewbuild
          path: element-web/webapp
          # We'll only use this in a triggered job, then we're done with it
          retention-days: 1

  cypress:
    name: "Cypress End to End Tests"
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Download build
        uses: actions/download-artifact@v3
        with:
          name: previewbuild
          path: webapp

      - name: Run Cypress tests
        uses: cypress-io/github-action@v2
        with:
          # The built-in Electron runner seems to grind to a halt trying
          # to run the tests, so use chrome.
          browser: chrome
          start: npx serve -p 8080 webapp
          wait-on: 'http://localhost:8080'
          record: true
          command-prefix: 'yarn percy exec --'
        env:
          # pass the Dashboard record key as an environment variable
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
          # pass the Percy token as an environment variable
          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
          # Use existing chromium rather than downloading another
          PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true
          PERCY_BROWSER_EXECUTABLE: /usr/bin/chromium-browser
          # pass GitHub token to allow accurately detecting a build vs a re-run build
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # make Node's os.tmpdir() return something where we actually have permissions
          TMPDIR: ${{ runner.temp }}

      - name: Upload Artifact
        if: failure()
        uses: actions/upload-artifact@v2
        with:
          name: cypress-results
          path: |
            cypress/screenshots
            cypress/videos
            cypress/synapselogs

      - name: Store benchmark result
        if: github.ref == 'refs/heads/develop'
        uses: matrix-org/github-action-benchmark@jsperfentry-1
        with:
          name: Cypress measurements
          tool: 'jsperformanceentry'
          output-file-path: cypress/performance/measurements.json
          # The dashboard is available at https://matrix-org.github.io/matrix-react-sdk/cypress/bench/
          benchmark-data-dir-path: cypress/bench
          fail-on-alert: false
          comment-on-alert: false
          github-token: ${{ secrets.DEPLOY_GH_PAGES }}
          auto-push: ${{ github.ref == 'refs/heads/develop' }}

  app-tests:
    name: Element Web Integration Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-node@v3
        with:
          cache: 'yarn'

      - name: Run tests
        run: "./scripts/ci/app-tests.sh"