OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

TicketListStateTest.php

3 KB
<?php

declare(strict_types=1);

use OpenNIT\Controllers\TicketController;

/**
 * Deckt ab, dass „Zurück" aus einem Ticket wieder in derselben Liste landet:
 * Der gemerkte Zustand muss alle Parameter führen, die die Liste kennt, und
 * die Kopfzeile des Tickets muss ihn benutzen.
 */
return static function (): void {

    /** @return list<string> */
    $listenSchluessel = static function (): array {
        $c = new \ReflectionClass(TicketController::class);
        /** @var list<string> $werte */
        $werte = $c->getConstant('LIST_STATE_KEYS');
        return $werte;
    };

    $quelle = static fn(string $pfad): string
        => (string)file_get_contents(dirname(__DIR__) . '/' . $pfad);

    test('Der gemerkte Zustand führt jeden Filter der Liste', function () use ($listenSchluessel, $quelle) {
        // Die Liste reicht ihre Filter über $request->only([...]) an die Vorlage
        // weiter; genau diese Parameter beschreiben den Zustand.
        $treffer = [];
        preg_match(
            "/\\\$request->only\(\[\s*'preset'(.*?)\]\)/s",
            $quelle('src/Controllers/TicketController.php'),
            $treffer
        );
        assertTrue($treffer !== [], 'Die Filterliste der Ticket-Übersicht ist nicht auffindbar');

        preg_match_all("/'([a-z_]+)'/", "'preset'" . $treffer[1], $namen);
        $gemerkt = $listenSchluessel();
        foreach ($namen[1] as $name) {
            assertTrue(in_array($name, $gemerkt, true), $name . ' fehlt im gemerkten Listenzustand');
        }
    });

    test('Auch die Seitenzahl gehört zum Zustand', function () use ($listenSchluessel) {
        assertTrue(in_array('_page', $listenSchluessel(), true), 'Die Seite muss erhalten bleiben');
    });

    test('Die Ticket-Kopfzeile führt auf die gemerkte Liste zurück', function () use ($quelle) {
        $vorlage = $quelle('templates/tickets/show.php');
        assertTrue(
            str_contains($vorlage, 'href="<?= $this->e($back_url ?? \'/tickets\') ?>" class="ts-head-back"'),
            'Der Zurück-Pfeil zeigt nicht auf die gemerkte Liste'
        );
    });

    test('Die Übersicht merkt sich ihren Zustand vor dem Rendern', function () use ($quelle) {
        $controller = $quelle('src/Controllers/TicketController.php');
        assertTrue(
            str_contains($controller, '$this->rememberListState($request);'),
            'Die Übersicht hält ihren Zustand nicht fest'
        );
        assertTrue(
            str_contains($controller, "'back_url'           => \$this->listStateUrl(),"),
            'Die Ticket-Ansicht reicht das Ziel für Zurück nicht durch'
        );
    });
};