# .github/workflows/rust-tests.yml
name: Rust tests

# `cargo test` for the Tauri bootstrap installer (Hermes-Setup). Nothing in CI
# compiled this crate before: `.rs` lives under `apps/`, so the change
# classifier matched it as `frontend` and ran the TypeScript matrix, which
# cannot notice a Rust error. The crate's unit tests existed in the tree and had
# never run.
#
# Linux runner on purpose. The pipe-drain tests in src/powershell.rs need a real
# process tree whose grandchild inherits the parent's stdout, and their fixture
# is `#[cfg(unix)]`; the Windows half of that same contract is covered by
# `-SelfTestPipeDrain` in scripts/desktop-update/windows.ps1 on the Windows
# lane. A Windows runner here would compile them out and report green over zero
# coverage.

on:
  workflow_call:

permissions:
  contents: read

concurrency:
  group: rust-tests-${{ github.ref }}
  cancel-in-progress: true

jobs:
  bootstrap-installer:
    name: cargo test (bootstrap installer)
    runs-on: ubuntu-latest
    timeout-minutes: 30
    defaults:
      run:
        working-directory: apps/bootstrap-installer/src-tauri
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      # Tauri links against the system webkit2gtk on Linux, so the crate does
      # not compile without these even for `cargo test --lib`.
      - name: Install Tauri system dependencies
        working-directory: .
        run: |
          sudo apt-get update
          sudo apt-get install --no-install-recommends -y \
            libwebkit2gtk-4.1-dev \
            libappindicator3-dev \
            librsvg2-dev \
            libxdo-dev \
            libssl-dev \
            patchelf

      # Keyed on Cargo.toml, not Cargo.lock: apps/bootstrap-installer/.gitignore
      # excludes the lockfile (a create-tauri-app scaffold default), so there is
      # nothing pinned to hash and `--locked` cannot be used. That also means
      # this crate re-resolves its whole dependency graph on every build, which
      # is a real gap for a signed installer given the pinning policy in
      # AGENTS.md — tracking separately rather than widening this PR.
      #
      # No restore-keys: a partial hit leaves a stale target dir, and cargo
      # re-resolves correctly on top of a Cargo.toml-keyed hit anyway.
      - name: Restore cargo cache
        uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            apps/bootstrap-installer/src-tauri/target
          key: cargo-${{ runner.os }}-${{ hashFiles('apps/bootstrap-installer/src-tauri/Cargo.toml') }}

      # --lib only: the integration/bin targets would need a built frontend
      # (vite dist) that this lane deliberately does not produce.
      - name: cargo test
        run: cargo test --lib
