'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'); } }