OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

PrivacyFilterTest.php

3 KB
<?php

declare(strict_types=1);

use OpenNIT\AI\PrivacyFilter;

return static function (): void {

    test('auto: Cloud-Anbieter werden anonymisiert', function () {
        assertTrue(PrivacyFilter::resolveMode(['provider' => 'openai']), 'openai → an');
        assertTrue(PrivacyFilter::resolveMode(['provider' => 'anthropic']), 'anthropic → an');
        assertTrue(PrivacyFilter::resolveMode(['provider' => 'deepseek']), 'deepseek → an');
    });

    test('auto: nur ein nachweislich hausinterner Endpunkt schaltet ab', function () {
        $local = static fn(string $url): array => ['provider' => 'openai_compatible', 'custom_base_url' => $url];

        assertFalse(PrivacyFilter::resolveMode($local('http://localhost:11434/v1')), 'localhost');
        assertFalse(PrivacyFilter::resolveMode($local('http://ollama.internal/v1')), '.internal');
        assertFalse(PrivacyFilter::resolveMode($local('http://ki.firma.local/v1')), '.local');
        assertFalse(PrivacyFilter::resolveMode($local('http://192.168.1.10:11434/v1')), 'privates Netz');
        assertFalse(PrivacyFilter::resolveMode($local('http://10.0.0.5/v1')), 'privates Netz (10er)');
    });

    test('auto: OpenAI-kompatibel ohne bekannte Adresse bleibt anonymisiert', function () {
        // Ohne verwertbare Adresse ist der Endpunkt unbekannt – im Zweifel schützen.
        assertTrue(PrivacyFilter::resolveMode(['provider' => 'openai_compatible']), 'keine URL');
        assertTrue(PrivacyFilter::resolveMode([
            'provider' => 'openai_compatible', 'custom_base_url' => '',
        ]), 'leere URL');
    });

    test('auto: OpenAI-kompatibler Cloud-Dienst zählt nicht als hausintern', function () {
        assertTrue(PrivacyFilter::resolveMode([
            'provider' => 'openai_compatible', 'custom_base_url' => 'https://openrouter.ai/api/v1',
        ]), 'OpenRouter');
        assertTrue(PrivacyFilter::resolveMode([
            'provider' => 'openai_compatible', 'custom_base_url' => 'https://api.groq.com/openai/v1',
        ]), 'Groq');
        assertTrue(PrivacyFilter::resolveMode([
            'provider' => 'openai_compatible', 'custom_base_url' => 'http://8.8.8.8/v1',
        ]), 'öffentliche IP');
    });

    test('explizites on/off überschreibt', function () {
        assertFalse(PrivacyFilter::resolveMode(['provider' => 'openai', 'privacy_mode' => 'off']), 'off');
        assertTrue(PrivacyFilter::resolveMode(['provider' => 'openai_compatible', 'privacy_mode' => 'on']), 'on');
    });

    test('Default ohne Provider = an (sicher)', function () {
        assertTrue(PrivacyFilter::resolveMode([]), 'leer → an');
    });

    test('forConfig liefert passend konfigurierten Service', function () {
        $on  = PrivacyFilter::forConfig(['provider' => 'openai']);
        $off = PrivacyFilter::forConfig([
            'provider' => 'openai_compatible', 'custom_base_url' => 'http://localhost:11434/v1',
        ]);
        assertTrue($on->isEnabled(), 'cloud aktiviert');
        assertFalse($off->isEnabled(), 'hausintern deaktiviert');
    });

    test('describe begründet den hausinternen Fall gesondert', function () {
        $inHouse = PrivacyFilter::describe([
            'provider' => 'openai_compatible', 'custom_base_url' => 'http://localhost:11434/v1',
        ]);
        assertTrue(str_contains($inHouse, 'im Haus'), 'Begründung nennt den Grund');
        assertTrue(str_contains(PrivacyFilter::describe(['provider' => 'openai']), 'anonymisiert'), 'Cloud');
    });
};