Session-Lock im SSE-Stream blockierte den parallelen POST der Konto-Auswahl bis zum Timeout. session_write_close() im Run-Endpoint behebt das. Bearbeiten-Dialog zeigt gespeicherte Konto-Identifier jetzt als Checkboxen; Abhaken entfernt aus account_filter, alles abgehakt = Reset.
69 lines
2.9 KiB
PHP
69 lines
2.9 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Steuerkram\Models\BankSource;
|
||
|
||
/**
|
||
* Test 38: BankSource::computeFilterFromPost – Logik des Bearbeiten-Dialogs
|
||
* (Checkbox-Auswahl der aktiven Konten + Reset-Toggle).
|
||
*/
|
||
class BankSourceFilterFromPostTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 38: BankSource::computeFilterFromPost – Filter aus POST';
|
||
|
||
public function run(): void
|
||
{
|
||
$current = json_encode(['DE53120300000000123456', 'AN:42:']);
|
||
|
||
// 1. Reset-Flag hat Vorrang und liefert null
|
||
$r = BankSource::computeFilterFromPost($current, [
|
||
'reset_account_filter' => '1',
|
||
'active_accounts' => ['DE53120300000000123456'], // wird ignoriert
|
||
]);
|
||
$this->assert($r['update'] === true, 'Reset löst Update aus');
|
||
$this->assert($r['value'] === null, 'Reset liefert null');
|
||
|
||
// 2. Eine Checkbox abgehakt – nur die übrig bleibende wird gespeichert
|
||
$r = BankSource::computeFilterFromPost($current, [
|
||
'active_accounts' => ['DE53120300000000123456'],
|
||
]);
|
||
$this->assert($r['update'] === true, 'Teilauswahl löst Update aus');
|
||
$decoded = json_decode((string)$r['value'], true);
|
||
$this->assertEquals(['DE53120300000000123456'], $decoded, 'Nur angehakter Wert verbleibt');
|
||
|
||
// 3. Alle Checkboxen abgehakt → Reset-Verhalten (null)
|
||
$r = BankSource::computeFilterFromPost($current, [
|
||
'active_accounts' => [],
|
||
]);
|
||
$this->assert($r['update'] === true, 'Alles abgehakt löst Update aus');
|
||
$this->assert($r['value'] === null, 'Alles abgehakt → null (wie Reset)');
|
||
|
||
// 4. Kein active_accounts-Schlüssel im POST → unverändert lassen
|
||
$r = BankSource::computeFilterFromPost($current, []);
|
||
$this->assert($r['update'] === false, 'Ohne active_accounts kein Update');
|
||
|
||
// 5. POST enthält fremden Identifier, der nicht im aktuellen Filter steht → wird verworfen
|
||
$r = BankSource::computeFilterFromPost($current, [
|
||
'active_accounts' => ['DE53120300000000123456', 'FREMD:99:'],
|
||
]);
|
||
$decoded = json_decode((string)$r['value'], true);
|
||
$this->assertEquals(
|
||
['DE53120300000000123456'],
|
||
$decoded,
|
||
'Nur Identifier aus aktuellem Filter werden übernommen'
|
||
);
|
||
|
||
// 6. Aktueller Filter leer (null) + leeres active_accounts → kein Update
|
||
$r = BankSource::computeFilterFromPost(null, [
|
||
'active_accounts' => [],
|
||
]);
|
||
$this->assert($r['update'] === false, 'Leerer Filter + leere Auswahl → kein Update');
|
||
|
||
// 7. Aktueller Filter ist ungültiges JSON → wie leerer Filter behandeln
|
||
$r = BankSource::computeFilterFromPost('not-json', [
|
||
'active_accounts' => ['DE53120300000000123456'],
|
||
]);
|
||
$this->assert($r['update'] === false, 'Ungültiges Current-JSON führt zu leerer kept-Liste → kein Update');
|
||
}
|
||
}
|