Skip to content

Commit

Permalink
Added missing unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
aschempp committed Jul 7, 2020
1 parent 6ba5f7a commit 74f8c7c
Show file tree
Hide file tree
Showing 10 changed files with 916 additions and 21 deletions.
2 changes: 1 addition & 1 deletion core-bundle/src/Routing/Content/RootPageProvider.php
Expand Up @@ -56,7 +56,7 @@ public function getRouteForPage(PageModel $pageModel, $content = null, Request $

$route = new ContentRoute($pageModel);
$route->addDefaults([
'_controller' => RedirectController::class.'::urlRedirectAction',
'_controller' => RedirectController::class,
'path' => $nextPage->getAbsoluteUrl(),
'permanent' => false,
]);
Expand Down
18 changes: 5 additions & 13 deletions core-bundle/src/Routing/ContentResolvingGenerator.php
Expand Up @@ -50,27 +50,19 @@ public function __construct(iterable $resolvers, ServiceLocator $pageProviders,
*/
public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH): string
{
if (ContentRoute::ROUTE_NAME === $name && isset($parameters[ContentRoute::CONTENT_PARAMETER])) {
$route = $this->resolveContent($parameters[ContentRoute::CONTENT_PARAMETER]);
unset($parameters[ContentRoute::CONTENT_PARAMETER]);
} elseif (
ContentRoute::ROUTE_NAME === $name
&& isset($parameters[ContentRoute::ROUTE_OBJECT_PARAMETER])
&& $parameters[ContentRoute::ROUTE_OBJECT_PARAMETER] instanceof Route
) {
$route = $parameters[ContentRoute::ROUTE_OBJECT_PARAMETER];
unset($parameters[ContentRoute::ROUTE_OBJECT_PARAMETER]);
} else {
if (ContentRoute::ROUTE_NAME !== $name || !isset($parameters[ContentRoute::CONTENT_PARAMETER])) {
throw new ContentRouteNotFoundException($name);
}

$route = $this->resolveContent($parameters[ContentRoute::CONTENT_PARAMETER]);
unset($parameters[ContentRoute::CONTENT_PARAMETER]);

// the Route has a cache of its own and is not recompiled as long as it does not get modified
$compiledRoute = $route->compile();
$hostTokens = $compiledRoute->getHostTokens();

$debug_message = ContentRouteNotFoundException::getRouteDebugMessage($name);

return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $debug_message, $referenceType, $hostTokens);
return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $debug_message, $referenceType, $compiledRoute->getHostTokens(), $route->getSchemes());
}

private function resolveContent($content): Route
Expand Down
12 changes: 6 additions & 6 deletions core-bundle/src/Routing/LegacyRouteProvider.php
Expand Up @@ -40,6 +40,11 @@ public function getRouteCollectionForRequest(Request $request): RouteCollection
return new RouteCollection();
}

public function getRoutesByNames($names): array
{
return [];
}

public function getRouteByName($name): Route
{
$route = $this->loadRoute($name);
Expand All @@ -49,12 +54,7 @@ public function getRouteByName($name): Route
return $route;
}

public function getRoutesByNames($names): array
{
return [];
}

public function loadRoute($name): Route
private function loadRoute($name): Route
{
if ('contao_frontend' === $name || 'contao_index' === $name) {
return $this->frontendLoader->load('.', 'contao_frontend')->get($name);
Expand Down
130 changes: 130 additions & 0 deletions core-bundle/tests/Routing/Content/ArticleUrlResolverTest.php
@@ -0,0 +1,130 @@
<?php

namespace Contao\CoreBundle\Tests\Routing\Content;

use Contao\ArticleModel;
use Contao\CoreBundle\Routing\Content\ArticleUrlResolver;
use Contao\CoreBundle\Routing\Content\ContentRoute;
use Contao\CoreBundle\Tests\TestCase;
use Contao\PageModel;
use PHPUnit\Framework\MockObject\MockObject;
use Symfony\Component\Routing\Exception\RouteNotFoundException;

class ArticleUrlResolverTest extends TestCase
{
/**
* @var ArticleUrlResolver
*/
private $resolver;

protected function setUp(): void
{
$this->resolver = new ArticleUrlResolver();
}

public function testSupportsArticles(): void
{
$this->assertTrue($this->resolver->supportsContent($this->mockArticle()));
$this->assertFalse($this->resolver->supportsContent($this->mockClassWithProperties(PageModel::class)));
}

public function testCreatesParameterdContentRouteForArticle(): void
{
$page = $this->mockPage();
$article = $this->mockArticle(['alias' => 'foobar']);

$article
->expects($this->once())
->method('getRelated')
->with('pid')
->willReturn($page)
;

/** @var ContentRoute $route */
$route = $this->resolver->resolveContent($article);

$this->assertInstanceOf(ContentRoute::class, $route);
$this->assertSame($page, $route->getPage());
$this->assertSame('/foo/bar{parameters}.baz', $route->getPath());
$this->assertSame('/articles/foobar', $route->getDefault('parameters'));
}



public function testCreatesParameterdContentRouteWithIdIfArticleHasNoAlias(): void
{
$page = $this->mockPage();
$article = $this->mockArticle(['id' => 17, 'alias' => '']);

$article
->expects($this->once())
->method('getRelated')
->with('pid')
->willReturn($page)
;

/** @var ContentRoute $route */
$route = $this->resolver->resolveContent($article);

$this->assertInstanceOf(ContentRoute::class, $route);
$this->assertSame($page, $route->getPage());
$this->assertSame('/foo/bar{parameters}.baz', $route->getPath());
$this->assertSame('/articles/17', $route->getDefault('parameters'));
}

public function testThrowsExceptionIfPageIsNotFound(): void
{
$article = $this->mockArticle();

$article
->expects($this->once())
->method('getRelated')
->with('pid')
->willReturn(null)
;

$this->expectException(RouteNotFoundException::class);

$this->resolver->resolveContent($article);
}

/**
* @return ArticleModel&MockObject $article
*/
private function mockArticle(array $parameters = []): ArticleModel
{
return $this->mockClassWithProperties(
ArticleModel::class,
array_merge(
[
'id' => 5,
'pid' => 1,
'alias' => 'foo',
],
$parameters
)
);
}

/**
* @return PageModel&MockObject $page
*/
private function mockPage(array $properties = []): PageModel
{
return $this->mockClassWithProperties(
PageModel::class,
array_merge(
[
'id' => 17,
'alias' => 'bar',
'domain' => 'www.example.com',
'rootLanguage' => 'xy',
'rootUseSSL' => true,
'urlPrefix' => 'foo',
'urlSuffix' => '.baz',
],
$properties
)
);
}
}
133 changes: 133 additions & 0 deletions core-bundle/tests/Routing/Content/ContentRouteTest.php
@@ -0,0 +1,133 @@
<?php

namespace Contao\CoreBundle\Tests\Routing\Content;

use Contao\CoreBundle\Routing\Content\ContentRoute;
use Contao\CoreBundle\Tests\TestCase;
use Contao\PageModel;
use PHPUnit\Framework\MockObject\MockObject;

class ContentRouteTest extends TestCase
{
public function testReturnsThePageModel()
{
$page = $this->mockPage();

$route = new ContentRoute($page);

$this->assertSame($page, $route->getPage());
}

public function testRoutePathMergesPageAliasWithUrlPrefixAndSuffix(): void
{
$route = new ContentRoute($this->mockPage());

$this->assertSame('/foo/bar.baz', $route->getPath());

$route->setUrlPrefix('prefix');
$route->setUrlSuffix('.suffix');

$this->assertSame('/prefix/bar.suffix', $route->getPath());

$route->setPath('/path/{pattern}');

$this->assertSame('/prefix/path/{pattern}.suffix', $route->getPath());
}

public function testReturnsTheUrlPrefix(): void
{
$route = new ContentRoute($this->mockPage());

$this->assertSame('foo', $route->getUrlPrefix());

$route->setUrlPrefix('prefix');

$this->assertSame('prefix', $route->getUrlPrefix());
}

public function testReturnsTheUrlSuffix(): void
{
$route = new ContentRoute($this->mockPage());

$this->assertSame('.baz', $route->getUrlSuffix());

$route->setUrlSuffix('suffix');

$this->assertSame('suffix', $route->getUrlSuffix());
}

public function testReturnsTheContent(): void
{
$content = (object) ['foo' => 'bar'];

$route = new ContentRoute($this->mockPage(), $content);

$this->assertSame($content, $route->getContent());

$route->setContent('foo');
$this->assertSame('foo', $route->getContent());
}

public function testAddsPageLanguageAsLocaleToRouteDefaults(): void
{
$route = new ContentRoute($this->mockPage());

$this->assertSame('xy', $route->getDefault('_locale'));

$route = new ContentRoute($this->mockPage(['rootLanguage' => 'en']));

$this->assertSame('en', $route->getDefault('_locale'));
}

public function testSetsPageDomainAsRouteHost(): void
{
$route = new ContentRoute($this->mockPage());
$this->assertSame('www.example.com', $route->getHost());
}

public function testSetsProtocolIfRootPageUsesSSL(): void
{
$route = new ContentRoute($this->mockPage(['rootUseSSL' => false]));
$this->assertEmpty($route->getSchemes());

$route = new ContentRoute($this->mockPage(['rootUseSSL' => true]));
$this->assertSame(['https'], $route->getSchemes());
}

public function testCreatePageWithParametersAndRequiresItemIfConfigured(): void
{
$route = ContentRoute::createWithParameters($this->mockPage(['requireItem' => false]), '/items/news');

$this->assertSame('/foo/bar{parameters}.baz', $route->getPath());
$this->assertSame('/items/news', $route->getDefault('parameters'));
$this->assertSame('(/.+)?', $route->getRequirement('parameters'));

$route = ContentRoute::createWithParameters($this->mockPage(['requireItem' => true]), '/items/news');

$this->assertSame('/foo/bar{parameters}.baz', $route->getPath());
$this->assertSame('/items/news', $route->getDefault('parameters'));
$this->assertSame('/.+', $route->getRequirement('parameters'));
}

/**
* @return PageModel&MockObject $page
*/
private function mockPage(array $properties = []): PageModel
{
return $this->mockClassWithProperties(
PageModel::class,
array_merge(
[
'id' => 17,
'alias' => 'bar',
'domain' => 'www.example.com',
'rootLanguage' => 'xy',
'rootUseSSL' => true,
'urlPrefix' => 'foo',
'urlSuffix' => '.baz',
],
$properties
)
);
}
}
64 changes: 64 additions & 0 deletions core-bundle/tests/Routing/Content/PageUrlResolverTest.php
@@ -0,0 +1,64 @@
<?php

namespace Contao\CoreBundle\Tests\Routing\Content;

use Contao\ArticleModel;
use Contao\CoreBundle\Routing\Content\ContentRoute;
use Contao\CoreBundle\Routing\Content\PageUrlResolver;
use Contao\CoreBundle\Tests\TestCase;
use Contao\PageModel;
use PHPUnit\Framework\MockObject\MockObject;

class PageUrlResolverTest extends TestCase
{
/**
* @var PageUrlResolver
*/
private $resolver;

protected function setUp(): void
{
$this->resolver = new PageUrlResolver();
}

public function testSupportsPages(): void
{
$this->assertTrue($this->resolver->supportsContent($this->mockPage()));
$this->assertFalse($this->resolver->supportsContent($this->mockClassWithProperties(ArticleModel::class)));
}

public function testCreatesParameterdContentRoute(): void
{
$page = $this->mockPage();

/** @var ContentRoute $route */
$route = $this->resolver->resolveContent($page);

$this->assertInstanceOf(ContentRoute::class, $route);
$this->assertSame($page, $route->getPage());
$this->assertSame('/foo/bar{parameters}.baz', $route->getPath());
$this->assertSame('', $route->getDefault('parameters'));
}

/**
* @return PageModel&MockObject $page
*/
private function mockPage(array $properties = []): PageModel
{
return $this->mockClassWithProperties(
PageModel::class,
array_merge(
[
'id' => 17,
'alias' => 'bar',
'domain' => 'www.example.com',
'rootLanguage' => 'xy',
'rootUseSSL' => true,
'urlPrefix' => 'foo',
'urlSuffix' => '.baz',
],
$properties
)
);
}
}

0 comments on commit 74f8c7c

Please sign in to comment.