name: Integration Tests — Oxide

on:
  push:
    branches: [master, 3.3]
  pull_request:
    branches: [master, 3.3]

permissions:
  contents: read

env:
  CI: true
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
  TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
  CACHE_PREFIX: oxide

jobs:
  test:
    runs-on: ubuntu-latest
    timeout-minutes: 15

    strategy:
      matrix:
        integration:
          - content-resolution
          - parcel
          - postcss-cli
          - rollup
          - rollup-sass
          - tailwindcss-cli
          - vite
          - webpack-4
          - webpack-5
        node-version: [18]
      fail-fast: false

    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Cache node_modules
        uses: actions/cache@v3
        with:
          path: node_modules
          key: ${{ runner.os }}-${{ matrix.node-version }}-${{ env.CACHE_PREFIX }}-node_modules-${{ hashFiles('**/package-lock.json') }}

      # Cargo already skips downloading dependencies if they already exist
      - name: Cache cargo
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      # Cache the `oxide` Rust build
      - name: Cache oxide build
        uses: actions/cache@v3
        with:
          path: |
            ./oxide/target/
            ./oxide/crates/node/*.node
            ./oxide/crates/node/index.js
            ./oxide/crates/node/index.d.ts
          key: ${{ runner.os }}-oxide-${{ hashFiles('./oxide/crates/**/*') }}

      - name: Install dependencies
        run: npm install

      - name: Build Tailwind CSS
        run: npx turbo run build --filter=//

      - name: Test ${{ matrix.integration }}
        run: |
          npx turbo run test --filter=./integrations/${{ matrix.integration }} || \
          npx turbo run test --filter=./integrations/${{ matrix.integration }} || \
          npx turbo run test --filter=./integrations/${{ matrix.integration }} || exit 1
