name: typescript / contracts

on:
  push:
    branches:
      - 'master'
      - 'develop'
      - '*rc'
      - 'regenesis/*'
  pull_request:
  workflow_dispatch:

jobs:
  test:
    name: Run unit tests
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Fetch history
        run: git fetch

      - name: Setup node
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Install Dependencies
        # only install dependencies if there was a change in the deps
        # if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn install

      - name: Check yarn.lock for changes
        run: git diff --exit-code

      - name: Build
        run: yarn build

      - name: Test
        run: yarn test
        env:
          FORCE_COLOR: 1
          ENABLE_GAS_REPORT: 1
      - name: Print gas report
        run: cat packages/contracts/gas-report.txt

      - name: Run codechecks
        working-directory: ./packages/contracts
        run: yarn codechecks
        env:
          CC_SECRET: ${{ secrets.CC_SECRET }}

  test-coverage:
    name: Generate test coverage
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Fetch history
        run: git fetch

      - name: Setup node
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Install Dependencies
        # only install dependencies if there was a change in the deps
        # if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn install

      - name: Build
        run: yarn build

      - name: Test Coverage
        run: yarn test:coverage
        # Tests are quite brittle when instrumented by Solidity Coverage.
        # If tests pass in the Test job above, tests failing during coverage shouldn't break CI.
        continue-on-error: true
      - uses: codecov/codecov-action@v1
        with:
          files: ./packages/contracts/coverage.json
          fail_ci_if_error: false
          verbose: true
          flags: contracts
      - uses: codecov/codecov-action@v1
        with:
          files: ./packages/core-utils/coverage.json
          fail_ci_if_error: false
          verbose: true
          flags: core-utils
      - uses: codecov/codecov-action@v1
        with:
          files: ./packages/batch-submitter/coverage.json
          fail_ci_if_error: false
          verbose: true
          flags: batch-submitter
      - uses: codecov/codecov-action@v1
        with:
          files: ./packages/data-transport-layer/coverage.json
          fail_ci_if_error: false
          verbose: true
          flags: data-transport-layer
      - uses: codecov/codecov-action@v1
        with:
          files: ./packages/message-relayer/coverage.json
          fail_ci_if_error: false
          verbose: true
          flags: message-relayer
  lint:
    name: Linting
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Fetch history
        run: git fetch
      - uses: actions/setup-node@v1
        with:
          node-version: 14

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Install Dependencies
        # only install dependencies if there was a change in the deps
        # if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn install

      - name: Lint JS and TS
        run: yarn lint:ts:check

      - name: Lint Solidity
        working-directory: ./packages/contracts
        run: yarn lint:contracts:check
