# Leave the powered by Sauce Labs bit in as this means we get additional concurrency
name: "Frontend admin tests powered by Sauce Labs"

on: [push]

jobs:
  withplugins:
    name: with plugins
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        node: [10, 12, 14, 15]

    steps:
    - name: Generate Sauce Labs strings
      id: sauce_strings
      run: |
        printf %s\\n '::set-output name=name::${{ github.workflow }} - ${{ github.job }} - Node ${{ matrix.node }}'
        printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}-node${{ matrix.node }}'

    - name: Checkout repository
      uses: actions/checkout@v2

    - uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node }}

    - name: Install etherpad plugins
      # We intentionally install an old ep_align version to test upgrades to the minor version number.
      # The --legacy-peer-deps flag is required to work around a bug in npm v7:
      # https://github.com/npm/cli/issues/2199
      run: npm install --no-save --legacy-peer-deps ep_align@0.2.27

    # This must be run after installing the plugins, otherwise npm will try to
    # hoist common dependencies by removing them from src/node_modules and
    # installing them in the top-level node_modules. As of v6.14.10, npm's hoist
    # logic appears to be buggy, because it sometimes removes dependencies from
    # src/node_modules but fails to add them to the top-level node_modules. Even
    # if npm correctly hoists the dependencies, the hoisting seems to confuse
    # tools such as `npm outdated`, `npm update`, and some ESLint rules.
    - name: Install all dependencies and symlink for ep_etherpad-lite
      run: src/bin/installDeps.sh

    # Nuke plugin tests
    - name: Install etherpad plugins
      run: rm -Rf node_modules/ep_align/static/tests/*

    - name: export GIT_HASH to env
      id: environment
      run: echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})"

    - name: Create settings.json
      run: cp settings.json.template settings.json

    - name: Write custom settings.json that enables the Admin UI tests
      run: "sed -i 's/\"enableAdminUITests\": false/\"enableAdminUITests\": true,\\n\"users\":{\"admin\":{\"password\":\"changeme\",\"is_admin\":true}}/' settings.json"

    - name: Remove standard frontend test files, so only admin tests are run
      run: mv src/tests/frontend/specs/* /tmp && mv /tmp/admin*.js src/tests/frontend/specs

    - uses: saucelabs/sauce-connect-action@v1.1.2
      with:
        username: ${{ secrets.SAUCE_USERNAME }}
        accessKey: ${{ secrets.SAUCE_ACCESS_KEY }}
        tunnelIdentifier: ${{ steps.sauce_strings.outputs.tunnel_id }}

    - name: Run the frontend admin tests
      shell: bash
      env:
        SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
        SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
        SAUCE_NAME: ${{ steps.sauce_strings.outputs.name }}
        TRAVIS_JOB_NUMBER: ${{ steps.sauce_strings.outputs.tunnel_id }}
        GIT_HASH: ${{ steps.environment.outputs.sha_short }}
      run: |
        src/tests/frontend/travis/adminrunner.sh
