name: ci-casper-js-sdk

on:
  workflow_dispatch:

  push:
    branches:
      - 'dev'
      - 'feat-*'
      - 'release-*'
    paths-ignore:
      - '**.md'

  pull_request:
    branches:
      - 'dev'
      - 'feat-*'
      - 'release-*'
    paths-ignore:
      - '**.md'

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
        node-version: [16.x, 18.x]
        os: [ubuntu-20.04, ubuntu-22.04]
    runs-on: ${{ matrix.os }}
    env:
      FAUCET_PRIV_KEY: 'MC4CAQAwBQYDK2VwBCIEII8ULlk1CJ12ZQ+bScjBt/IxMAZNggClWqK56D1/7CbI' #ci/test-assets/secret-key.pem
      NODE_URL: 'http://127.0.0.1:7777/rpc'
      HTTP_EVENT_STREAM_URL: 'http://127.0.0.1:9999/events/main'
      HTTPS_EVENT_STREAM_URL: 'https://events.mainnet.casperlabs.io/events/main'
      NETWORK_NAME: 'casper-net-1'
      RUST_LOG: 'INFO'
      VERSION_QUERY: '{"jsonrpc": "2.0", "id": "1", "method": "info_get_status"}'
      MAINNET_NODE_URL: 'https://rpc.mainnet.casperlabs.io/rpc'
      TESTNET_NODE_URL: 'https://rpc.testnet.casperlabs.io/rpc'

    steps:
      - name: Checkout
        uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b #v3.0.2

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@5b949b50c3461bbcd5a540b150c368278160234a #v3.4.0
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Install
        run: npm install

      - name: Audits
        run: npm audit --omit=dev

      - name: Lints
        run: npm run lint:ci

      - name: Unit Test
        run: npm run test:unit

      - name: Test docs build
        run: npm run docs:build

      - name: Test build
        run: npm run build

      # test mainnet
      - name: Get the mainnet version
        id: get-mainnet-version
        run: echo "MAINNET_VERSION=$(curl -s -X POST --data-raw '${{ env.VERSION_QUERY }}' -H "Content-Type:application/json" ${{ env.MAINNET_NODE_URL }} | jq -r .result.build_version | cut -d "-" -f 1)" >> "$GITHUB_ENV"

      - name: Test RPC - mainnet ${{ env.MAINNET_VERSION }}
        run: npx casper-node-launcher-js node v${{ env.MAINNET_VERSION }} --daemon && npm run test:e2e && npx casper-node-launcher-js stop

      # test testnet
      - name: Get the testnet version
        id: get-testnet-version
        run: echo "TESTNET_VERSION=$(curl -s -X POST --data-raw '${{ env.VERSION_QUERY }}' -H "Content-Type:application/json" ${{ env.TESTNET_NODE_URL }} | jq -r .result.build_version | cut -d "-" -f 1)" >> "$GITHUB_ENV"

      - name: Test RPC - testnet ${{ env.TESTNET_VERSION }}
        run: npx casper-node-launcher-js node v${{ env.TESTNET_VERSION }} --daemon && npm run test:e2e && npx casper-node-launcher-js stop

      - name: Get Latest Casper-Node Tag Version
        run: |
          echo "CASPER_TAG_VERSION=$(curl -s ${{ env.GH_API_URL }} | jq -r '.[].name' | grep 'v*' | sort -V | sed 's/_$//' | tail -n1)" >> $GITHUB_ENV
        env:
          GH_API_URL: 'https://api.github.com/repos/casper-network/casper-node/tags'

      - name: Test RPC - Casper Node - ${{ env.CASPER_TAG_VERSION }}
        # Runs action if the latest version is different from mainnet and testnet
        if: ${{ env.CASPER_TAG_VERSION }} != v${{ env.MAINNET_VERSION }} && ${{ env.CASPER_TAG_VERSION }} != v${{ env.TESTNET_VERSION }}
        run: npx casper-node-launcher-js node ${{ env.CASPER_TAG_VERSION }} --daemon && npm run test:e2e && npx casper-node-launcher-js stop

      - name: Test RPC - Casper Node - DEV
        run: npx casper-node-launcher-js node dev --daemon && npm run test:e2e && npx casper-node-launcher-js stop
