diff --git a/tests/AppBundle/Controller/ArticleListControllerTest.php b/tests/AppBundle/Controller/ArticleListControllerTest.php index 055d2c0..ee483e5 100644 --- a/tests/AppBundle/Controller/ArticleListControllerTest.php +++ b/tests/AppBundle/Controller/ArticleListControllerTest.php @@ -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)); } } diff --git a/tests/AppBundle/Controller/ArticleViewControllerTest.php b/tests/AppBundle/Controller/ArticleViewControllerTest.php index c298bba..49eb885 100644 --- a/tests/AppBundle/Controller/ArticleViewControllerTest.php +++ b/tests/AppBundle/Controller/ArticleViewControllerTest.php @@ -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; @@ -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()); } @@ -48,18 +49,45 @@ 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); } /** @@ -67,32 +95,21 @@ public function testAction() */ 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)); } } diff --git a/tests/AppBundle/CrawlerTestTrait.php b/tests/AppBundle/CrawlerTestTrait.php new file mode 100644 index 0000000..46c0e3a --- /dev/null +++ b/tests/AppBundle/CrawlerTestTrait.php @@ -0,0 +1,47 @@ + + * + * 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()); +} diff --git a/tests/AppBundle/RouterTestTrait.php b/tests/AppBundle/RouterTestTrait.php index 8c3700d..d425593 100644 --- a/tests/AppBundle/RouterTestTrait.php +++ b/tests/AppBundle/RouterTestTrait.php @@ -12,6 +12,7 @@ namespace Rf\AppBundle\Tests; use Symfony\Component\Routing\Router; +use Symfony\Component\Routing\RouterInterface; trait RouterTestTrait { @@ -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); + } }