Files
michaelschiemer/tests/Domain/Common/ValueObject/PhoneNumberTest.php
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

179 lines
6.7 KiB
PHP

<?php
declare(strict_types=1);
use App\Domain\Common\ValueObject\PhoneNumber;
describe('PhoneNumber Value Object', function () {
it('creates phone number from valid string', function () {
$phone = PhoneNumber::from('+49 123 456789');
expect($phone->getValue())->toBe('+49 123 456789');
});
it('creates phone number with parse method', function () {
$phone = PhoneNumber::parse('+49-123-456-789');
expect($phone->getValue())->toBe('+49 123 456 789');
});
it('throws exception for empty phone number', function () {
expect(fn () => PhoneNumber::from(''))
->toThrow(InvalidArgumentException::class, 'Phone number cannot be empty.');
});
it('throws exception for phone number without digits', function () {
expect(fn () => PhoneNumber::from('abc'))
->toThrow(InvalidArgumentException::class, 'Phone number must contain digits: abc');
});
it('throws exception for too short phone number', function () {
expect(fn () => PhoneNumber::from('123'))
->toThrow(InvalidArgumentException::class, 'Phone number too short: 123');
});
it('throws exception for too long phone number', function () {
expect(fn () => PhoneNumber::from('123456789012345678901'))
->toThrow(InvalidArgumentException::class, 'Phone number too long: 123456789012345678901');
});
it('throws exception for invalid format', function () {
expect(fn () => PhoneNumber::from('+49#123#456'))
->toThrow(InvalidArgumentException::class, 'Invalid phone number format: +49#123#456');
});
it('validates phone numbers correctly', function () {
expect(PhoneNumber::isValid('+49 123 456789'))->toBeTrue();
expect(PhoneNumber::isValid('0123 456789'))->toBeTrue();
expect(PhoneNumber::isValid('+1 (555) 123-4567'))->toBeTrue();
expect(PhoneNumber::isValid(''))->toBeFalse();
expect(PhoneNumber::isValid('abc'))->toBeFalse();
expect(PhoneNumber::isValid('123'))->toBeFalse();
});
it('extracts country code correctly', function () {
$phone1 = PhoneNumber::from('+49 123 456789');
expect($phone1->getCountryCode())->toBe('49');
$phone2 = PhoneNumber::from('+1 555 123 4567');
expect($phone2->getCountryCode())->toBe('1');
$phone3 = PhoneNumber::from('0123 456789');
expect($phone3->getCountryCode())->toBeNull();
});
it('extracts national number correctly', function () {
$phone1 = PhoneNumber::from('+49 123 456789');
expect($phone1->getNationalNumber())->toBe(' 123 456789');
$phone2 = PhoneNumber::from('0123 456789');
expect($phone2->getNationalNumber())->toBe('0123 456789');
});
it('detects mobile numbers correctly', function () {
// German mobile numbers
$mobile1 = PhoneNumber::from('+49 15 12345678');
expect($mobile1->isMobile())->toBeTrue();
$mobile2 = PhoneNumber::from('+49 16 12345678');
expect($mobile2->isMobile())->toBeTrue();
$mobile3 = PhoneNumber::from('+49 17 12345678');
expect($mobile3->isMobile())->toBeTrue();
// German landline
$landline = PhoneNumber::from('+49 30 12345678');
expect($landline->isMobile())->toBeFalse();
// US numbers (10 digits are considered mobile for demo)
$usMobile = PhoneNumber::from('+1 555 123 4567');
expect($usMobile->isMobile())->toBeTrue();
// General heuristic: 10+ digits
$longNumber = PhoneNumber::from('+999 1234567890');
expect($longNumber->isMobile())->toBeTrue();
});
it('formats to E164 correctly', function () {
$phone1 = PhoneNumber::from('+49 123 456 789');
expect($phone1->toE164())->toBe('+49123456789');
$phone2 = PhoneNumber::from('0123 456789');
expect($phone2->toE164())->toBe('+49123456789'); // Assumes German for demo
$phone3 = PhoneNumber::from('+1 (555) 123-4567');
expect($phone3->toE164())->toBe('+15551234567');
});
it('formats to international display format', function () {
$phone1 = PhoneNumber::from('+49 123456789');
$international = $phone1->toInternational();
expect($international)->toContain('+49');
expect($international)->toContain('123');
$phone2 = PhoneNumber::from('+1 5551234567');
$international2 = $phone2->toInternational();
expect($international2)->toContain('+1');
expect($international2)->toContain('555');
});
it('formats to national display format', function () {
$phone1 = PhoneNumber::from('+49 123456789');
$national = $phone1->toNational();
expect($national)->toContain('0'); // German national format starts with 0
expect($national)->toContain('123');
$phone2 = PhoneNumber::from('+1 5551234567');
$national2 = $phone2->toNational();
expect($national2)->toContain('(555)'); // US format with parentheses
});
it('compares phone numbers correctly', function () {
$phone1 = PhoneNumber::from('+49 123 456789');
$phone2 = PhoneNumber::from('+49-123-456-789');
$phone3 = PhoneNumber::from('+1 555 123 4567');
expect($phone1->equals($phone2))->toBeTrue(); // Same number, different formatting
expect($phone1->equals($phone3))->toBeFalse(); // Different numbers
});
it('checks same country correctly', function () {
$phone1 = PhoneNumber::from('+49 123 456789');
$phone2 = PhoneNumber::from('+49 987 654321');
$phone3 = PhoneNumber::from('+1 555 123 4567');
expect($phone1->isSameCountry($phone2))->toBeTrue();
expect($phone1->isSameCountry($phone3))->toBeFalse();
});
it('converts to string correctly', function () {
$phone = PhoneNumber::from('+49 123 456789');
expect((string)$phone)->toBe('+49 123 456789');
expect($phone->__toString())->toBe('+49 123 456789');
});
it('handles various input formats', function () {
$formats = [
'+49 123 456789',
'+49-123-456-789',
'+49.123.456.789',
'+49 (123) 456-789',
'0049 123 456789',
'0123 456789',
'123456789',
];
foreach ($formats as $format) {
$phone = PhoneNumber::parse($format);
expect($phone)->toBeInstanceOf(PhoneNumber::class);
expect(strlen($phone->getValue()))->toBeGreaterThan(8);
}
});
it('normalizes input correctly', function () {
$phone1 = PhoneNumber::parse('+49--123..456((789))');
expect($phone1->getValue())->toBe('+49 123 456 789');
$phone2 = PhoneNumber::parse(' +49 123 456 789 ');
expect($phone2->getValue())->toBe('+49 123 456 789');
});
});