name: Unit Tests
on:
  push:
    branches:
      - main
  pull_request:

jobs:
  unit-test:
    strategy:
      fail-fast: false
      matrix:
        container: ["node:8", "node:10", "node:12", "node:14"]
    runs-on: ubuntu-latest
    container:
      image: ${{ matrix.container }}
    env:
      NPM_CONFIG_UNSAFE_PERM: true
    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: restore lock files
        uses: actions/cache@master # must use unreleased master to cache multiple paths
        id: cache
        with:
          # must be done before bootstrap to not include node_modules files in the cache paths
          path: |
            package-lock.json
            packages/*/package-lock.json
            benchmark/*/package-lock.json
            backwards-compatability/*/package-lock.json
            metapackages/*/package-lock.json
            packages/*/package-lock.json
            integration-tests/*/package-lock.json
          key: ${{ runner.os }}-unit_test-${{ matrix.container }}-${{ hashFiles('**/package.json') }}

      - name: Install and Build (cache miss) 🔧
        if: steps.cache.outputs.cache-hit != 'true'
        run: |
          npm install --ignore-scripts
          npx lerna bootstrap --no-ci
          npm run compile

      - name: Install and Build (cache hit) 🔧
        if: steps.cache.outputs.cache-hit == 'true'
        run: |
          npm ci --ignore-scripts
          npx lerna bootstrap
          npm run compile

      - name: Unit tests
        run: npm run test
      - name: Report Coverage
        run: npm run codecov
        if: ${{ matrix.container }} == 'node:12'
  browser-tests:
    runs-on: ubuntu-latest
    container:
      image: circleci/node:12-browsers
    env:
      NPM_CONFIG_UNSAFE_PERM: true
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Permission Setup
        run: sudo chmod -R 777 /github /__w

      - name: restore lock files
        uses: actions/cache@master # must use unreleased master to cache multiple paths
        id: cache
        with:
          # must be done before bootstrap to not include node_modules files in the cache paths
          path: |
            package-lock.json
            packages/*/package-lock.json
            benchmark/*/package-lock.json
            backwards-compatability/*/package-lock.json
            metapackages/*/package-lock.json
            packages/*/package-lock.json
            integration-tests/*/package-lock.json
          key: ${{ runner.os }}-unit_test-${{ matrix.container }}-${{ hashFiles('**/package.json') }}

      - name: Install and Build (cache miss) 🔧
        if: steps.cache.outputs.cache-hit != 'true'
        run: |
          npm install --ignore-scripts
          npx lerna bootstrap --no-ci
          npm run compile

      - name: Install and Build (cache hit) 🔧
        if: steps.cache.outputs.cache-hit == 'true'
        run: |
          npm ci --ignore-scripts
          npx lerna bootstrap
          npm run compile

      - name: Unit tests
        run: npm run test:browser
      - name: Report Coverage
        run: npm run codecov:browser
