Teren-app/tests/Unit/PhoneSelectorTest.php
2025-10-26 12:57:09 +01:00

54 lines
2.0 KiB
PHP

<?php
use App\Models\Person\Person;
use App\Models\Person\PersonPhone;
use App\Services\Contact\PhoneSelector;
it('selects validated mobile first', function () {
$person = Person::factory()->create();
// Non-mobile validated
PersonPhone::factory()->for($person, 'person')->landline()->validated()->create();
// Mobile not validated
PersonPhone::factory()->for($person, 'person')->mobile()->notValidated()->create();
// Mobile validated (should win)
$best = PersonPhone::factory()->for($person, 'person')->mobile()->validated()->create();
$selector = new PhoneSelector;
$result = $selector->selectForPerson($person->fresh('phones'));
expect($result['phone'])->not->toBeNull();
expect($result['phone']->id)->toBe($best->id);
expect($result['reason'])->toBeNull();
});
it('falls back to validated any type then mobile', function () {
$person = Person::factory()->create();
$validatedAny = PersonPhone::factory()->for($person, 'person')->landline()->validated()->create();
$mobile = PersonPhone::factory()->for($person, 'person')->mobile()->notValidated()->create();
$selector = new PhoneSelector;
$result = $selector->selectForPerson($person->fresh('phones'));
expect($result['phone']->id)->toBe($validatedAny->id);
});
it('returns first active when no better option', function () {
$person = Person::factory()->create();
$first = PersonPhone::factory()->for($person, 'person')->landline()->notValidated()->create();
PersonPhone::factory()->for($person, 'person')->landline()->notValidated()->create();
$selector = new PhoneSelector;
$result = $selector->selectForPerson($person->fresh('phones'));
expect($result['phone']->id)->toBe($first->id);
});
it('returns reason when no phones', function () {
$person = Person::factory()->create();
$selector = new PhoneSelector;
$result = $selector->selectForPerson($person->fresh('phones'));
expect($result['phone'])->toBeNull();
expect($result['reason'])->toBe('no_active_phones');
});