Skip to content

Commit

Permalink
refactored tests to use data providers instead of single-test loops t…
Browse files Browse the repository at this point in the history
…hat take forever
  • Loading branch information
robfrawley committed May 31, 2017
1 parent 2f850cf commit fe40213
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 43 deletions.
30 changes: 17 additions & 13 deletions tests/AppBundle/Controller/ArticleListControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,41 @@

use Rf\AppBundle\Tests\AutoSetupTestTrait;
use Rf\AppBundle\Tests\ClientTestTrait;
use Rf\AppBundle\Tests\CrawlerTestTrait;
use Rf\AppBundle\Tests\KernelTestTrait;
use Rf\AppBundle\Tests\RouterTestTrait;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ArticleListControllerTest extends WebTestCase
{
use AutoSetupTestTrait;
use ClientTestTrait;
use CrawlerTestTrait;
use KernelTestTrait;
use RouterTestTrait;

public function testAction()
{
$this->assertPageIsValid('/article/list');
$this->assertValidUrl($this->generateRoute('app.article_list'));
}

public function testActionPaginated()
/**
* @return int[]
*/
public static function dataPageProvider(): array
{
foreach (range(0, 4) as $page) {
$this->assertPageIsValid(sprintf('/article/list?page=%d', $page));
}
return array_map(function (int $page) {
return [$page];
}, [0, 1, 2, 3, 4]);
}

/**
* @param string $uri
* @param int $page
*
* @dataProvider dataPageProvider
*/
private function assertPageIsValid(string $uri)
public function testActionPaginated(int $page)
{
$client = static::createTestClient();

$crawler = $client->request('GET', $uri);

$this->assertSame(200, $client->getResponse()->getStatusCode());
$this->assertCount(10, $crawler->filter('ul.article-list li'));
$this->assertValidUrl(sprintf('%s?page=%d', $this->generateRoute('app.article_list'), $page));
}
}
77 changes: 47 additions & 30 deletions tests/AppBundle/Controller/ArticleViewControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
namespace Rf\AppBundle\Tests\Controller;

use Rf\AppBundle\Doctrine\Entity\Article;
use Rf\AppBundle\Doctrine\Repository\ArticleRepository;
use Rf\AppBundle\Tests\AutoSetupTestTrait;
use Rf\AppBundle\Tests\ClientTestTrait;
use Rf\AppBundle\Tests\CrawlerTestTrait;
use Rf\AppBundle\Tests\KernelTestTrait;
use Rf\AppBundle\Tests\RepositoryTestTrait;
use Rf\AppBundle\Tests\RouterTestTrait;
Expand All @@ -24,21 +26,20 @@ class ArticleViewControllerTest extends WebTestCase
{
use AutoSetupTestTrait;
use ClientTestTrait;
use CrawlerTestTrait;
use KernelTestTrait;
use RepositoryTestTrait;
use RouterTestTrait;

public function testActionNotFound()
{
$uri = $this->router->getGenerator()->generate('app.article_view', [
$client = static::createTestClient();
$client->request('GET', $this->generateRoute('app.article_view', [
'year' => '1200',
'month' => '01',
'day' => '01',
'slug' => 'does-not-exist',
], RouterInterface::RELATIVE_PATH);

$client = static::createTestClient();
$client->request('GET', $uri);
]));

$this->assertSame(404, $client->getResponse()->getStatusCode());
}
Expand All @@ -48,51 +49,67 @@ public function testActionNotFound()
*/
public function testActionMissingRequestAttributes()
{
$uri = $this->router->getGenerator()->generate('app.article_view', [], RouterInterface::RELATIVE_PATH);

$client = static::createTestClient();
$client->request('GET', $uri);
$client->request('GET', $this->generateRoute('app.article_view'));
$client->getResponse();
}

public function testAction()
public static function provideArticleData()
{
$kernel = static::bootKernel();

/** @var ArticleRepository $repository */
$repository = $kernel
->getContainer()
->get('doctrine')
->getManager()
->getRepository(Article::class);

return array_map(function (Article $article) {
return [$article];
}, $repository->findAll());
}

/**
* @param Article $article
*
* @dataProvider provideArticleData
*/
public function testAction(Article $article)
{
foreach ($this->repository->findAll() as $entity) {
$this->assertEntityRouteExists($entity);
}
$this->assertEntityRouteExists($article);
}

/**
* @param Article $article
*
* @dataProvider provideArticleData
*/
public function testPermalinkAction(Article $article)
{
$this->assertEntityRouteExists($article);
}

/**
* @param Article $article
*/
private function assertEntityRouteExists(Article $article)
{
$uri = $this->router->getGenerator()->generate('app.article_view', [
$this->assertValidUrl($this->generateRoute('app.article_view', [
'year' => $article->getCreated()->format('Y'),
'month' => $article->getCreated()->format('m'),
'day' => $article->getCreated()->format('d'),
'slug' => $article->getSlug(),
], RouterInterface::RELATIVE_PATH);

$this->assertPageIsValid($uri);
], RouterInterface::RELATIVE_PATH));
}

/**
* @param string $uri
* @param Article $article
*/
private function assertPageIsValid(string $uri)
private function assertEntityPermalinkRouteExists(Article $article)
{
$client = static::createTestClient();

$crawler = $client->request('GET', $uri);

$this->assertSame(200, $client->getResponse()->getStatusCode());
$this->assertTrue($crawler->filter('h1')->count() > 0);
$this->assertTrue($crawler->filter('h2')->count() > 0);
$this->assertTrue($crawler->filter('h3')->count() > 0);
$this->assertTrue($crawler->filter('ul')->count() > 0);
$this->assertTrue($crawler->filter('ol')->count() > 0);
$this->assertTrue($crawler->filter('li')->count() > 0);
$this->assertTrue($crawler->filter('p')->count() > 0);
$this->assertValidUrl($this->generateRoute('app.article_permalink', [
'uuid' => $article->getIdentity(),
], RouterInterface::RELATIVE_PATH));
}
}
47 changes: 47 additions & 0 deletions tests/AppBundle/CrawlerTestTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

/*
* This file is part of the `src-run/rf-app` project.
*
* (c) Rob Frawley 2nd <rmf@src.run>
*
* For the full copyright and license information, please view the LICENSE.md
* file that was distributed with this source code.
*/

namespace Rf\AppBundle\Tests;

use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpKernel\Client;

trait CrawlerTestTrait
{
/**
* @param string $url
*
* @return Crawler
*/
private function getClientRequestCrawler(string $url): Crawler
{
return static::createTestClient()->request('GET', $url);
}

/**
* @param string $url
*/
private function assertValidUrl(string $url)
{
$client = static::createTestClient();
$client->request('GET', $url);

$this->assertSame(200, $client->getResponse()->getStatusCode());
}

/**
* @param array $options
* @param array $server
*
* @return Client
*/
abstract static function createTestClient(array $options = array(), array $server = array());
}
13 changes: 13 additions & 0 deletions tests/AppBundle/RouterTestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
namespace Rf\AppBundle\Tests;

use Symfony\Component\Routing\Router;
use Symfony\Component\Routing\RouterInterface;

trait RouterTestTrait
{
Expand All @@ -25,4 +26,16 @@ private function autoSetUp100Router()
$this->router = static::$kernel->getContainer()
->get('router');
}

/**
* @param string $name
* @param array $parameters
* @param int $type
*
* @return string
*/
private function generateRoute(string $name, array $parameters = [], $type = RouterInterface::RELATIVE_PATH): string
{
return $this->router->getGenerator()->generate($name, $parameters, $type);
}
}

0 comments on commit fe40213

Please sign in to comment.