Nennt die Bank bei der TAN-Abfrage einen Startcode für den TAN-Generator, geht er im Fließtext leicht unter. StartcodeErkennung erkennt ihn über einen pro Bankverbindung konfigurierbaren Beispielsatz (Ziffernfolge = Platzhalter für den Code) und zeigt den Fund fett, zentriert und in eigener Zeile. BankFreitext löst dafür die bisherige Klartext-Aufbereitung aus FinTsUeberweisung::vopHinweis() heraus, damit TAN-Anfrage und VoP-Rückmeldung dieselbe HTML-zu-Klartext-Umwandlung nutzen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
93 lines
3.5 KiB
PHP
93 lines
3.5 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
use Finanzmanager\Services\StartcodeErkennung;
|
||
|
||
/**
|
||
* Erkennung und Hervorhebung des Startcodes in der TAN-Anfrage.
|
||
*
|
||
* Issue #115: Manche Banken nennen bei der TAN-Abfrage mitten im Fließtext
|
||
* einen Startcode für den TAN-Generator – das Auge überliest ihn leicht.
|
||
* Geprüft wird hier die reine Texterkennung ohne Bankverbindung; die
|
||
* Anbindung an die TAN-Anfrage (FinTsAbruf, FinTsUeberweisung) lässt sich
|
||
* ohne lebendige FinTS-Session nicht isoliert testen.
|
||
*/
|
||
class StartcodeErkennungTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 56: Startcode-Erkennung in der TAN-Anfrage';
|
||
|
||
private const BEISPIEL = 'Stecke die Karte (eeeeee 5570) in den TAN-Generator.<br>'
|
||
. 'Drücke ggf. die SCAN-Taste und scanne den QR-Code mit der Kamera an deinem '
|
||
. 'TAN-Generator.<br>Überprüfe den Startcode 80045248 und bestätige mit der Taste OK.<br>'
|
||
. 'Bitte bestätige den Auftrag mit der TAN deines TAN-Generators.';
|
||
|
||
public function run(): void
|
||
{
|
||
$this->derStandardsatzErkenntDenStartcode();
|
||
$this->einEigenesMusterErkenntEinenAnderenStartcode();
|
||
$this->ohneTreffendesMusterBleibtDerTextUnveraendertAberSicher();
|
||
$this->ohneTextKommtNichtsZurueck();
|
||
$this->fremdesMarkupWirdNichtUebernommen();
|
||
}
|
||
|
||
private function derStandardsatzErkenntDenStartcode(): void
|
||
{
|
||
$html = StartcodeErkennung::hervorheben(self::BEISPIEL, null);
|
||
|
||
$this->assert(
|
||
str_contains($html, '<strong class="startcode">80045248</strong>'),
|
||
'Der Startcode aus dem Standardsatz steht fett ausgezeichnet da'
|
||
);
|
||
$this->assert(
|
||
str_contains($html, 'Überprüfe den Startcode <strong'),
|
||
'Der Satz davor bleibt als Fließtext erhalten'
|
||
);
|
||
$this->assert(
|
||
str_contains($html, 'und bestätige mit der Taste OK.'),
|
||
'Der Satz danach bleibt als Fließtext erhalten'
|
||
);
|
||
}
|
||
|
||
private function einEigenesMusterErkenntEinenAnderenStartcode(): void
|
||
{
|
||
$html = StartcodeErkennung::hervorheben(
|
||
'Bitte gib den Code 554433 in dein Gerät ein.',
|
||
'Bitte gib den Code 999999 in dein Gerät ein.'
|
||
);
|
||
|
||
$this->assert(
|
||
str_contains($html, '<strong class="startcode">554433</strong>'),
|
||
'Ein eigenes, pro Bank gespeichertes Muster erkennt dessen tatsächlichen Code'
|
||
);
|
||
}
|
||
|
||
private function ohneTreffendesMusterBleibtDerTextUnveraendertAberSicher(): void
|
||
{
|
||
$html = StartcodeErkennung::hervorheben(
|
||
self::BEISPIEL,
|
||
'Dieser Satz kommt in der Antwort der Bank nirgends vor 42.'
|
||
);
|
||
|
||
$this->assert(!str_contains($html, 'startcode'), 'Ohne Treffer gibt es keine Hervorhebung');
|
||
$this->assert(
|
||
str_contains($html, 'Überprüfe den Startcode 80045248 und bestätige'),
|
||
'Der Text bleibt trotzdem vollständig lesbar'
|
||
);
|
||
}
|
||
|
||
private function ohneTextKommtNichtsZurueck(): void
|
||
{
|
||
$this->assertEquals('', StartcodeErkennung::hervorheben('', null), 'Ohne Text bleibt es leer');
|
||
}
|
||
|
||
private function fremdesMarkupWirdNichtUebernommen(): void
|
||
{
|
||
$html = StartcodeErkennung::hervorheben(
|
||
'Überprüfe den Startcode <script>alert(1)</script>80045248 und bestätige mit der Taste OK.',
|
||
null
|
||
);
|
||
|
||
$this->assert(!str_contains($html, '<script>'), 'Fremdes Markup aus der Bankantwort wird nicht übernommen');
|
||
}
|
||
}
|