name: e2e-cache

on:
  pull_request:
    paths-ignore:
      - '**.md'
  push:
    branches:
      - main
      - releases/*
    paths-ignore:
      - '**.md'

jobs:
  node-npm-depencies-caching:
    name: Test npm (Node ${{ matrix.node-version}}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
        node-version: [20, 22, 24]
    steps:
      - uses: actions/checkout@v6
      - name: Clean global cache
        run: npm cache clean --force
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      - name: Install dependencies
        run: npm install
      - name: Verify node and npm
        run: __tests__/verify-node.sh "${{ matrix.node-version }}"
        shell: bash

  node-pnpm-depencies-caching:
    name: Test pnpm (Node ${{ matrix.node-version}}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
        node-version: [20, 22, 24]
    steps:
      - uses: actions/checkout@v6
      - name: Install pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 6.10.0
      - name: Generate pnpm file
        run: pnpm install
      - name: Remove dependencies
        shell: pwsh
        run: Remove-Item node_modules -Force -Recurse
      - name: Clean global cache
        run: rm -rf ~/.pnpm-store
        shell: bash
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'pnpm'
      - name: Install dependencies
        run: pnpm install
      - name: Verify node and pnpm
        run: __tests__/verify-node.sh "${{ matrix.node-version }}"
        shell: bash

  node-yarn1-depencies-caching:
    name: Test yarn 1 (Node ${{ matrix.node-version}}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
        node-version: [20, 22, 24]
    steps:
      - uses: actions/checkout@v6
      - name: Yarn version
        run: yarn --version
      - name: Generate yarn file
        run: yarn install --ignore-engines
      - name: Remove dependencies
        shell: pwsh
        run: Remove-Item node_modules -Force -Recurse
      - name: Clean global cache
        run: yarn cache clean
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
      - name: Install dependencies
        run: yarn install --ignore-engines
      - name: Verify node and yarn
        run: __tests__/verify-node.sh "${{ matrix.node-version }}"
        shell: bash

  node-yarn3-depencies-caching:
    name: Test yarn 3 (Node ${{ matrix.node-version}}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    env:
      YARN_ENABLE_IMMUTABLE_INSTALLS: false
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
        node-version: [20, 22, 24]
    steps:
      - uses: actions/checkout@v6
      - name: Update yarn
        run: yarn set version 3.6.4
      - name: Yarn version
        run: yarn --version
      - name: Generate simple .yarnrc.yml
        run: |
          echo "nodeLinker: node-modules" >> .yarnrc.yml
      - name: Generate yarn file
        run: yarn install
      - name: Remove dependencies
        shell: pwsh
        run: Remove-Item node_modules -Force -Recurse
      - name: Clean global cache
        run: yarn cache clean --all
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
      - name: Install dependencies
        run: yarn install
      - name: Verify node and yarn
        run: __tests__/verify-node.sh "${{ matrix.node-version }}"
        shell: bash

  yarn-subprojects:
    name: Test yarn subprojects
    strategy:
      matrix:
        node-version: [20, 22, 24]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: prepare sub-projects
        run: __tests__/prepare-yarn-subprojects.sh yarn1

      # expect
      #  - no errors
      #  - log
      #    ##[debug]Cache Paths:
      #    ##[debug]["sub2/.yarn/cache","sub3/.yarn/cache","../../../.cache/yarn/v6"]
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
          cache-dependency-path: |
            **/*.lock
            yarn.lock

  yarn-subprojects-berry-local:
    name: Test yarn subprojects all locally managed
    strategy:
      matrix:
        node-version: [20, 22, 24]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: prepare sub-projects
        run: __tests__/prepare-yarn-subprojects.sh keepcache keepcache

      # expect
      #  - no errors
      #  - log
      #    ##[info]All dependencies are managed locally by yarn3, the previous cache can be used
      #    ##[debug]["node-cache-Linux-yarn-401024703386272f1a950c9f014cbb1bb79a7a5b6e1fb00e8b90d06734af41ee","node-cache-Linux-yarn"]
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
          cache-dependency-path: |
            sub2/*.lock
            sub3/*.lock

  yarn-subprojects-berry-global:
    name: Test yarn subprojects some locally managed
    strategy:
      matrix:
        node-version: [20, 22, 24]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: prepare sub-projects
        run: __tests__/prepare-yarn-subprojects.sh global

      # expect
      #  - no errors
      #  - log must
      #    ##[debug]"/home/runner/work/setup-node-test/setup-node-test/sub2" dependencies are managed by yarn 3 locally
      #    ##[debug]"/home/runner/work/setup-node-test/setup-node-test/sub3" dependencies are not managed by yarn 3 locally
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
          cache-dependency-path: |
            sub2/*.lock
            sub3/*.lock

  yarn-subprojects-berry-git:
    name: Test yarn subprojects managed by git
    strategy:
      matrix:
        node-version: [20, 22, 24]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - name: prepare sub-projects
        run: /bin/bash __tests__/prepare-yarn-subprojects.sh keepcache

      # expect
      #  - no errors
      #  - log
      #    [debug]"/home/runner/work/setup-node-test/setup-node-test/sub2" has .yarn/cache - dependencies are kept in the repository
      #    [debug]"/home/runner/work/setup-node-test/setup-node-test/sub3" has .yarn/cache - dependencies are kept in the repository
      #    [debug]["node-cache-Linux-yarn-401024703386272f1a950c9f014cbb1bb79a7a5b6e1fb00e8b90d06734af41ee"]
      - name: Setup Node
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'yarn'
          cache-dependency-path: |
            sub2/*.lock
            sub3/*.lock

  node-npm-packageManager-auto-cache:
    name: Test auto cache with top-level packageManager
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
        node-version: [20, 22, 24]
    steps:
      - uses: actions/checkout@v6
      - name: Create package.json with packageManager field
        run: |
          echo '{ "name": "test-project", "version": "1.0.0", "packageManager": "npm@8.0.0" }' > package.json
      - name: Clean global cache
        run: npm cache clean --force
      - name: Setup Node with caching enabled
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Verify node and npm
        run: __tests__/verify-node.sh "${{ matrix.node-version }}"
        shell: bash

  node-npm-devEngines-auto-cache:
    name: Test auto cache with devEngines.packageManager
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest, macos-latest-large]
        node-version: [20, 22, 24]
    steps:
      - uses: actions/checkout@v6
      - name: Create package.json with devEngines field
        run: |
          echo '{
            "name": "test-project",
            "version": "1.0.0",
            "devEngines": {
              "packageManager": {
                "name": "npm",
                "onFail": "error"
              }
            }
          }' > package.json
      - name: Clean global cache
        run: npm cache clean --force
      - name: Setup Node with caching enabled
        uses: ./
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install dependencies
        run: npm install
      - name: Verify node and npm
        run: __tests__/verify-node.sh "${{ matrix.node-version }}"
        shell: bash
