name: Build and Test

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
    name: Dotnet build
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - name: Setup dotnet
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: |
           8.0.x
           9.0.x
      - name: Build
        run: dotnet build --configuration Release 
      - name: Test
        run: dotnet test --configuration Release --collect:"Code Coverage;Format=Cobertura" --logger trx --results-directory TestResults --settings CodeCoverage.runsettings --no-build
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          directory: ./TestResults
          files: '*.cobertura.xml'
      - name: Upload test results
        uses: actions/upload-artifact@v5
        with:
          name: test-results-${{ matrix.os }}
          path: ./TestResults
        if: ${{ always() }} # Always run this step even on failure

  # Test code gen for visual studio compatibility >> https://github.com/kubernetes-client/csharp/pull/1008
  codgen:
    runs-on: windows-latest
    name: MSBuild build
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - name: Add msbuild to PATH
        uses: microsoft/setup-msbuild@v2
      - name: Setup dotnet SDK
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: '9.0.x'
      - name: Restore nugets (msbuild)
        run: msbuild .\src\KubernetesClient\ -t:restore -p:RestorePackagesConfig=true
      - name: Build (msbuild)
        run: msbuild .\src\KubernetesClient\

  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - name: Setup dotnet
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: |
           8.0.x
           9.0.x
      - name: Minikube
        run: minikube start
      - name: Test
        run: |
          true > skip.log
          env K8S_E2E_MINIKUBE=1 dotnet test tests/E2E.Tests --logger "SkipTestLogger;file=$PWD/skip.log" -p:BuildInParallel=false
          if [ -s skip.log ]; then
            cat skip.log
            echo "CASES MUST NOT BE SKIPPED"
            exit 1
          fi    
      - name: AOT Test
        run: |
          true > skip.log
          env K8S_E2E_MINIKUBE=1 dotnet test tests/E2E.Aot.Tests --logger "SkipTestLogger;file=$PWD/skip.log" -p:BuildInParallel=false
          if [ -s skip.log ]; then
            cat skip.log
            echo "CASES MUST NOT BE SKIPPED"
            exit 1
          fi              

on:
  pull_request:
    types: [assigned, opened, synchronize, reopened]
