name: run-network-tests
on:
  pull_request:
    types: [opened, synchronize]

  workflow_dispatch:
    # TODO: add an input so dispatcher can specify a list of tests to run,
    # composed of the job ids separated by `:`
    # for eg.
    #   'network_tests_1:network_tests_3'
    #   'network_tests_2'
    # inputs:
    #   test_to_run:
    #     description: 'Tests to run'
    #     required: false
    #     default: 'all'

jobs:
  build_images:
    name: Build joystream/node
    runs-on: ubuntu-latest
    outputs:
      use_artifact: ${{ steps.compute_shasum.outputs.shasum }}-joystream-node-docker-image.tar.gz
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1
        with:
          node-version: '14.x'

      - id: compute_shasum
        name: Compute runtime code shasum
        run: |
          export RUNTIME_CODE_SHASUM=`scripts/runtime-code-shasum.sh`
          echo "::set-output name=shasum::${RUNTIME_CODE_SHASUM}"

      - name: Setup cache directory
        run: mkdir ~/docker-images

      - name: Cache docker images
        uses: actions/cache@v2
        env:
          cache-name: joystream-node-docker
        with:
          path: ~/docker-images
          key: ${{ env.cache-name }}-${{ steps.compute_shasum.outputs.shasum }}

      - name: Check if we have cached image
        continue-on-error: true
        run: |
          if [ -f ~/docker-images/joystream-node-docker-image.tar.gz ]; then
            docker load --input ~/docker-images/joystream-node-docker-image.tar.gz
            cp ~/docker-images/joystream-node-docker-image.tar.gz .
          fi

      - name: Check if we have pre-built image on Dockerhub
        continue-on-error: true
        run: |
          if ! [ -f joystream-node-docker-image.tar.gz ]; then
            docker pull joystream/node:${{ steps.compute_shasum.outputs.shasum }}
            docker image tag joystream/node:${{ steps.compute_shasum.outputs.shasum }} joystream/node:latest
            docker save --output joystream-node-docker-image.tar joystream/node:latest
            gzip joystream-node-docker-image.tar
            cp joystream-node-docker-image.tar.gz ~/docker-images/
          fi

      - name: Build new joystream/node image
        run: |
          if ! [ -f joystream-node-docker-image.tar.gz ]; then
            docker build . --file joystream-node.Dockerfile --tag joystream/node
            docker save --output joystream-node-docker-image.tar joystream/node
            gzip joystream-node-docker-image.tar
            cp joystream-node-docker-image.tar.gz ~/docker-images/
          fi

      - name: Save joystream/node image to Artifacts
        uses: actions/upload-artifact@v2
        with:
          name: ${{ steps.compute_shasum.outputs.shasum }}-joystream-node-docker-image.tar.gz
          path: joystream-node-docker-image.tar.gz

  basic_runtime_with_upgrade:
    # if: ${{ false }}
    name: Integration Tests (Runtime Upgrade)
    needs: build_images
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: Get artifacts
        uses: actions/download-artifact@v2
        with:
          name: ${{ needs.build_images.outputs.use_artifact }}
      - name: Install artifacts
        run: |
          docker load --input joystream-node-docker-image.tar.gz
          docker images
      - name: Install packages and dependencies
        run: |
          yarn install --frozen-lockfile
          yarn workspace @joystream/types build
          yarn workspace @joystream/metadata-protobuf build
          yarn workspace @joystream/cli build
      - name: Ensure tests are runnable
        run: yarn workspace network-tests build
      - name: Execute network tests
        run: RUNTIME=sumer tests/network-tests/run-migration-tests.sh full

  basic_runtime:
    name: Integration Tests (New Chain)
    needs: build_images
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: Get artifacts
        uses: actions/download-artifact@v2
        with:
          name: ${{ needs.build_images.outputs.use_artifact }}
      - name: Install artifacts
        run: |
          docker load --input joystream-node-docker-image.tar.gz
          docker images
      - name: Install packages and dependencies
        run: |
          yarn install --frozen-lockfile
          yarn workspace @joystream/types build
          yarn workspace @joystream/metadata-protobuf build
          yarn workspace @joystream/cli build
      - name: Ensure tests are runnable
        run: yarn workspace network-tests build
      - name: Execute network tests
        run: tests/network-tests/run-tests.sh full

  new_chain_setup:
    name: Initialize new chain
    needs: build_images
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: Get artifacts
        uses: actions/download-artifact@v2
        with:
          name: ${{ needs.build_images.outputs.use_artifact }}
      - name: Install artifacts
        run: |
          docker load --input joystream-node-docker-image.tar.gz
          docker images
      - name: Install packages and dependencies
        run: |
          yarn install --frozen-lockfile
          yarn workspace @joystream/types build
          yarn workspace @joystream/metadata-protobuf build
          yarn workspace @joystream/cli build
      - name: Ensure query-node builds
        run: yarn workspace query-node-root build
      - name: Ensure tests are runnable
        run: yarn workspace network-tests build
      # Bring up hydra query-node development instance, then run content directory
      # integration tests
      - name: Execute Tests
        run: tests/network-tests/test-setup-new-chain.sh

