Finanzmanager/tests/05_DarstellungTest.php
fds2610-bot a077e03bee Fix #40: Kategorie im Kontoblatt ohne Neuladen speichern
Das Ändern von Kategorie oder Klasse im Kontoblatt lud bisher die ganze
Seite neu, um die Zeile zu aktualisieren – dabei sprang der Bildschirm
nach ganz oben. kontoblatt.js schickt die Auswahl jetzt per fetch im
Hintergrund; Kategorie, Klasse und das Symbol der Bargeld-Abgleichspalte
aktualisieren sich an Ort und Stelle, die Bildlaufposition bleibt stehen.
Ohne JavaScript bleibt es bei der bisherigen Weiterleitung.
2026-08-19 14:57:09 +02:00

94 lines
4.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
use Finanzmanager\View;
class DarstellungTest extends TestCase
{
protected string $testName = 'Test 05: Darstellung (Formate auf Deutsch)';
public function run(): void
{
$this->monatsnamen();
$this->betraege();
$this->datumsformat();
$this->bargeldMarke();
}
private function monatsnamen(): void
{
$this->assertEquals('Januar', View::monat(1), 'Erster Monat heißt Januar');
$this->assertEquals('März', View::monat(3), 'Umlaut im Monatsnamen bleibt erhalten');
$this->assertEquals('Dezember', View::monat(12), 'Letzter Monat heißt Dezember');
$this->assertEquals('Mär', View::monat(3, true), 'Kurzform mit Umlaut');
$this->assertEquals('Dez', View::monat(12, true), 'Kurzform des letzten Monats');
$this->assertEquals(12, count(View::MONATE), 'Zwölf Monatsnamen');
$this->assertEquals(12, count(View::MONATE_KURZ), 'Zwölf Kurzformen');
// Vollständige Sollliste: date('F') liefert englische Namen, und für
// April, August, September und November fällt das nicht auf, weil sie
// in beiden Sprachen gleich heißen. Deshalb Wert für Wert vergleichen.
$soll = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
foreach ($soll as $i => $name) {
$this->assertEquals($name, View::monat($i + 1), 'Monat ' . ($i + 1) . ' heißt ' . $name);
$this->assertNotEmpty(View::monat($i + 1, true), 'Kurzform für Monat ' . ($i + 1) . ' vorhanden');
}
// Ungültige Werte dürfen die Oberfläche nicht zerlegen.
$this->assertEquals('0', View::monat(0), 'Unbekannter Monat gibt die Zahl zurück');
$this->assertEquals('13', View::monat(13), 'Monat außerhalb des Bereichs gibt die Zahl zurück');
}
private function betraege(): void
{
$this->assertEquals('1.234,50', View::betrag(1234.5, false), 'Deutsches Zahlenformat');
$this->assertEquals("1.234,50\u{00A0}€", View::betrag(1234.5), 'Währung mit geschütztem Leerzeichen');
$this->assertEquals('-58.457,07', View::betrag(-58457.07, false), 'Negativer Betrag');
$this->assertEquals('betrag negativ', View::betragKlasse(-1), 'Negative Beträge werden markiert');
$this->assertEquals('betrag', View::betragKlasse(0), 'Null gilt nicht als negativ');
}
private function datumsformat(): void
{
$this->assertEquals('18.03.2026', View::datum('2026-03-18'), 'Deutsches Datumsformat');
$this->assertEquals('18.03.2026', View::datum('2026-03-18 14:22:01'), 'Zeitanteil wird abgeschnitten');
$this->assertEquals('–', View::datum(null), 'Leeres Datum als Gedankenstrich');
}
/**
* Das Symbol der Bargeld-Abgleichspalte – eigenständig in View, damit die
* Schnellzuordnung im Kontoblatt es auch für die Ajax-Antwort bilden kann,
* ohne die Seite neu zu laden.
*/
private function bargeldMarke(): void
{
$gefunden = View::bargeldMarke('gefunden', null);
$this->assert(str_contains($gefunden, 'bargeld-gefunden'), 'Gefunden bekommt seine Klasse');
$this->assert(str_contains($gefunden, '✓'), 'Und sein Zeichen');
$this->assert(str_contains($gefunden, 'Im Bargeld-Tool gefunden'), 'Und den Standardtitel');
$fehlt = View::bargeldMarke('fehlt', null);
$this->assert(str_contains($fehlt, 'bargeld-fehlt'), 'Fehlt bekommt seine Klasse');
$this->assert(str_contains($fehlt, '✗'), 'Und sein Zeichen');
$fehler = View::bargeldMarke('fehler', 'Zeitüberschreitung');
$this->assert(str_contains($fehler, 'bargeld-fehler'), 'Fehler bekommt seine Klasse');
$this->assert(str_contains($fehler, '!'), 'Und sein Zeichen');
$this->assert(str_contains($fehler, 'Zeitüberschreitung'), 'Ein eigener Hinweis geht vor dem Standardtitel');
$neutral = View::bargeldMarke(null, null);
$this->assert(str_contains($neutral, 'bargeld-neutral'), 'Ohne Status der graue Kreis');
$this->assert(str_contains($neutral, '●'), 'Und sein Zeichen');
$unbekannt = View::bargeldMarke('unfug', null);
$this->assertEquals($neutral, $unbekannt, 'Ein unbekannter Status gilt wie kein Status');
$this->assert(
str_contains(View::bargeldMarke('gefunden', '<script>'), '&lt;script&gt;'),
'Ein Hinweis wird maskiert'
);
}
}