OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

AssetSupplierTest.php

4 KB
<?php

declare(strict_types=1);

/**
 * Deckt den Lieferanten eines Geräts ab: dass der Name einer verknüpften Firma
 * aus der Firma selbst kommt und nicht aus einer Kopie, die veralten kann – und
 * dass der Audit-Vergleich dieselbe Quelle nutzt wie das Schreiben.
 */
return static function (): void {

    $wurzel = dirname(__DIR__);
    $src    = static fn (): string => (string)file_get_contents($wurzel . '/src/Controllers/AssetController.php');

    test('Die Geräteseite nimmt den aktuellen Namen der verknüpften Firma', function () use ($src) {
        // Die Kopie in `assets.supplier_name` kann leer oder veraltet sein; ein
        // leerer Name ergäbe auf der Detailseite einen Link ohne Beschriftung.
        $von = strpos($src(), 'public function show(');
        $bis = strpos($src(), 'WHERE a.id = ?', (int)$von);
        $query = substr($src(), (int)$von, (int)$bis - (int)$von);

        assertTrue(str_contains($query, 'LEFT JOIN companies co'), 'Kein Join auf die Firma');
        // Eigener Aliasname statt eines zweiten `supplier_name`: welche von zwei
        // gleichnamigen Spalten ein Treiber liefert, soll hier nichts entscheiden.
        assertTrue(str_contains($query, 'co.name AS supplier_company_name'), 'Firmenname fehlt in der Abfrage');
        assertFalse(str_contains($query, 'AS supplier_name'), 'Zweite Spalte gleichen Namens');

        // Die Auflösung steht nach der Prüfung auf einen Treffer.
        $ganz  = $src();
        $von   = strpos($ganz, 'public function show(');
        $trefferPruefung = strpos($ganz, "if (!\$asset) {", (int)$von);
        $aufloesung      = strpos($ganz, "\$asset['supplier_name'] = \$asset['supplier_company_name'];", (int)$von);
        assertTrue($aufloesung > $trefferPruefung, 'Auflösung greift auf ein mögliches false zu');
    });

    test('Das Vorgehen entspricht dem der übrigen Module', function () use ($wurzel) {
        // Bestellungen und Katalog lösen denselben Fall bereits so auf; das
        // Inventar soll keine zweite Lösung danebenstellen.
        $orders  = (string)file_get_contents($wurzel . '/src/Content/OrderManager.php');
        $catalog = (string)file_get_contents($wurzel . '/src/Catalog/CatalogManager.php');

        assertTrue(str_contains($orders, 'COALESCE(c.name, o.supplier_text) AS supplier_name'));
        assertTrue(str_contains($catalog, 'COALESCE(comp.name, p.supplier_name_snapshot) AS supplier_name'));
    });

    test('Der Audit-Vergleich löst den alten Lieferanten wie den neuen auf', function () use ($src) {
        // Der neue Wert entsteht aus `supplier_company_id`; läse der alte die
        // Spalte `supplier_name`, verglichen sich zwei verschiedene Quellen –
        // jedes Speichern hätte dann eine Änderung gemeldet, die keine ist.
        $von = strpos($src(), 'public function update(');
        $bis = strpos($src(), '$this->db()->update(\'assets\'', (int)$von);
        $block = substr($src(), (int)$von, (int)$bis - (int)$von);

        assertTrue(str_contains($block, '$oldSupplierName'), 'Alter Wert wird nicht aufgelöst');
        assertTrue(
            str_contains($block, "'Lieferant'      => \$oldSupplierName,"),
            'Alter Wert stammt weiterhin aus der Kopie'
        );
        assertFalse(
            str_contains($block, "'Lieferant'      => \$asset['supplier_name'] ?? null,"),
            'Alte Auflösung noch vorhanden'
        );

        // Beide Seiten fragen dieselbe Tabelle.
        assertSame(
            2,
            substr_count($block, "SELECT name FROM companies WHERE id = ?"),
            'Alter und neuer Wert kommen nicht aus derselben Quelle'
        );
    });

    test('Ohne Kontakte-Modul bleibt der freie Text maßgeblich', function () use ($src) {
        $von = strpos($src(), 'public function update(');
        $bis = strpos($src(), '$oldValues = array_filter', (int)$von);
        $block = substr($src(), (int)$von, (int)$bis - (int)$von);

        // Die Auflösung greift nur bei aktivem Modul und verknüpfter Firma.
        assertTrue(str_contains($block, '$this->isContactsEnabled() && !empty($asset[\'supplier_company_id\'])'));
        // Ohne beides bleibt der gespeicherte Wert stehen.
        assertTrue(str_contains($block, "\$oldSupplierName = \$asset['supplier_name'] ?? null;"));
    });
};