OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

DellWarrantyTestConnectionTest.php

5 KB
<?php

declare(strict_types=1);

use OpenNIT\Services\DellWarrantyService;

/**
 * Deckt die Zugangsdaten-Prüfung der Dell-API ab.
 *
 * Der Test-Knopf im Backend meldet drei Zustände: fehlende Eingabe, abgelehnte
 * Anmeldung und erfolgreicher Abruf. Geprüft wird, dass jeder Zustand als
 * solcher erkannt und verständlich benannt wird – ohne die Dell-API zu
 * kontaktieren und ohne den Cache zu beschreiben.
 */
return static function (): void {

    $db = static fn(): object => new class extends \OpenNIT\Core\Database {
        public function __construct() {}
    };

    /**
     * Dienst mit gekapselten HTTP-Aufrufen: Token und Antwort kommen aus dem Test.
     */
    $service = static function (string $id, string $secret) use ($db): object {
        return new class ($db(), $id, $secret) extends DellWarrantyService {
            public ?string $tokenError = null;
            public array   $response   = [];
            public ?string $fetchError = null;
            public int     $fetchCalls = 0;

            protected function fetchToken(): string
            {
                if ($this->tokenError !== null) {
                    throw new \RuntimeException($this->tokenError);
                }
                return 'test-token';
            }

            protected function fetchWarranty(string $serviceTag, string $token): array
            {
                $this->fetchCalls++;
                if ($this->fetchError !== null) {
                    throw new \RuntimeException($this->fetchError);
                }
                return $this->response;
            }
        };
    };

    $antwort = [[
        'productLineDescription' => 'Latitude 5540',
        'shipDate'               => '2023-04-11T00:00:00Z',
        'entitlements'           => [[
            'entitlementType'         => 'INITIAL',
            'serviceLevelDescription' => 'ProSupport',
            'startDate'               => '2023-04-11T00:00:00Z',
            'endDate'                 => (date('Y') + 2) . '-04-11T00:00:00Z',
        ]],
    ]];

    test('Ohne Zugangsdaten wird gar nicht erst angefragt', function () use ($service) {
        $svc = $service('', '');
        $res = $svc->testCredentials('ABCD123');

        assertFalse($res['ok']);
        assertSame(0, $svc->fetchCalls);
        assertTrue(str_contains($res['message'], 'Client Secret'));
    });

    test('Ohne Servicetag wird nur die Anmeldung geprüft', function () use ($service) {
        $svc = $service('id', 'secret');
        $res = $svc->testCredentials(null);

        assertTrue($res['ok']);
        assertSame(0, $svc->fetchCalls);
    });

    test('Ein leerer Servicetag löst keinen Abruf aus', function () use ($service) {
        $svc = $service('id', 'secret');
        $res = $svc->testCredentials('   ');

        assertTrue($res['ok']);
        assertSame(0, $svc->fetchCalls);
    });

    test('Abgelehnte Anmeldung wird als solche gemeldet', function () use ($service) {
        $svc = $service('id', 'falsch');
        $svc->tokenError = 'Dell-Auth fehlgeschlagen (401): invalid_client';
        $res = $svc->testCredentials('ABCD123');

        assertFalse($res['ok']);
        assertSame(0, $svc->fetchCalls);
        assertTrue(str_contains($res['message'], 'invalid_client'));
    });

    test('Erfolgreicher Abruf nennt Modell und Garantieende', function () use ($service, $antwort) {
        $svc = $service('id', 'secret');
        $svc->response = $antwort;
        $res = $svc->testCredentials('abcd123');

        assertTrue($res['ok']);
        assertSame(1, $svc->fetchCalls);
        // Der Servicetag wird normalisiert in der Rückmeldung genannt
        assertTrue(str_contains($res['message'], 'ABCD123'));

        $zeilen = implode(' | ', $res['details']);
        assertTrue(str_contains($zeilen, 'Latitude 5540'));
        assertTrue(str_contains($zeilen, '11.04.' . (date('Y') + 2)));
    });

    test('Unbekannter Servicetag trennt Anmeldung und Abruf', function () use ($service) {
        $svc = $service('id', 'secret');
        $svc->response = [];
        $res = $svc->testCredentials('ZZZZ999');

        assertFalse($res['ok']);
        assertTrue(str_contains($res['message'], 'Anmeldung erfolgreich'));
        assertTrue(str_contains($res['message'], 'nicht gefunden'));
    });

    test('Fehler beim Garantie-Abruf entwertet die Anmeldung nicht', function () use ($service) {
        $svc = $service('id', 'secret');
        $svc->fetchError = 'Dell-API HTTP 403 für Servicetag ABCD123';
        $res = $svc->testCredentials('ABCD123');

        assertFalse($res['ok']);
        assertTrue(str_contains($res['message'], 'Anmeldung erfolgreich'));
        assertTrue(str_contains($res['message'], 'HTTP 403'));
    });
};