← Code-Übersicht

DokumentationVersionTest.php

Pfad: tests/DokumentationVersionTest.php

Ext: php

Größe: 2697 Bytes

Geändert: 2026-07-16 08:33:23+02

<?php
declare(strict_types=1);

namespace Tests;

use Demo\Application\Dokumentation\ListeDokumentationVersionen;
use Demo\Application\Dokumentation\ZeigeDokumentationVersion;
use Demo\Domain\Dokumentation\Dokumentation;
use Demo\Domain\Dokumentation\DokumentationHistorie;
use Demo\Domain\Dokumentation\Version;
use PHPUnit\Framework\TestCase;

/**
 * Prueft die Versions-Anwendungsfaelle gegen einen In-Memory-Fake des Ports.
 */
final class DokumentationVersionTest extends TestCase
{
    /**
     * Registriert den Autoloader vor jedem Testfall.
     */
    protected function setUp(): void
    {
        $root = dirname(__DIR__);
        require_once $root . '/src/Autoloader.php';
        (new \Demo\Autoloader($root . '/src'))->register();
    }

    /**
     * Erzeugt einen Fake-Port mit fester Version und festem Snapshot.
     *
     * @return DokumentationHistorie In-Memory-Fake.
     */
    private function historie(): DokumentationHistorie
    {
        return new class implements DokumentationHistorie {
            public function versionen(string $slug): array
            {
                return $slug === 'a' ? [new Version(7, '2026-07-16 00:00:00+02', 'UPDATE')] : [];
            }

            public function beiVersion(string $slug, int $id): ?Dokumentation
            {
                return ($slug === 'a' && $id === 7)
                    ? new Dokumentation(1, 'a', 'Titel', '# alt', ['x'], '2026-07-15', '2026-07-15')
                    : null;
            }
        };
    }

    /**
     * Die Versionsliste wird durchgereicht.
     */
    public function testListeLiefertVersionen(): void
    {
        $versionen = (new ListeDokumentationVersionen($this->historie()))->execute('a');
        self::assertCount(1, $versionen);
        self::assertSame(7, $versionen[0]->id);
        self::assertSame('UPDATE', $versionen[0]->operation);
    }

    /**
     * Ohne History bleibt die Liste leer.
     */
    public function testListeLeerOhneHistory(): void
    {
        self::assertSame([], (new ListeDokumentationVersionen($this->historie()))->execute('b'));
    }

    /**
     * Der Snapshot einer bekannten Version wird geliefert.
     */
    public function testZeigeVersionLiefertSnapshot(): void
    {
        $dok = (new ZeigeDokumentationVersion($this->historie()))->execute('a', 7);
        self::assertNotNull($dok);
        self::assertSame('Titel', $dok->titel);
        self::assertSame('# alt', $dok->body);
    }

    /**
     * Unbekannte Version liefert null.
     */
    public function testZeigeVersionNullWennUnbekannt(): void
    {
        self::assertNull((new ZeigeDokumentationVersion($this->historie()))->execute('a', 999));
    }
}