123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Validator\Tests\Constraints;
- use Symfony\Bridge\PhpUnit\DnsMock;
- use Symfony\Component\Validator\Constraints\Url;
- use Symfony\Component\Validator\Constraints\UrlValidator;
- use Symfony\Component\Validator\Validation;
- /**
- * @group dns-sensitive
- */
- class UrlValidatorTest extends AbstractConstraintValidatorTest
- {
- protected function getApiVersion()
- {
- return Validation::API_VERSION_2_5;
- }
- protected function createValidator()
- {
- return new UrlValidator();
- }
- public function testNullIsValid()
- {
- $this->validator->validate(null, new Url());
- $this->assertNoViolation();
- }
- public function testEmptyStringIsValid()
- {
- $this->validator->validate('', new Url());
- $this->assertNoViolation();
- }
- public function testEmptyStringFromObjectIsValid()
- {
- $this->validator->validate(new EmailProvider(), new Url());
- $this->assertNoViolation();
- }
- /**
- * @expectedException \Symfony\Component\Validator\Exception\UnexpectedTypeException
- */
- public function testExpectsStringCompatibleType()
- {
- $this->validator->validate(new \stdClass(), new Url());
- }
- /**
- * @dataProvider getValidUrls
- */
- public function testValidUrls($url)
- {
- $this->validator->validate($url, new Url());
- $this->assertNoViolation();
- }
- public function getValidUrls()
- {
- return array(
- array('http://a.pl'),
- array('http://www.google.com'),
- array('http://www.google.com.'),
- array('http://www.google.museum'),
- array('https://google.com/'),
- array('https://google.com:80/'),
- array('http://www.example.coop/'),
- array('http://www.test-example.com/'),
- array('http://www.symfony.com/'),
- array('http://symfony.fake/blog/'),
- array('http://symfony.com/?'),
- array('http://symfony.com/search?type=&q=url+validator'),
- array('http://symfony.com/#'),
- array('http://symfony.com/#?'),
- array('http://www.symfony.com/doc/current/book/validation.html#supported-constraints'),
- array('http://very.long.domain.name.com/'),
- array('http://localhost/'),
- array('http://myhost123/'),
- array('http://127.0.0.1/'),
- array('http://127.0.0.1:80/'),
- array('http://[::1]/'),
- array('http://[::1]:80/'),
- array('http://[1:2:3::4:5:6:7]/'),
- array('http://sãopaulo.com/'),
- array('http://xn--sopaulo-xwa.com/'),
- array('http://sãopaulo.com.br/'),
- array('http://xn--sopaulo-xwa.com.br/'),
- array('http://пример.испытание/'),
- array('http://xn--e1afmkfd.xn--80akhbyknj4f/'),
- array('http://مثال.إختبار/'),
- array('http://xn--mgbh0fb.xn--kgbechtv/'),
- array('http://例子.测试/'),
- array('http://xn--fsqu00a.xn--0zwm56d/'),
- array('http://例子.測試/'),
- array('http://xn--fsqu00a.xn--g6w251d/'),
- array('http://例え.テスト/'),
- array('http://xn--r8jz45g.xn--zckzah/'),
- array('http://مثال.آزمایشی/'),
- array('http://xn--mgbh0fb.xn--hgbk6aj7f53bba/'),
- array('http://실례.테스트/'),
- array('http://xn--9n2bp8q.xn--9t4b11yi5a/'),
- array('http://العربية.idn.icann.org/'),
- array('http://xn--ogb.idn.icann.org/'),
- array('http://xn--e1afmkfd.xn--80akhbyknj4f.xn--e1afmkfd/'),
- array('http://xn--espaa-rta.xn--ca-ol-fsay5a/'),
- array('http://xn--d1abbgf6aiiy.xn--p1ai/'),
- array('http://☎.com/'),
- array('http://username:password@symfony.com'),
- array('http://user.name:password@symfony.com'),
- array('http://username:pass.word@symfony.com'),
- array('http://user.name:pass.word@symfony.com'),
- array('http://user-name@symfony.com'),
- array('http://symfony.com?'),
- array('http://symfony.com?query=1'),
- array('http://symfony.com/?query=1'),
- array('http://symfony.com#'),
- array('http://symfony.com#fragment'),
- array('http://symfony.com/#fragment'),
- array('http://symfony.com/#one_more%20test'),
- );
- }
- /**
- * @dataProvider getInvalidUrls
- */
- public function testInvalidUrls($url)
- {
- $constraint = new Url(array(
- 'message' => 'myMessage',
- ));
- $this->validator->validate($url, $constraint);
- $this->buildViolation('myMessage')
- ->setParameter('{{ value }}', '"'.$url.'"')
- ->setCode(Url::INVALID_URL_ERROR)
- ->assertRaised();
- }
- public function getInvalidUrls()
- {
- return array(
- array('google.com'),
- array('://google.com'),
- array('http ://google.com'),
- array('http:/google.com'),
- array('http://goog_le.com'),
- array('http://google.com::aa'),
- array('http://google.com:aa'),
- array('ftp://google.fr'),
- array('faked://google.fr'),
- array('http://127.0.0.1:aa/'),
- array('ftp://[::1]/'),
- array('http://[::1'),
- array('http://hello.☎/'),
- array('http://:password@symfony.com'),
- array('http://:password@@symfony.com'),
- array('http://username:passwordsymfony.com'),
- array('http://usern@me:password@symfony.com'),
- array('http://example.com/exploit.html?<script>alert(1);</script>'),
- array('http://example.com/exploit.html?hel lo'),
- array('http://example.com/exploit.html?not_a%hex'),
- array('http://'),
- );
- }
- /**
- * @dataProvider getValidCustomUrls
- */
- public function testCustomProtocolIsValid($url)
- {
- $constraint = new Url(array(
- 'protocols' => array('ftp', 'file', 'git'),
- ));
- $this->validator->validate($url, $constraint);
- $this->assertNoViolation();
- }
- public function getValidCustomUrls()
- {
- return array(
- array('ftp://google.com'),
- array('file://127.0.0.1'),
- array('git://[::1]/'),
- );
- }
- /**
- * @dataProvider getCheckDns
- * @requires function Symfony\Bridge\PhpUnit\DnsMock::withMockedHosts
- */
- public function testCheckDns($violation)
- {
- DnsMock::withMockedHosts(array('example.com' => array(array('type' => $violation ? '' : 'A'))));
- $constraint = new Url(array(
- 'checkDNS' => true,
- 'dnsMessage' => 'myMessage',
- ));
- $this->validator->validate('http://example.com', $constraint);
- if (!$violation) {
- $this->assertNoViolation();
- } else {
- $this->buildViolation('myMessage')
- ->setParameter('{{ value }}', '"example.com"')
- ->setCode(Url::INVALID_URL_ERROR)
- ->assertRaised();
- }
- }
- public function getCheckDns()
- {
- return array(array(true), array(false));
- }
- }
- class EmailProvider
- {
- public function __toString()
- {
- return '';
- }
- }
|