← Code-Übersicht

CodeTest.php

Pfad: tests/CodeTest.php

Ext: php

Größe: 3300 Bytes

Geändert: 2026-07-16 10:05:56+02

<?php
declare(strict_types=1);

namespace Tests;

use Demo\Application\Code\ListeCodeDateien;
use Demo\Application\Code\ListeCodeDateiVersionen;
use Demo\Application\Code\ZeigeCodeDatei;
use Demo\Application\Code\ZeigeCodeDateiVersion;
use Demo\Domain\Code\CodeDatei;
use Demo\Domain\Code\CodeDateiHistorie;
use Demo\Domain\Code\CodeDateiRepository;
use Demo\Domain\Code\CodeVersion;
use PHPUnit\Framework\TestCase;

/**
 * Testet die Code-Usecases gegen In-Memory-Fakes.
 */
final class CodeTest extends TestCase
{
    private array $dateien;
    private array $versionen;

    protected function setUp(): void
    {
        $root = dirname(__DIR__);
        require_once $root . '/src/Autoloader.php';
        (new \Demo\Autoloader($root . '/src'))->register();

        $code = new CodeDatei(
            5,
            'src/CodeTest.php',
            'CodeTest.php',
            'php',
            'echo 1;',
            'hash',
            7,
            '2026-07-16T12:00:00Z',
            '2026-07-15T12:00:00Z'
        );
        $this->dateien = [$code];
        $this->versionen = [new CodeVersion(4, '2026-07-16T11:00:00Z', 'UPDATE')];
    }

    private function dateiRepository(): CodeDateiRepository
    {
        return new class($this->dateien) implements CodeDateiRepository {
            private array $dateien;
            public function __construct(array $dateien)
            {
                $this->dateien = $dateien;
            }
            public function liste(): array { return $this->dateien; }
            public function byId(int $id): ?CodeDatei
            {
                foreach ($this->dateien as $datei) {
                    if ($datei->id === $id) {
                        return $datei;
                    }
                }
                return null;
            }
            public function synchronisiere(array $dateien): void { }
        };
    }

    private function historie(): CodeDateiHistorie
    {
        return new class($this->versionen, $this->dateien) implements CodeDateiHistorie {
            private array $versionen;
            private array $dateien;
            public function __construct(array $versionen, array $dateien)
            {
                $this->versionen = $versionen;
                $this->dateien = $dateien;
            }
            public function versionen(int $codeDateiId): array { return $this->versionen; }
            public function beiVersion(int $codeDateiId, int $id): ?CodeDatei
            {
                return $codeDateiId === 5 && $id === 4 ? $this->dateien[0] : null;
            }
        };
    }

    public function testListeLiefertDateien(): void
    {
        self::assertSame($this->dateien, (new ListeCodeDateien($this->dateiRepository()))->execute());
    }

    public function testZeigeNachIdLiefertDatei(): void
    {
        self::assertSame('CodeTest.php', (new ZeigeCodeDatei($this->dateiRepository()))->execute(5)->dateiName);
    }

    public function testVersionenGreiftDurch(): void
    {
        self::assertSame($this->versionen, (new ListeCodeDateiVersionen($this->historie()))->execute(5));
    }

    public function testZeigeVersionFuerSnapshot(): void
    {
        self::assertNotNull((new ZeigeCodeDateiVersion($this->historie()))->execute(5, 4));
    }
}