Pārlūkot izejas kodu

Merge remote branch 'jakzal/routing-tests'

Fabien Potencier 14 gadi atpakaļ
vecāks
revīzija
a44f8d8de4

+ 46 - 0
tests/Symfony/Tests/Component/Routing/Annotation/RouteTest.php

@@ -0,0 +1,46 @@
+<?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\Tests\Component\Routing\Annotation;
+
+use Symfony\Component\Routing\Annotation\Route;
+
+class RouteTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @expectedException \BadMethodCallException
+     */
+    public function testInvalidRouteParameter()
+    {
+        $route = new Route(array('foo' => 'bar'));
+    }
+
+    /**
+     * @dataProvider getValidParameters
+     */
+    public function testRouteParameters($parameter, $value, $getter)
+    {
+        $route = new Route(array($parameter => $value));
+        $this->assertEquals($route->$getter(), $value);
+    }
+
+    public function getValidParameters()
+    {
+        return array(
+           array('value', '/Blog', 'getPattern'),
+           array('requirements', array('_method' => 'GET'), 'getRequirements'),
+           array('options', array('segment_separators' => array('/')), 'getOptions'),
+           array('name', 'blog_index', 'getName'),
+           array('defaults', array('_controller' => 'MyBlogBundle:Blog:index'), 'getDefaults')
+        );
+    }
+}
+

+ 2 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/incomplete.yml

@@ -0,0 +1,2 @@
+blog_show:
+    defaults:  { _controller: MyBlogBundle:Blog:show }

+ 12 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/nonvalid.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+    <route id="blog_show" pattern="/blog/{slug}">
+        <default key="_controller">MyBundle:Blog:show</default>
+		<requirement key="_method">GET</requirement>
+		<option key="segment_separators">/</option>
+	<!-- </route> -->
+</routes>

+ 8 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/nonvalidnode.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+	<foo>bar</foo>
+</routes>

+ 13 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/nonvalidroute.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+    <route id="blog_show" pattern="/blog/{slug}">
+        <default key="_controller">MyBundle:Blog:show</default>
+		<requirement key="_method">GET</requirement>
+		<option key="segment_separators">/</option>
+		<foo key="bar">baz</foo>
+    </route>
+</routes>

+ 10 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/validpattern.php

@@ -0,0 +1,10 @@
+<?php
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+
+$collection = new RouteCollection();
+$collection->add('blog_show', new Route('/blog/{slug}', array(
+    '_controller' => 'MyBlogBundle:Blog:show',
+)));
+
+return $collection;

+ 12 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/validpattern.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+    <route id="blog_show" pattern="/blog/{slug}">
+        <default key="_controller">MyBundle:Blog:show</default>
+		<requirement key="_method">GET</requirement>
+		<option key="segment_separators">/</option>
+    </route>
+</routes>

+ 4 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/validpattern.yml

@@ -0,0 +1,4 @@
+blog_show:
+    pattern:   /blog/{slug}
+    defaults:  { _controller: MyBlogBundle:Blog:show }
+

+ 8 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/validresource.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+    <import resource="validpattern.xml" />
+</routes>

+ 2 - 0
tests/Symfony/Tests/Component/Routing/Fixtures/validresource.yml

@@ -0,0 +1,2 @@
+blog_show:
+    resource: validpattern.yml

+ 12 - 0
tests/Symfony/Tests/Component/Routing/Loader/PhpFileLoaderTest.php

@@ -12,6 +12,7 @@
 namespace Symfony\Tests\Component\Routing\Loader;
 
 use Symfony\Component\Config\Loader\LoaderResolver;
+use Symfony\Component\Config\FileLocator;
 use Symfony\Component\Routing\Loader\PhpFileLoader;
 use Symfony\Component\Routing\Route;
 use Symfony\Component\Routing\RouteCollection;
@@ -31,4 +32,15 @@ class PhpFileLoaderTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($loader->supports('foo.php', 'php'), '->supports() checks the resource type if specified');
         $this->assertFalse($loader->supports('foo.php', 'foo'), '->supports() checks the resource type if specified');
     }
+
+    public function testLoadWithRoute()
+    {
+        $loader = new PhpFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $routeCollection = $loader->load('validpattern.php');
+        $routes = $routeCollection->all();
+
+        $this->assertEquals(1, count($routes), 'One route is loaded');
+        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+    }
 }
+

+ 58 - 0
tests/Symfony/Tests/Component/Routing/Loader/XmlFileLoaderTest.php

@@ -12,6 +12,7 @@
 namespace Symfony\Tests\Component\Routing\Loader;
 
 use Symfony\Component\Config\Loader\LoaderResolver;
+use Symfony\Component\Config\FileLocator;
 use Symfony\Component\Routing\Loader\XmlFileLoader;
 use Symfony\Component\Routing\Route;
 use Symfony\Component\Routing\RouteCollection;
@@ -31,4 +32,61 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
         $this->assertTrue($loader->supports('foo.xml', 'xml'), '->supports() checks the resource type if specified');
         $this->assertFalse($loader->supports('foo.xml', 'foo'), '->supports() checks the resource type if specified');
     }
+
+    public function testLoadWithRoute()
+    {
+        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $routeCollection = $loader->load('validpattern.xml');
+        $routes = $routeCollection->all();
+
+        $this->assertEquals(1, count($routes), 'One route is loaded');
+        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+    }
+
+    public function testLoadWithImport()
+    {
+        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $routeCollection = $loader->load('validresource.xml');
+        $routes = $routeCollection->all();
+
+        $this->assertEquals(1, count($routes), 'One route is loaded');
+        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @dataProvider getPathsToInvalidFiles
+     */
+    public function testLoadThrowsExceptionWithInvalidFile($filePath)
+    {
+        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $loader->load($filePath);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @dataProvider getPathsToInvalidFiles
+     */
+    public function testLoadThrowsExceptionWithInvalidFileEvenWithoutSchemaValidation($filePath)
+    {
+        $loader = new CustomXmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $loader->load($filePath);
+    }
+
+    public function getPathsToInvalidFiles()
+    {
+        return array(array('nonvalidnode.xml'), array('nonvalidroute.xml'), array('nonvalid.xml'));
+    }
 }
+
+/**
+ * XmlFileLoader with schema validation turned off
+ */
+class CustomXmlFileLoader extends XmlFileLoader
+{
+    protected function validate(\DOMDocument $dom)
+    {
+        return true;
+    }
+}
+

+ 58 - 0
tests/Symfony/Tests/Component/Routing/Loader/YamlFileLoaderTest.php

@@ -60,4 +60,62 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
         $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
         $loader->load('nonvalidkeys.yml');
     }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testLoadThrowsExceptionWhenIncomplete()
+    {
+        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $loader->load('incomplete.yml');
+    }
+
+    public function testLoadWithPattern()
+    {
+        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $routeCollection = $loader->load('validpattern.yml');
+        $routes = $routeCollection->all();
+
+        $this->assertEquals(1, count($routes), 'One route is loaded');
+        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+    }
+
+    public function testLoadWithResource()
+    {
+        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $routeCollection = $loader->load('validresource.yml');
+        $routes = $routeCollection->all();
+
+        $this->assertEquals(1, count($routes), 'One route is loaded');
+        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testParseRouteThrowsExceptionWithMissingPattern()
+    {
+        $loader = new CustomYamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+        $loader->load('incomplete.yml');
+    }
+}
+
+class CustomYamlFileLoader extends YamlFileLoader
+{
+    public function load($file, $type = null)
+    {
+        $path = $this->locator->locate($file);
+
+        $config = $this->loadFile($path);
+
+        $collection = new RouteCollection();
+        $collection->addResource(new FileResource($path));
+
+        foreach ($config as $name => $config) {
+            $this->parseRoute($collection, $name, $config, $path);
+        }
+
+        return $collection;
+    }
 }
+

+ 7 - 0
tests/Symfony/Tests/Component/Routing/RouteTest.php

@@ -85,6 +85,13 @@ class RouteTest extends \PHPUnit_Framework_TestCase
         $route->setRequirements(array('foo' => array('bar', 'baz')));
     }
 
+    public function testRequirement()
+    {
+        $route = new Route('/{foo}');
+        $route->setRequirement('foo', '^\d+$');
+        $this->assertEquals('\d+', $route->getRequirement('foo'), '->setRequirement() removes ^ and $ from the pattern');
+    }
+
     public function testCompile()
     {
         $route = new Route('/{foo}');