Skip to content

Instantly share code, notes, and snippets.

@Jibbarth
Last active December 10, 2020 20:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jibbarth/87d11a489259049acc56b8254d411f62 to your computer and use it in GitHub Desktop.
Save Jibbarth/87d11a489259049acc56b8254d411f62 to your computer and use it in GitHub Desktop.
[Sylius] Test all admin menu links 🦢
<?php
declare(strict_types=1);
namespace App\Tests;
use App\Entity\User\AdminUser;
use Knp\Menu\MenuItem;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
/**
* @internal
*/
final class AdminMenuLinkTest extends WebTestCase
{
private KernelBrowser $client;
protected function setUp(): void
{
$this->client = static::createClient();
}
/**
* @dataProvider provideMenuLink
*/
public function testAccessToMenuLinkInAdmin(string $routeName, array $parameters): void
{
/** @var UrlGeneratorInterface $urlGenerator */
$urlGenerator = self::$container->get(UrlGeneratorInterface::class);
$url = $urlGenerator->generate($routeName, $parameters);
$this->logIn();
$this->client->request('GET', $url);
$response = $this->client->getResponse();
self::assertSame(200, $response->getStatusCode(), 'Unable to get successful response on ' . $routeName);
}
public function provideMenuLink(): \Generator
{
static::bootKernel();
/** @var \Sylius\Bundle\AdminBundle\Menu\MainMenuBuilder $menu */
$menu = self::$container->get('sylius.admin.menu_builder.main');
/** @var \Knp\Menu\ItemInterface $menu */
$menu = $menu->createMenu([]);
$categories = \iterator_to_array($menu->getIterator());
/** @var \Knp\Menu\MenuItem $category */
foreach ($categories as $category) {
if (null !== $category->getUri()) {
yield $category->getUri() => $this->getRouteParam($category);
}
$mainLinks = \iterator_to_array($category->getIterator());
/** @var \Knp\Menu\MenuItem $link */
foreach ($mainLinks as $link) {
yield $link->getUri() => $this->getRouteParam($link);
}
}
}
private function getRouteParam(MenuItem $item): array
{
$routeExtra = $item->getExtra('routes')[0];
return [$routeExtra['route'], $routeExtra['parameters']];
}
/**
* @see https://symfony.com/doc/4.4/testing/http_authentication.html#creating-the-authentication-token
*/
private function logIn(): void
{
$session = self::$container->get('session');
/** @var AdminUser $user */
$user = self::$container->get('doctrine')
->getRepository(AdminUser::class)
->findOneBy(['username' => 'sylius']);
$firewallName = 'admin';
$firewallContext = 'admin';
$token = new UsernamePasswordToken($user, null, $firewallName, $user->getRoles());
$session->set('_security_' . $firewallContext, \serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment