Quelltext des aktuellen Standes
<?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;"));
});
};