Steuerkram/tests/08_LieferantTest.php

94 lines
4.1 KiB
PHP

<?php
declare(strict_types=1);
/**
* Test 8: Lieferantenmanagement
*
* Prüft, ob Lieferanten angelegt, gefunden, aktualisiert und
* einem Beleg zugewiesen werden können.
*/
class LieferantTest extends TestCase
{
protected string $testName = 'Test 8: Lieferantenmanagement';
public function run(): void
{
// 1. Lieferant anlegen
$name = 'Testlieferant GmbH ' . uniqid();
$id = \Steuerkram\Models\Supplier::create($name);
$this->assertGreaterThan(0, $id, 'Lieferant wurde angelegt (ID > 0)');
// 2. find() liefert den angelegten Lieferanten
$supplier = \Steuerkram\Models\Supplier::find($id);
$this->assertNotEmpty($supplier, 'Supplier::find() liefert Datensatz');
$this->assertEquals($name, $supplier['name'], 'Lieferantenname stimmt überein');
// 3. findByName() findet den Lieferanten
$found = \Steuerkram\Models\Supplier::findByName($name);
$this->assertNotEmpty($found, 'Supplier::findByName() findet den Lieferanten');
$this->assertEquals($id, (int)$found['id'], 'ID stimmt überein');
// 4. all() enthält den Lieferanten
$all = \Steuerkram\Models\Supplier::all();
$inList = false;
foreach ($all as $s) {
if ((int)$s['id'] === $id) { $inList = true; break; }
}
$this->assert($inList, 'Lieferant erscheint in Supplier::all()');
// 5. findOrCreate() gibt vorhandenen zurück
$id2 = \Steuerkram\Models\Supplier::findOrCreate($name);
$this->assertEquals($id, $id2, 'findOrCreate() gibt vorhandene ID zurück');
// 6. findOrCreate() legt neuen an
$newName = 'Neuer Lieferant ' . uniqid();
$id3 = \Steuerkram\Models\Supplier::findOrCreate($newName);
$this->assertGreaterThan(0, $id3, 'findOrCreate() legt neuen Lieferanten an');
$this->assert($id3 !== $id, 'Neue ID ist verschieden von der ersten');
// 7. update()
$updatedName = 'Umbenannt ' . uniqid();
\Steuerkram\Models\Supplier::update($id, $updatedName);
$updated = \Steuerkram\Models\Supplier::find($id);
$this->assertEquals($updatedName, $updated['name'], 'Name nach update() korrekt geändert');
// 8. Lieferant einem Beleg zuweisen via Beleg::create() + updateMeta()
$belegNr = 'TEST-SUP-' . uniqid();
$datum = date('Y-m-d');
$belegId = \Steuerkram\Models\Beleg::create([
'beleg_nr' => $belegNr,
'filename' => 'test-lieferant.pdf',
'storage_path' => 'static/uploads/test/test-lieferant.pdf',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', $belegNr),
'beleg_datum' => $datum,
'rechnungs_nr' => 'RE-SUP-001',
'betrag_brutto' => 59.50,
'belegtyp' => 'Eingangsrechnung',
]);
\Steuerkram\Models\Beleg::updateMeta($belegId, [
'rechnungs_nr' => 'RE-SUP-001',
'belegtyp' => 'Eingangsrechnung',
'beleg_datum' => $datum,
'betrag_brutto' => 59.50,
'supplier_id' => $id3,
]);
$beleg = \Steuerkram\Models\Beleg::find($belegId);
$this->assertEquals($id3, (int)$beleg['supplier_id'], 'supplier_id korrekt am Beleg gespeichert');
$this->assertNotEmpty($beleg['supplier_name'], 'supplier_name via JOIN abrufbar');
// 9. Löschen: Lieferant der noch verwendet wird kann nicht gelöscht werden
$deleted = \Steuerkram\Models\Supplier::delete($id3);
$this->assert(!$deleted, 'Lieferant in Verwendung kann nicht gelöscht werden');
// 10. Nicht verwendeten Lieferanten löschen
$unusedName = 'Ungenutzt ' . uniqid();
$unusedId = \Steuerkram\Models\Supplier::create($unusedName);
$deletedOk = \Steuerkram\Models\Supplier::delete($unusedId);
$this->assert($deletedOk, 'Nicht verwendeter Lieferant kann gelöscht werden');
$this->assert(!\Steuerkram\Models\Supplier::find($unusedId), 'Gelöschter Lieferant nicht mehr auffindbar');
}
}