busbar-sf-api 0.0.3

Salesforce API client library for Rust
Documentation
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: read

env:
  RUST_BACKTRACE: 1
  CARGO_TERM_COLOR: always

jobs:
  # ── Fast checks (no compilation) ──────────────────────────────────────
  fmt:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - run: cargo fmt --all --check

  # ── Lint ──────────────────────────────────────────────────────────────
  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2
      - run: cargo clippy --workspace --all-targets --all-features -- -D warnings

  # ── Unit tests with coverage ──────────────────────────────────────────
  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: taiki-e/install-action@cargo-llvm-cov
      - uses: Swatinem/rust-cache@v2

      - name: Clean coverage artifacts
        run: cargo llvm-cov clean --workspace

      - name: Run unit tests with coverage
        run: cargo llvm-cov --workspace --all-features --lib --lcov --output-path lcov-unit.info

      - name: Run doc tests
        if: always()
        run: cargo test --workspace --doc

      - name: Generate summary
        if: always()
        run: |
          echo "### Unit Tests" >> "$GITHUB_STEP_SUMMARY"
          cargo llvm-cov report --workspace --summary-only 2>&1 | tail -20 >> "$GITHUB_STEP_SUMMARY"

      - name: Upload coverage to Codecov
        if: always()
        uses: codecov/codecov-action@v5
        with:
          files: lcov-unit.info
          flags: unit-tests
          disable_search: true
          fail_ci_if_error: false
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  # ── Documentation ─────────────────────────────────────────────────────
  docs:
    name: Documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: cargo doc --workspace --no-deps --all-features
        env:
          RUSTDOCFLAGS: -D warnings

  # ── MSRV ──────────────────────────────────────────────────────────────
  msrv:
    name: MSRV
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: "1.88"
      - uses: Swatinem/rust-cache@v2
      - run: cargo check --workspace

  # ── Integration tests (real Salesforce org) ───────────────────────────
  integration:
    name: Integration Tests
    runs-on: ubuntu-latest
    environment: scratch
    steps:
      - uses: actions/checkout@v6
      - uses: dtolnay/rust-toolchain@stable
      - uses: taiki-e/install-action@cargo-llvm-cov
      - uses: Swatinem/rust-cache@v2

      - name: Verify credentials
        env:
          SF_AUTH_URL: ${{ secrets.SF_AUTH_URL }}
        run: |
          if [ -z "$SF_AUTH_URL" ]; then
            echo "::error::SF_AUTH_URL secret is not configured"
            exit 1
          fi

      - name: Setup scratch org test data
        env:
          SF_AUTH_URL: ${{ secrets.SF_AUTH_URL }}
        run: cargo run --bin setup-scratch-org

      - name: Clean coverage artifacts
        run: cargo llvm-cov clean --workspace

      - name: Run integration tests with coverage
        env:
          SF_AUTH_URL: ${{ secrets.SF_AUTH_URL }}
        run: cargo llvm-cov --workspace --all-features --test integration --lcov --output-path lcov-integration.info -- --nocapture

      - name: Generate summary
        if: always()
        env:
          SF_AUTH_URL: ${{ secrets.SF_AUTH_URL }}
        run: |
          echo "### Integration Tests" >> "$GITHUB_STEP_SUMMARY"
          cargo llvm-cov report --workspace --summary-only 2>&1 | tail -20 >> "$GITHUB_STEP_SUMMARY"

      - name: Upload coverage to Codecov
        if: always()
        uses: codecov/codecov-action@v5
        with:
          files: lcov-integration.info
          flags: integration-tests
          disable_search: true
          fail_ci_if_error: false
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}