name: "test"

on:
  pull_request:
    paths-ignore:
      - "**.md"
      - ".github/**"
      - "!.github/workflows/run-tests.yml"
  push:
    branches:
      - "master"
    paths-ignore:
      - "**.md"
      - ".github/**"

concurrency:
  group: "${{ github.workflow }}-${{ github.ref }}"
  cancel-in-progress: true

env:
  RUST_BACKTRACE: 1
  CARGO_TERM_COLOR: always

jobs:
  tests:
    name: "marine / cargo and marine-js"
    runs-on: builder
    timeout-minutes: 60

    steps:
      - uses: actions/checkout@v4

      - name: Setup Rust toolchain
        uses: dsherret/rust-toolchain-file@v1

      - name: Setup cache
        uses: Swatinem/rust-cache@v2
        with:
          cache-directories: ~/.cache/sccache
          shared-key: marine
          # github allows only 10GB of cache
          # so save cache only on merge to master
          # to use less space and speed up CI
          save-if: ${{ github.event_name == 'push' }}

      - name: Setup sccache
        uses: mozilla-actions/sccache-action@v0.0.3

      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install wasm-pack
        uses: jetli/wasm-pack-action@v0.4.0

      - name: Install marine cli
        run: cargo install --path tools/cli

      - name: Build marine-js wasm
        run: ./build.sh
        working-directory: marine-js

      - name: Install marine-js npm dependencies
        uses: bahmutov/npm-install@v1
        with:
          working-directory: marine-js/npm-package

      - name: Build marine-js npm package
        run: npm run build
        working-directory: marine-js/npm-package

      - name: Build examples
        run: ./build.sh
        working-directory: examples

      - name: Build marine-runtime wasm-tests
        run: ./build.sh
        working-directory: marine/tests/wasm_tests

      - name: Build marine-core wasm-tests
        run: ./build.sh
        working-directory: core/tests/wasm_tests

      - name: Run cargo check
        run: |
          cargo check -v --all-features \
            -p marine-core \
            -p marine-runtime \
            -p fluence-app-service \
            -p marine \
            -p mrepl

      - uses: taiki-e/install-action@nextest

      - name: Run cargo nextest
        run: cargo nextest run --release -v --all-features --profile ci \
          -p marine-core \
          -p marine-runtime

      - name: Upload test report
        uses: dorny/test-reporter@v1
        if: (success() || failure()) && !github.event.pull_request.head.repo.fork
        with:
          name: marine report
          path: target/nextest/ci/junit.xml
          reporter: java-junit

      - name: Run cargo clippy
        run: cargo clippy -v

      - name: Run marine-js smoke tests
        run: npm run test
        working-directory: marine-js/npm-package

      - name: Run cargo fmt
        run: cargo fmt --all -- --check

