Files
cf7-spam-to-telegram/tests/FieldDetectorTest.php
T
Vladimir Bryzgalov 8efb82ca43 fix: phone leak, field-by-value detection, strict Flamingo email fallback
Three pilot-surfaced issues in one pass:

1. PhoneParser regex used '\s' in the candidate character class, so a
   digit on a following flattened line bled into the phone. '+7977
   6277470\n1' (phone + trailing checkbox value) parsed as 12 digits,
   producing '+797762774701'. Replaced '\s' with a literal space so
   newlines/tabs stop the candidate.

2. Custom-themed forms don't use 'your-name' / 'your-email' keys
   (washanyanya.ru has text-211 / text-212 / name_user). Added
   FieldDetector::find_name + find_email as fallbacks. Classifier
   and MessageFormatter now call them if no standard key matches,
   so 'Александр' in text-211 is recognised as a cyrillic name and
   scored / displayed accordingly.

3. FlamingoHelper copied '_from_email' into 'your-email' without
   validating it. Flamingo derives that meta from whatever field it
   considers "first"; on phone-first forms it ends up holding the
   phone number. Now we only copy _from_email if it contains '@',
   and dropped the _from_name shortcut entirely — FieldDetector
   handles the name via the actual field values.

Tests: +1 FieldDetectorTest (13 cases); +2 PhoneParserTest cases for
newline/tab bleeds; +1 ClassifierTest case; +1 MessageFormatterTest
case for custom field keys. Full suite 53/53 green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 00:22:39 +05:00

117 lines
3.0 KiB
PHP
Raw 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);
namespace Cf7stg\Tests;
use Cf7stg\FieldDetector;
use PHPUnit\Framework\TestCase;
final class FieldDetectorTest extends TestCase
{
public function test_finds_cyrillic_name_in_custom_key(): void
{
$r = FieldDetector::find_name([
'text-211' => 'Александр',
'text-212' => '+79776277470',
]);
self::assertSame('Александр', $r);
}
public function test_finds_multiword_cyrillic_name(): void
{
$r = FieldDetector::find_name(['x' => 'Анна Петровна']);
self::assertSame('Анна Петровна', $r);
}
public function test_finds_latin_name(): void
{
$r = FieldDetector::find_name(['x' => 'John Smith']);
self::assertSame('John Smith', $r);
}
public function test_skips_values_with_digits(): void
{
$r = FieldDetector::find_name([
'a' => '+79776277470',
'b' => 'Ольга',
]);
self::assertSame('Ольга', $r);
}
public function test_skips_urls(): void
{
$r = FieldDetector::find_name([
'a' => 'https://evil.com',
'b' => 'Павел',
]);
self::assertSame('Павел', $r);
}
public function test_skips_emails(): void
{
$r = FieldDetector::find_name([
'a' => 'anna@mail.ru',
'b' => 'Анна',
]);
self::assertSame('Анна', $r);
}
public function test_skips_too_short(): void
{
$r = FieldDetector::find_name([
'a' => 'X',
'b' => 'Дарья',
]);
self::assertSame('Дарья', $r);
}
public function test_skips_too_long(): void
{
$r = FieldDetector::find_name([
'a' => str_repeat('а', 200),
'b' => 'Лена',
]);
self::assertSame('Лена', $r);
}
public function test_no_name_returns_empty(): void
{
$r = FieldDetector::find_name([
'a' => '+79031234567',
'b' => '1',
'c' => 'http://x.y',
]);
self::assertSame('', $r);
}
public function test_finds_email(): void
{
$r = FieldDetector::find_email(['x-1' => 'user@example.com']);
self::assertSame('user@example.com', $r);
}
public function test_no_email_returns_empty_when_only_phone(): void
{
$r = FieldDetector::find_email([
'x' => 'Иван',
'y' => '+79031234567',
]);
self::assertSame('', $r);
}
public function test_email_is_trimmed(): void
{
$r = FieldDetector::find_email(['x' => ' anna@mail.ru ']);
self::assertSame('anna@mail.ru', $r);
}
public function test_first_email_wins_when_multiple(): void
{
$r = FieldDetector::find_email([
'a' => 'first@a.ru',
'b' => 'second@b.ru',
]);
self::assertSame('first@a.ru', $r);
}
}