name: Tests

on:
  pull_request:
    branches:
      - main
      - releases/**
  push:
    branches:
      - main
      - releases/**

jobs:
  # Build and unit test
  build:
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Setup Node.js 20.x
      uses: actions/setup-node@v3
      with:
        node-version: 20.x
        cache: npm
    - run: npm ci
    - name: Prettier Format Check
      run: npm run format-check
    - name: ESLint Check
      run: npm run lint
    - name: Build & Test
      run: npm run test

  # End to end save and restore
  test-save:
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Generate files in working directory
      shell: bash
      run: __tests__/create-cache-files.sh ${{ runner.os }} test-cache
    - name: Generate files outside working directory
      shell: bash
      run: __tests__/create-cache-files.sh ${{ runner.os }} ~/test-cache
    - name: Save cache
      uses: ./
      with:
        key: test-${{ runner.os }}-${{ github.run_id }}
        path: |
          test-cache
          ~/test-cache
  test-restore:
    needs: test-save
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
      fail-fast: false
    runs-on: ${{ matrix.os }}
    steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Restore cache
      uses: ./
      with:
        key: test-${{ runner.os }}-${{ github.run_id }}
        path: |
          test-cache
          ~/test-cache
    - name: Verify cache files in working directory
      shell: bash
      run: __tests__/verify-cache-files.sh ${{ runner.os }} test-cache
    - name: Verify cache files outside working directory
      shell: bash
      run: __tests__/verify-cache-files.sh ${{ runner.os }} ~/test-cache

  # End to end with proxy
  test-proxy-save:
    runs-on: ubuntu-latest
    container:
      image: ubuntu:latest
      options: --dns 127.0.0.1
    services:
      squid-proxy:
        image: ubuntu/squid:latest
        ports:
          - 3128:3128
    env:
      https_proxy: http://squid-proxy:3128
    steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Generate files
      run: __tests__/create-cache-files.sh proxy test-cache
    - name: Save cache
      uses: ./
      with:
        key: test-proxy-${{ github.run_id }}
        path: test-cache
  test-proxy-restore:
    needs: test-proxy-save
    runs-on: ubuntu-latest
    container:
      image: ubuntu:latest
      options: --dns 127.0.0.1
    services:
      squid-proxy:
        image: ubuntu/squid:latest
        ports:
          - 3128:3128
    env:
      https_proxy: http://squid-proxy:3128
    steps:
    - name: Checkout
      uses: actions/checkout@v3
    - name: Restore cache
      uses: ./
      with:
        key: test-proxy-${{ github.run_id }}
        path: test-cache
    - name: Verify cache
      run: __tests__/verify-cache-files.sh proxy test-cache