# CI/CD工作流配置：构建和测试.NET项目
# 该工作流在push到main/master分支或创建pull request时触发
name: CI - Build & Test

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

permissions:
  contents: read

jobs:
  test:
    name: Build and Test
    runs-on: ubuntu-latest

    steps:
      # 检出源代码，设置fetch-depth为0以获取完整的git历史
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      # TruffleHog OSS 扫描步骤
      # 使用 TruffleHog 工具扫描代码库中的敏感信息泄露，如API密钥、密码等
      # 该步骤会比较基础分支和当前提交之间的差异，检测新增内容中是否包含敏感数据
      - name: TruffleHog OSS
        uses: trufflesecurity/trufflehog@v3.92.5
        with:
          # 扫描路径，. 表示扫描整个仓库
          path: .
          # 基础提交哈希，用于与当前提交进行比较
          base: ${{ github.event.before }}
          # 当前提交哈希，作为扫描的目标版本
          head: ${{ github.sha }}

      # 安装和配置.NET SDK版本
      - name: Setup .NET 8
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 8.0.x
    
      - name: Setup .NET 9
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 9.0.x
    
      - name: Setup .NET 10
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 10.0.x

      # 配置NuGet包缓存以加速后续构建
      - name: Cache NuGet packages
        uses: actions/cache@v5
        with:
          path: ~/.nuget/packages
          key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}

      # 执行NuGet包恢复操作
      - name: Restore
        run: dotnet restore
      # 恢复.NET本地工具
      - name: Restore .NET tools
        run: dotnet tool restore
      # 构建项目，使用Release配置且跳过恢复步骤
      - name: Build
        run: dotnet build -c Release --no-restore

      # 运行单元测试，输出TRX格式结果到TestResults目录
      - name: Test - Core
        run: |
          dotnet test GFramework.Core.Tests \
            -c Release \
            --no-build \
            --logger "trx;LogFileName=core-$RANDOM.trx" \
            --results-directory TestResults
    
      - name: Test - SourceGenerators
        run: |
          dotnet test GFramework.SourceGenerators.Tests \
            -c Release \
            --no-build \
            --logger "trx;LogFileName=sg-$RANDOM.trx" \
            --results-directory TestResults
      - name: Generate CTRF report
        run: |
          mkdir -p ctrf

          for trx in TestResults/*.trx; do
            name=$(basename "$trx" .trx)
            echo "Processing $trx -> ctrf/$name.json"

            dotnet tool run DotnetCtrfJsonReporter \
              -p "$trx" \
              -t nunit \
              -d ctrf \
              -f "$name.json"
          done
      
      
      # 生成并发布测试报告，无论测试成功或失败都会执行
      - name: Test Report
        uses: dorny/test-reporter@v2
        if: always()
        with:
          name: .NET Test Results
          path: TestResults/*.trx
          reporter: dotnet-trx
      - name: Publish Test Report
        uses: ctrf-io/github-test-reporter@v1
        with:
          report-path: './ctrf/*.json'
          github-report: true
          pull-request-report: true
          summary-delta-report: true
          insights-report: true
          flaky-rate-report: true
          fail-rate-report: true
          slowest-report: true
          upload-artifact: true
          fetch-previous-results: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        if: always()