469 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			469 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php namespace Propaganistas\LaravelPhone\Tests;
 | |
| 
 | |
| use Illuminate\Foundation\Application;
 | |
| use libphonenumber\PhoneNumber;
 | |
| use libphonenumber\PhoneNumberFormat;
 | |
| use libphonenumber\PhoneNumberUtil;
 | |
| use Orchestra\Testbench\TestCase;
 | |
| use Phone;
 | |
| use Propaganistas\LaravelPhone\LaravelPhoneServiceProvider;
 | |
| 
 | |
| class PhoneValidatorTest extends TestCase
 | |
| {
 | |
| 
 | |
|     protected $validator;
 | |
| 
 | |
|     protected function getPackageProviders()
 | |
|     {
 | |
|         return [
 | |
|             'Propaganistas\LaravelPhone\LaravelPhoneServiceProvider',
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     protected function getPackageAliases()
 | |
|     {
 | |
|         return [
 | |
|             'Phone' => 'Propaganistas\LaravelPhone\LaravelPhoneFacade',
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public function setUp()
 | |
|     {
 | |
|         parent::setUp();
 | |
| 
 | |
|         $this->validator = $this->app['validator'];
 | |
|     }
 | |
| 
 | |
|     public function testFacade()
 | |
|     {
 | |
|         $phoneNumber = Phone::parse('650-429-2057', 'US');
 | |
|         $this->assertTrue($phoneNumber instanceof PhoneNumber);
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneWithDefaultCountryNoType()
 | |
|     {
 | |
|         // Validator with correct country field.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:BE'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country value.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:NL'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple country values, one correct.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:BE,NL'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple country values, value correct for second country in list.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:NL,BE'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple wrong country values.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:DE,NL'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneWithCountryFieldNoType()
 | |
|     {
 | |
|         // Validator with correct country field supplied.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '016123456', 'field_country' => 'BE'],
 | |
|             ['field' => 'phone'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country field supplied.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456', 'field_country' => 'NL'],
 | |
|             ['field' => 'phone'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneWithDefaultCountryWithType()
 | |
|     {
 | |
|         // Validator with correct country value, correct type.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '0499123456'],
 | |
|             ['field' => 'phone:BE,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with correct country value, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:BE,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country value, correct type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '0499123456'],
 | |
|             ['field' => 'phone:NL,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country value, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:NL,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple country values, one correct, correct type.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '0499123456'],
 | |
|             ['field' => 'phone:BE,NL,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple country values, one correct, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:BE,NL,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple country values, none correct, correct type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '0499123456'],
 | |
|             ['field' => 'phone:DE,NL,mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with multiple country values, none correct, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:DE,NL,mobile'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneWithCountryFieldWithType()
 | |
|     {
 | |
|         // Validator with correct country field supplied, correct type.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '0499123456', 'field_country' => 'BE'],
 | |
|             ['field' => 'phone:mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with correct country field supplied, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456', 'field_country' => 'BE'],
 | |
|             ['field' => 'phone:mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country field supplied, correct type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '0499123456', 'field_country' => 'NL'],
 | |
|             ['field' => 'phone:mobile'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country field supplied, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456', 'field_country' => 'NL'],
 | |
|             ['field' => 'phone:mobile'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneWithCustomCountryField()
 | |
|     {
 | |
|         // Validator with correct country field supplied, correct type.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '0499123456', 'country_code' => 'BE'],
 | |
|             ['field' => 'phone:mobile,country_code'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with correct country field supplied, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456', 'country_code' => 'BE'],
 | |
|             ['field' => 'phone:mobile,country_code'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country field supplied, correct type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '0499123456', 'country_code' => 'NL'],
 | |
|             ['field' => 'phone:mobile,country_code'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country field supplied, wrong type.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456', 'country_code' => 'NL'],
 | |
|             ['field' => 'phone:mobile,country_code'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneAutomaticDetectionFromInternationalInput()
 | |
|     {
 | |
|         // Validator with correct international input.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '+3216123456'],
 | |
|             ['field' => 'phone:AUTO'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong international input.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '003216123456'],
 | |
|             ['field' => 'phone:AUTO'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong international input.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '+321234'],
 | |
|             ['field' => 'phone:AUTO'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong international input but correct default country.
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:AUTO,NL,BE'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong international input and wrong default country.
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:AUTO,DE,NL'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneNoDefaultCountryNoCountryField()
 | |
|     {
 | |
|         $this->setExpectedException('Propaganistas\LaravelPhone\Exceptions\NoValidCountryFoundException');
 | |
| 
 | |
|         // Validator with no country field or given country.
 | |
|         $this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone']
 | |
|         )->passes();
 | |
| 
 | |
|         // Validator with no country field or given country, wrong type.
 | |
|         $this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:mobile']
 | |
|         )->passes();
 | |
| 
 | |
|         // Validator with no country field or given country, correct type.
 | |
|         $this->validator->make(
 | |
|             ['field' => '0499359308'],
 | |
|             ['field' => 'phone:mobile']
 | |
|         )->passes();
 | |
| 
 | |
|         // Validator with no country field or given country, correct type, faulty parameter.
 | |
|         $this->validator->make(
 | |
|             ['field' => '0499359308'],
 | |
|             ['field' => 'phone:mobile,xyt']
 | |
|         )->passes();
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneLenient()
 | |
|     {
 | |
|         // Validator with AU area code, lenient off
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '88885555'],
 | |
|             ['field' => 'phone:AU'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with AU area code, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '88885555'],
 | |
|             ['field' => 'phone:LENIENT,AU'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with correct country field supplied, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '88885555', 'field_country' => 'AU'],
 | |
|             ['field' => 'phone:LENIENT'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with wrong country field supplied, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '88885555', 'field_country' => 'BE'],
 | |
|             ['field' => 'phone:LENIENT'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with no area code, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '+16502530000'],
 | |
|             ['field' => 'phone:LENIENT'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with US area code, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '+16502530000'],
 | |
|             ['field' => 'phone:LENIENT,US'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with no area code, lenient off
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '6502530000'],
 | |
|             ['field' => 'phone:LENIENT'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with US area code, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '6502530000'],
 | |
|             ['field' => 'phone:LENIENT,US'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with US area code, lenient off
 | |
|         $this->assertFalse($this->validator->make(
 | |
|             ['field' => '2530000'],
 | |
|             ['field' => 'phone:LENIENT'])->passes()
 | |
|         );
 | |
| 
 | |
|         // Validator with US area code, lenient on
 | |
|         $this->assertTrue($this->validator->make(
 | |
|             ['field' => '2530000'],
 | |
|             ['field' => 'phone:LENIENT,US'])->passes()
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneFaultyParameters()
 | |
|     {
 | |
|         $this->setExpectedException('Propaganistas\LaravelPhone\Exceptions\InvalidParameterException');
 | |
| 
 | |
|         // Validator with given country, correct type, faulty parameter.
 | |
|         $this->validator->make(
 | |
|             ['field' => '016123456'],
 | |
|             ['field' => 'phone:BE,mobile,xyz']
 | |
|         )->passes();
 | |
| 
 | |
|         // Validator with country field, correct type, faulty parameter.
 | |
|         $this->validator->make(
 | |
|             ['field' => '016123456', 'field_country' => 'BE'],
 | |
|             ['field' => 'phone:mobile,xyz']
 | |
|         )->passes();
 | |
|     }
 | |
| 
 | |
|     public function testValidatePhoneWithArrayInput()
 | |
|     {
 | |
|         if (LaravelPhoneServiceProvider::canUseDependentValidation()) {
 | |
|             // Validator with correct country value.
 | |
|             $this->assertTrue($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456'],
 | |
|                         ['field' => '0499123456']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:BE'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with wrong country value.
 | |
|             $this->assertFalse($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456'],
 | |
|                         ['field' => '0499123456']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:NL'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct country value, one wrong input.
 | |
|             $this->assertFalse($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '01612'],
 | |
|                         ['field' => '0499123456']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:BE'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct country value, one wrong input.
 | |
|             $this->assertFalse($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456'],
 | |
|                         ['field' => '049912']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:BE'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct country value.
 | |
|             $this->assertTrue($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '0477123456'],
 | |
|                         ['field' => '0499123456']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:BE,mobile'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct country value, one input wrong type.
 | |
|             $this->assertFalse($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456'],
 | |
|                         ['field' => '0499123456']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:BE,mobile'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct country fields.
 | |
|             $this->assertTrue($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456', 'field_country' => 'BE'],
 | |
|                         ['field' => '6502530000', 'field_country' => 'US']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct country fields.
 | |
|             $this->assertFalse($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456', 'field_country' => 'BE'],
 | |
|                         ['field' => '6502530000', 'field_country' => 'BE']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with correct custom country fields.
 | |
|             $this->assertTrue($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456', 'country_code' => 'BE'],
 | |
|                         ['field' => '6502530000', 'country_code' => 'US']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:container.*.country_code'])->passes()
 | |
|             );
 | |
| 
 | |
|             // Validator with wrong custom country fields.
 | |
|             $this->assertFalse($this->validator->make(
 | |
|                 [
 | |
|                     'container' => [
 | |
|                         ['field' => '016123456', 'country_code' => 'BE'],
 | |
|                         ['field' => '6502530000', 'country_code' => 'BE']
 | |
|                     ]
 | |
|                 ],
 | |
|                 ['container.*.field' => 'phone:container.*.country_code'])->passes()
 | |
|             );
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function testHelperFunction()
 | |
|     {
 | |
|         // Test landline number without format parameter.
 | |
|         $actual = phone('016123456', 'BE');
 | |
|         $expected = '+32 16 12 34 56';
 | |
|         $this->assertEquals($expected, $actual);
 | |
| 
 | |
|         // Test landline number with format parameter.
 | |
|         $actual = phone('016123456', 'BE', PhoneNumberFormat::NATIONAL);
 | |
|         $expected = '016 12 34 56';
 | |
|         $this->assertEquals($expected, $actual);
 | |
| 
 | |
|         // Test fetching of util.
 | |
|         $this->assertTrue(phone() instanceof PhoneNumberUtil);
 | |
|     }
 | |
| }
 | 
