# SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file)
#
# SPDX-License-Identifier: AGPL-3.0-only

name: E2E Tests

on:
  push:
    branches: [ develop ]
  pull_request_target:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ !!github.event.pull_request && github.event.pull_request.head.label || github.ref }}-${{ github.event_name }}-${{ github.job }}
  cancel-in-progress: true

env:
  NODEJS_VERSION: 20
  HEAD_COMMIT_HASH: "${{ !!github.event.pull_request && github.event.pull_request.head.sha || github.sha }}"

jobs:
  backend-sqlite: # This run also collects coverage
    if: "(github.event_name == 'pull_request_target') == github.event.pull_request.head.repo.fork"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
        with:
          fetch-depth: 0
      - name: Setup node
        uses: ./.github/actions/setup-node
        with:
          NODEJS_VERSION: ${{ env.NODEJS_VERSION }}

      - name: Run e2e tests
        run: yarn test:e2e:ci --filter=backend
        shell: bash
        env:
          HEDGEDOC_TEST_DB_TYPE: sqlite
          TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
          TURBO_API: ${{ vars.TURBO_API }}
          TURBO_TEAM: ${{ vars.TURBO_TEAM }}

      - name: Upload coverage
        uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
        with:
          directory: backend/coverage-e2e
          flags: backend, e2e-tests, backend-e2e-tests

  backend-mariadb:
    if: "(github.event_name == 'pull_request_target') == github.event.pull_request.head.repo.fork"
    runs-on: ubuntu-latest
    services:
      mariadb:
        # renovate: datasource=docker depName=mariadb
        image: mariadb:11.1.2@sha256:77e8ad8ae65e4bf59da8e0c078a086fce71a5cff21ae3c72e55573f3fde33580
        env:
          MYSQL_USER: hedgedoc
          MYSQL_PASSWORD: hedgedoc
          MYSQL_DATABASE: hedgedoc
          MYSQL_ROOT_PASSWORD: hedgedoc
          MARIADB_MYSQL_LOCALHOST_USER: 1
          MARIADB_MYSQL_LOCALHOST_GRANTS: USAGE
        options: --health-cmd "healthcheck.sh --su-mysql --connect --innodb_initialized" --health-interval 10s --health-timeout 5s --health-retries 10
        ports:
          - 3306:3306
    steps:
      - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
        with:
          fetch-depth: 0
      - name: Setup node
        uses: ./.github/actions/setup-node
        with:
          NODEJS_VERSION: ${{ env.NODEJS_VERSION }}

      - name: Run e2e tests
        run: yarn test:e2e:ci --filter=backend
        shell: bash
        env:
          HEDGEDOC_TEST_DB_TYPE: mariadb
          TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
          TURBO_API: ${{ vars.TURBO_API }}
          TURBO_TEAM: ${{ vars.TURBO_TEAM }}

  backend-postgres:
    if: "(github.event_name == 'pull_request_target') == github.event.pull_request.head.repo.fork"
    runs-on: ubuntu-latest
    services:
      postgres:
        # renovate: datasource=docker depName=postgres
        image: postgres:16.0@sha256:f1aaf6f8be5552bef66c5580efbd2942c37d7277cd0416ef4939fa34bf0baf31
        env:
          POSTGRES_PASSWORD: hedgedoc
          POSTGRES_USER: hedgedoc
        options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
        ports:
          - 5432:5432
    steps:
      - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
        with:
          fetch-depth: 0
      - name: Setup node
        uses: ./.github/actions/setup-node
        with:
          NODEJS_VERSION: ${{ env.NODEJS_VERSION }}

      - name: Run e2e tests
        run: yarn test:e2e:ci --filter=backend
        shell: bash
        env:
          HEDGEDOC_TEST_DB_TYPE: postgres
          TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
          TURBO_API: ${{ vars.TURBO_API }}
          TURBO_TEAM: ${{ vars.TURBO_TEAM }}

  frontend-build:
    if: "(github.event_name == 'pull_request_target') == github.event.pull_request.head.repo.fork"
    runs-on: ubuntu-latest
    name: Build test build of frontend
    steps:
      - name: Check out repo
        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
        with:
          ref: ${{ env.HEAD_COMMIT_HASH }}

      - name: Setup node
        uses: ./.github/actions/setup-node
        with:
          NODEJS_VERSION: ${{ env.NODEJS_VERSION }}

      - name: Build test production build
        run: yarn build:test --filter=frontend
        shell: bash
        env:
          NODEJS_VERSION: ${{ env.NODEJS_VERSION }}
          TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
          TURBO_API: ${{ vars.TURBO_API }}
          TURBO_TEAM: ${{ vars.TURBO_TEAM }}

      - name: Compress build
        run: tar --zstd -cf frontend-e2e-build.tar.zst frontend/dist/

      - name: Upload build artifact
        uses: actions/upload-artifact@v3
        with:
          name: frontend-e2e-build
          retention-days: 1
          path: frontend-e2e-build.tar.zst

  frontend-cypress:
    if: "(github.event_name == 'pull_request_target') == github.event.pull_request.head.repo.fork"
    needs: frontend-build
    runs-on: ubuntu-latest
    container:
      image: cypress/browsers:node-18.16.0-chrome-113.0.5672.92-1-ff-113.0-edge-113.0.1774.35-1@sha256:6bf406250fcdf27fcdcea54c9087f54e1cbaf4c6c5420cced8840efc7f6b144e
      options: --shm-size=2g
    strategy:
      fail-fast: false
      matrix:
        containers: [ 1, 2, 3 ]
    steps:
      - name: Install additional packages
        run: apt-get update && apt-get install -y jq zstd screen curl

      - name: Check out repo
        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
        with:
          ref: ${{ env.HEAD_COMMIT_HASH }}

      - name: Setup node
        uses: ./.github/actions/setup-node
        with:
          NODEJS_VERSION: ${{ env.NODEJS_VERSION }}

      - name: Download build
        uses: actions/download-artifact@v3
        with:
          name: frontend-e2e-build

      - name: Decompress build
        run: tar -xf frontend-e2e-build.tar.zst

      - name: Run server
        working-directory: frontend/
        run: (screen -dmS server -L yarn start) && sleep 3 && (tail -f screenlog.0 &)
        env:
          NODE_ENV: test
          HOSTNAME: "127.0.0.1"
          HD_BASE_URL: "http://127.0.0.1:3001/"
          PORT: 3001

      - name: Wait for server
        run: "curl -L --max-time 120 http://127.0.0.1:3001/"

      - name: Run cypress
        run: yarn test:e2e:ci --filter=frontend
        shell: bash
        env:
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
          TURBO_API: ${{ vars.TURBO_API }}
          TURBO_TEAM: ${{ vars.TURBO_TEAM }}
          CYPRESS_CONTAINER_ID: ${{ matrix.containers }}

      - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # master
        with:
          name: screenshots
          path: cypress/screenshots
