# πŸ§ͺ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ тСстирования OpenAI ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ## ВСстированиС Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±-интСрфСйс ### 1. Basic Test - ΠšΠ²Π°Ρ€Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅Π·ΡŽΠΌΠ΅ 1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ http://localhost:5000 2. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ "AI Summary (OpenAI)" 3. ΠžΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠŸΡƒΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: `.` 4. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠŸΠ΅Ρ€ΠΈΠΎΠ΄: "Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ²Π°Ρ€Ρ‚Π°Π»" 5. НаТмитС "ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ AI Summary" 6. ΠžΠΆΠΈΠ΄Π°ΠΉΡ‚Π΅ 5-10 сСкунд 7. ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ Ρ€Π΅Π·ΡŽΠΌΠ΅ ΠΎΡ‚ GPT ### 2. Custom Period Test 1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ "AI Summary (OpenAI)" 2. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠŸΠ΅Ρ€ΠΈΠΎΠ΄: "ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄" 3. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅: - ΠΠ°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π΄Π°Ρ‚Π°: `2024-01-01` - ΠšΠΎΠ½Π΅Ρ‡Π½Π°Ρ Π΄Π°Ρ‚Π°: `2024-01-31` 4. НаТмитС "ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ AI Summary" ### 3. Different Repository Test 1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ "AI Summary (OpenAI)" 2. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠŸΡƒΡ‚ΡŒ: `C:\Path\To\Your\Repo` (ΠΈΠ»ΠΈ `/home/user/project`) 3. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠŸΠ΅Ρ€ΠΈΠΎΠ΄: "Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ²Π°Ρ€Ρ‚Π°Π»" 4. НаТмитС "ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ AI Summary" --- ## ВСстированиС Ρ‡Π΅Ρ€Π΅Π· curl/PowerShell ### Setup для всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ```bash # ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ URL $API = "http://localhost:5000" $ContentType = "application/json" ``` ### Test 1: Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ запрос - Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ²Π°Ρ€Ρ‚Π°Π» ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "period": "quarter" }' ``` **PowerShell:** ```powershell $body = @{ period = "quarter" } | ConvertTo-Json Invoke-RestMethod -Uri "$API/api/summary/ai" ` -Method Post ` -Body $body ` -ContentType $ContentType ``` ### Test 2: ΠŸΠΎΠ»ΡƒΠ³ΠΎΠ΄ΠΎΠ²ΠΎΠ΅ Ρ€Π΅Π·ΡŽΠΌΠ΅ ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "period": "halfyear" }' ``` ### Test 3: ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "startDate": "2024-01-01", "endDate": "2024-01-31" }' ``` ### Test 4: ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "repositoryPath": "C:/Projects/MyProject", "period": "quarter" }' ``` **PowerShell:** ```powershell $body = @{ repositoryPath = "C:/Projects/MyProject" period = "quarter" } | ConvertTo-Json Invoke-RestMethod -Uri "$API/api/summary/ai" ` -Method Post ` -Body $body ` -ContentType $ContentType ``` ### Test 5: ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "repositoryPath": ".", "startDate": "2024-01-01", "endDate": "2024-12-31" }' ``` --- ## Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Traditional vs AI Summary ### Test: Π—Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° саммари ```powershell $traditional = Invoke-RestMethod -Uri "$API/api/summary" ` -Method Post ` -Body (@{ period = "quarter" } | ConvertTo-Json) ` -ContentType "application/json" $ai = Invoke-RestMethod -Uri "$API/api/summary/ai" ` -Method Post ` -Body (@{ period = "quarter" } | ConvertTo-Json) ` -ContentType "application/json" # ВывСсти results Write-Host "=== TRADITIONAL SUMMARY ===" -ForegroundColor Yellow Write-Host $traditional.stats | Format-Table Write-Host "`n=== AI SUMMARY ===" -ForegroundColor Green Write-Host $ai.summary Write-Host "`nОба запроса ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹!" ``` --- ## ВСстированиС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ### Test 1: НСвСрный ΠΏΡƒΡ‚ΡŒ рСпозитория ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "repositoryPath": "C:/NonExistent/Path", "period": "quarter" }' ``` **ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ:** 400 Bad Request с сообщСниСм ΠΎΠ± ошибкС ### Test 2: ΠŸΡƒΡΡ‚ΠΎΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (Π±Π΅Π· ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²) ```bash curl -X POST $API/api/summary/ai ` -H "Content-Type: $ContentType" ` -d '{ "repositoryPath": ".", "startDate": "2024-12-31", "endDate": "2024-12-31" }' ``` **ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ:** 200 OK с сообщСниСм "НСт ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² для Π°Π½Π°Π»ΠΈΠ·Π°" ### Test 3: НСвалидный API ΠΊΠ»ΡŽΡ‡ 1. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ Π² `appsettings.json` Π½Π° `sk-invalid-key` 2. ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 3. ΠžΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ запрос **ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ:** 500 Internal Server Error с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± ошибкС OpenAI --- ## ВСстированиС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ### Test: Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (мноТСство ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²) ```powershell # Π˜Π·ΠΌΠ΅Ρ€ΠΈΠΌ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ $sw = [System.Diagnostics.Stopwatch]::StartNew() $result = Invoke-RestMethod -Uri "$API/api/summary/ai" ` -Method Post ` -Body (@{ period = "halfyear" } | ConvertTo-Json) ` -ContentType "application/json" $sw.Stop() Write-Host "ВрСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: $($sw.ElapsedMilliseconds) мс" Write-Host "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²: $($result.commitsCount)" Write-Host "Π”Π»ΠΈΠ½Π° Ρ€Π΅Π·ΡŽΠΌΠ΅: $($result.summary.Length) символов" ``` ### Test: ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы ```powershell # Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ 5 ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов 1..5 | ForEach-Object -Parallel { Invoke-RestMethod -Uri "http://localhost:5000/api/summary/ai" ` -Method Post ` -Body (@{ period = "quarter" } | ConvertTo-Json) ` -ContentType "application/json" | Out-Null Write-Host "Запрос $_ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½" } -ThrottleLimit 5 ``` --- ## ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ API ### Health Check ```bash curl http://localhost:5000/health ``` **ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚:** ```json { "status": "healthy", "timestamp": "2024-01-21T10:30:00.000Z" } ``` --- ## ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ### Swagger UI 1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ http://localhost:5000/swagger 2. НайдитС endpoint `POST /api/summary/ai` 3. НаТмитС "Try it out" 4. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ 5. НаТмитС "Execute" --- ## Валидация Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° структуры ΠΎΡ‚Π²Π΅Ρ‚Π° ```powershell $response = Invoke-RestMethod -Uri "http://localhost:5000/api/summary/ai" ` -Method Post ` -Body (@{ period = "quarter" } | ConvertTo-Json) ` -ContentType "application/json" # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ $hasRequiredFields = @( $response.PSObject.Properties.Name -contains "summary", $response.PSObject.Properties.Name -contains "periodInfo", $response.PSObject.Properties.Name -contains "commitsCount", $response.PSObject.Properties.Name -contains "commitMessages" ) | Where-Object { $_ -eq $true } if ($hasRequiredFields.Count -eq 4) { Write-Host "βœ… Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°" } else { Write-Host "❌ ΠΠ΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ поля Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅" } # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ саммари Π½Π΅ пуст if ($response.summary.Length -gt 0) { Write-Host "βœ… Π‘Π°ΠΌΠΌΠ°Ρ€ΠΈ содСрТит тСкст" } else { Write-Host "❌ Π‘Π°ΠΌΠΌΠ°Ρ€ΠΈ пуст" } ``` --- ## Loggging ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ### Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ `appsettings.json`: ```json { "Logging": { "LogLevel": { "Default": "Debug", "Microsoft.AspNetCore": "Debug", "PerfReviewSummarizer.Api.Services": "Debug" } } } ``` ### ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠŸΡ€ΠΈ запускС прилоТСния Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ всС Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов. --- ## Π§Π΅ΠΊ-лист для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ тСстирования - [ ] Π’Π΅Π±-интСрфСйс загруТаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ - [ ] Π’ΠΊΠ»Π°Π΄ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ - [ ] Traditional Summary Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ - [ ] AI Summary Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΊΠ²Π°Ρ€Ρ‚Π΅Π»ΠΎΠΌ - [ ] AI Summary Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΠΎΠ»ΡƒΠ³ΠΎΠ΄ΠΈΠ΅ΠΌ - [ ] AI Summary Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠΌ - [ ] ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ - [ ] Health check endpoint ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ - [ ] Swagger UI доступСн ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ - [ ] API ΠΊΠ»ΡŽΡ‡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ - [ ] Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ содСрТат ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ структуру - [ ] РСзюмС Π½Π° русском языкС - [ ] РСзюмС содСрТит ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ - [ ] ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ приСмлСмая (<15 сСкунд) --- ## πŸ’‘ ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ### ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ API ```bash curl http://localhost:5000/health -i ``` ### ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ```bash curl "http://localhost:5000/api/commits?period=quarter" ``` ### Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ two summaries ```bash # Traditional curl -X POST http://localhost:5000/api/summary ` -d '{"period":"quarter"}' -H "Content-Type: application/json" # AI curl -X POST http://localhost:5000/api/summary/ai ` -d '{"period":"quarter"}' -H "Content-Type: application/json" ``` --- **ΠΠ°ΡΠ»Π°ΠΆΠ΄Π°ΠΉΡ‚Π΅ΡΡŒ тСстированиСм! πŸš€**