Files
servicedesk/src/tests/Feature/AdminAiIntegrationConfigTest.php
Kacper 313e01ad24 v1.2.1
- Generic AI integration (Admin > Integracje > "Integracja AI"), optional and
  off by default: an OpenAI-compatible /chat/completions client (Groq, OpenAI,
  or a self-hosted Ollama instance) configured by base URL, optional API key,
  model, and an SSL-verification toggle. Foundation for the two AI features
  below and anything else that wants an LLM call in the future.
- BookStack automatic content tagging (AI): "Otaguj nową treść"/"Otaguj
  wszystko ponownie" buttons plus `php artisan bookstack:tag-content`
  (--dry-run/--force/--limit=N) tag every book/chapter/page with matching
  helpdesk subcategory names, idempotent by default.
- BookStack search refinement: "Przeszukuj" is now three independent
  checkboxes (Książki/Strony/Rozdziały) instead of a single dropdown, plus a
  new "Szukaj po" setting (nazwa/tagi/oba) — tag matching uses the bare
  subcategory name, matching what auto-tagging writes.
- AI-driven ticket triage + summary (Admin > Integracje > "Automatyzacja AI
  dla zgłoszeń", via new scheduled ai:run-ticket-automation): five toggles
  auto-assign/correct category+subcategory, rewrite an unclear subject, and
  set priority from content, once per ticket in the background; every change
  is logged in the ticket's history. Separately, an AI summary + suggested
  action for every ticket, shown to operators only, with an admin-editable
  prompt.
- Operators can now reassign a ticket to any team, not just one they belong
  to.
- The auto-refresh countdown badges (ticket view, operator queue) are now
  clickable — fetch immediately and reset the countdown.
- All 7 "cyclical" intervals (3 browser refresh countdowns, the notification
  bell poll, and the 4 background scheduled commands) are now configurable
  from Admin > Konfiguracja instead of fixed in code.
- Fixed: an operator viewing a ticket that's deleted or moved outside their
  team scope mid-session is now redirected to the operator queue instead of
  hitting an error.
- Docs: README/ARCHITECTURE/CLAUDE/install/wiki updated for all of the above.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 13:38:39 +02:00

62 lines
2.3 KiB
PHP

<?php
use App\Livewire\Admin\Panel;
use App\Models\Setting;
use App\Support\Settings;
use Illuminate\Support\Facades\Http;
use Livewire\Livewire;
test('the Integracje tab shows the Integracja AI card', function () {
$admin = adminUser();
Livewire::actingAs($admin)->test(Panel::class, ['tab' => 'integrations'])
->assertSee('Integracja AI');
});
test('saving the AI config persists settings and encrypts the api key at rest', function () {
$admin = adminUser();
Livewire::actingAs($admin)->test(Panel::class, ['tab' => 'integrations'])
->set('aiConfig.enabled', true)
->set('aiConfig.baseUrl', 'https://api.groq.test/openai/v1')
->set('aiConfig.apiKey', 'super-secret-key')
->set('aiConfig.model', 'llama-3.3-70b-versatile')
->set('aiConfig.verifySsl', true)
->call('saveAiConfig')
->assertOk();
expect(Settings::get('ai_base_url'))->toBe('https://api.groq.test/openai/v1');
expect(Settings::get('ai_model'))->toBe('llama-3.3-70b-versatile');
expect(Settings::get('ai_api_key'))->toBe('super-secret-key');
$stored = Setting::query()->where('key', 'ai_api_key')->value('value');
expect($stored)->not->toBe('super-secret-key');
});
test('leaving the api key field blank on save keeps the previously stored key', function () {
Settings::set('ai_api_key', 'already-stored-key');
$admin = adminUser();
Livewire::actingAs($admin)->test(Panel::class, ['tab' => 'integrations'])
->set('aiConfig.enabled', true)
->set('aiConfig.baseUrl', 'https://api.groq.test/openai/v1')
->set('aiConfig.model', 'llama-3.3-70b-versatile')
->call('saveAiConfig')
->assertOk();
expect(Settings::get('ai_api_key'))->toBe('already-stored-key');
});
test('testAiConnection reports the result of a live probe using unsaved form values', function () {
Http::fake(['api.groq.test/*' => Http::response(['choices' => [['message' => ['content' => 'pong']]]])]);
$admin = adminUser();
Livewire::actingAs($admin)->test(Panel::class, ['tab' => 'integrations'])
->set('aiConfig.enabled', true)
->set('aiConfig.baseUrl', 'https://api.groq.test/openai/v1')
->set('aiConfig.apiKey', 'key')
->set('aiConfig.model', 'llama-3.3-70b-versatile')
->call('testAiConnection')
->assertSet('aiTestResult', 'ok');
});