name: Tests

env:
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
  RUSTFLAGS: "-D warnings -W unreachable-pub -W rust-2021-compatibility"
  RUSTUP_MAX_RETRIES: 10
  RUST_BACKTRACE: short

on:
  workflow_dispatch:
  pull_request:
    paths:
      - '.gitea/**'
      - 'melib/src/**'
      - 'melib/Cargo.toml'
      - 'meli/src/**'
      - 'meli/Cargo.toml'
      - 'Cargo.toml'
      - 'Cargo.lock'
  push:
    paths:
      - '.gitea/**'
      - 'melib/src/**'
      - 'melib/Cargo.toml'
      - 'meli/src/**'
      - 'meli/Cargo.toml'
      - 'Cargo.toml'
      - 'Cargo.lock'

jobs:
  test:
    name: Test on ${{ matrix.build }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        build: [linux-amd64, ]
        include:
          - build: linux-amd64
            os: ubuntu-latest
            rust: stable
            target: x86_64-unknown-linux-gnu
    steps:
      - uses: https://github.com/actions/checkout@v2
      - id: os-deps
        name: install OS dependencies
        run: |
          apt-get update
          apt-get install -y libdbus-1-dev pkg-config mandoc libssl-dev
          #- id: cache-rustup
          #  name: Cache Rust toolchain
          #  uses: https://github.com/actions/cache@v3
          #  with:
          #    path: ~/.rustup
          #    key: toolchain-${{ matrix.os }}-${{ matrix.rust }}
          #- if: ${{ steps.cache-rustup.outputs.cache-hit != 'true' }}
      - name: Install Rust ${{ matrix.rust }}
        uses: https://github.com/actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: ${{ matrix.rust }}
          components: clippy, rustfmt
          target: ${{ matrix.target }}
          override: true
      - name: Configure cargo data directory
        # After this point, all cargo registry and crate data is stored in
        # $GITHUB_WORKSPACE/.cargo_home. This allows us to cache only the files
        # that are needed during the build process. Additionally, this works
        # around a bug in the 'cache' action that causes directories outside of
        # the workspace dir to be saved/restored incorrectly.
        run: echo "CARGO_HOME=$(pwd)/.cargo_home" >> $GITHUB_ENV
          #- id: cache-cargo
          #  name: Cache cargo configuration and installations
          #  uses: https://github.com/actions/cache@v3
          #  with:
          #    path: ${{ env.CARGO_HOME }}
          #    key: cargo-${{ matrix.os }}-${{ matrix.rust }}
          #- if: ${{ steps.cache-cargo.outputs.cache-hit != 'true' }} && matrix.target
      - name: Setup Rust target
        run: |
          mkdir -p "${{ env.CARGO_HOME }}"
          cat << EOF > "${{ env.CARGO_HOME }}"/config.toml
          [build]
          target = "${{ matrix.target }}"
          EOF
      - if: ${{ steps.cache-cargo.outputs.cache-hit != 'true' }} && matrix.target
        name: Add lint dependencies
        run: |
          cargo install --quiet --version 1.0.9 --target "${{ matrix.target }}" cargo-sort
          cargo install --quiet --version 0.9.54 --target "${{ matrix.target }}" cargo-nextest
      - name: cargo-check
        run: |
          cargo check --all-features --all --tests --examples --benches --bins
      - name: Compile
        if: success() || failure()
        run: cargo test --all --no-fail-fast --all-features --no-run --locked
      - name: cargo test
        if: success() || failure() # always run even if other steps fail, except when cancelled <https://stackoverflow.com/questions/58858429/how-to-run-a-github-actions-step-even-if-the-previous-step-fails-while-still-f>
        run: |
          cargo nextest run --all --no-fail-fast --all-features --future-incompat-report -E 'not (test(smtp::test::test_smtp))'
          #cargo test --all --no-fail-fast --all-features -- --nocapture --quiet
      - name: cargo-sort
        if: success() || failure()
        run: |
          cargo sort --check
      - name: rustfmt
        if: success() || failure()
        run: |
          cargo fmt --check --all
      - name: clippy
        if: success() || failure()
        run: |
          cargo clippy --no-deps --all-features --all --tests --examples --benches --bins
