Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 86 additions & 8 deletions src/Test/Controller/AdminControllerWebTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
use DOMElement;
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\CrudControllerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\DashboardControllerInterface;
use Override;
use Psl\Dict;
use Psl\Iter;
use Psl\Str;
Expand All @@ -19,12 +22,11 @@
use Symfony\Component\HttpFoundation\Response;

use function array_merge;
use function http_build_query;
use function is_array;
use function iterator_to_array;

/**
* @template TCrudController
* @template TCrudController of CrudControllerInterface
*/
abstract class AdminControllerWebTestCase extends AdminWebTestCase
{
Expand All @@ -33,6 +35,9 @@ abstract class AdminControllerWebTestCase extends AdminWebTestCase
*/
abstract protected function controllerUnderTest(): string;

/**
* @return non-empty-string
*/
abstract protected function actionName(): string;

protected static function easyAdminRoutePath(): string
Expand Down Expand Up @@ -64,22 +69,55 @@ protected function assertRequestGet(
* @param array<array-key, mixed> $queryParameters
*/
protected function prepareAdminUrl(array $queryParameters, string|null $fragment = null): string
{
if (! static::usePrettyUrls()) {
return $this->prepareLegacyAdminUrl($queryParameters, $fragment);
}

return $this->generateAdminPrettyUrl(
dashboardFqcn: $this->dashboardControllerFqcn(),
crudControllerFqcn: $this->controllerUnderTest(),
actionName: $this->actionName(),
routeParameters: $this->prepareAdminUrlRouteParameters(),
queryParameters: $queryParameters,
fragment: $fragment,
);
}

/**
* @param array<array-key, mixed> $queryParameters
*/
protected function prepareLegacyAdminUrl(array $queryParameters, string|null $fragment = null): string
{
return static::easyAdminRoutePath() . '?' . $this->prepareAdminUrlQueryParameters($queryParameters) . ($fragment ?? '');
}

/**
* @return array<array-key, mixed> $routeParameters
*/
protected function prepareAdminUrlRouteParameters(): array
{
return [];
}

/** @return class-string<DashboardControllerInterface>|null */
protected function dashboardControllerFqcn(): string|null
{
return null;
}

/**
* @param array<array-key, mixed> $queryParameters
*/
#[Override]
protected function prepareAdminUrlQueryParameters(array $queryParameters): string
{
$queryParameters[EA::CRUD_CONTROLLER_FQCN] ??= $this->controllerUnderTest();
$queryParameters[EA::CRUD_ACTION] ??= $this->actionName();

// we need to prepare the URL having some query parameters in a specific order
$queryParameters = Dict\sort_by_key($queryParameters);
if (! static::usePrettyUrls()) {
$queryParameters[EA::CRUD_CONTROLLER_FQCN] ??= $this->controllerUnderTest();
$queryParameters[EA::CRUD_ACTION] ??= $this->actionName();
}

return http_build_query($queryParameters);
return parent::prepareAdminUrlQueryParameters($queryParameters);
}

/**
Expand Down Expand Up @@ -202,6 +240,46 @@ protected function assertPageTitle(string $expectedPageTitle): void
self::assertSame($expectedPageTitle, $title->text(normalizeWhitespace: true));
}

/**
* @param class-string<CrudControllerInterface> $crudControllerFqcn
* @param non-empty-string $actionName
* @param array<array-key, mixed> $redirectQueryParameters
*/
protected function assertResponseRedirectsToCrudController(
string $crudControllerFqcn,
string $actionName,
string|int|null $entityId = null,
array $redirectQueryParameters = [],
string|null $fragment = null,
): void {
if (static::usePrettyUrls()) {
$redirectRouteParameters = [];
if ($entityId !== null) {
$redirectRouteParameters[EA::ENTITY_ID] = $entityId;
}

$expectedRedirectUrl = 'http://' . static::serverHost() . $this->generateAdminPrettyUrl(
$this->dashboardControllerFqcn(),
$crudControllerFqcn,
$actionName,
$redirectRouteParameters,
$redirectQueryParameters,
$fragment,
);

self::assertResponseRedirectsToUrl($this->getClient()->getResponse(), $expectedRedirectUrl);
} else {
$redirectQueryParameters[EA::CRUD_CONTROLLER_FQCN] ??= $crudControllerFqcn;
$redirectQueryParameters[EA::CRUD_ACTION] ??= $actionName;

if ($entityId !== null) {
$redirectQueryParameters[EA::ENTITY_ID] = $entityId;
}

$this->assertResponseIsRedirect($redirectQueryParameters, $fragment);
}
}

/**
* @param array<array-key, mixed> $redirectQueryParameters
*/
Expand Down
56 changes: 56 additions & 0 deletions src/Test/Controller/AdminWebTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@

namespace Protung\EasyAdminPlusBundle\Test\Controller;

use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\CrudControllerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\DashboardControllerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminRouteGenerator;
use Override;
use Psl\Dict;
use Psl\Iter;
use Psl\Str;
use Psl\Type;
Expand All @@ -15,11 +19,13 @@
use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionFactoryInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\User\InMemoryUser;
use Symfony\Component\Security\Core\User\UserInterface;

use function array_merge;
use function http_build_query;
use function serialize;

abstract class AdminWebTestCase extends WebTestCase
Expand Down Expand Up @@ -51,6 +57,11 @@ protected static function authenticationFirewallContext(): string
return 'easyadmin';
}

protected static function usePrettyUrls(): bool
{
return false;
}

/** @param array<mixed> $server */
#[Override]
protected static function createClient(array $server = []): KernelBrowser
Expand Down Expand Up @@ -139,6 +150,51 @@ protected static function loginAsAdmin(): UserInterface
return $user;
}

/**
* @param class-string<DashboardControllerInterface>|null $dashboardFqcn
* @param class-string<CrudControllerInterface> $crudControllerFqcn
* @param non-empty-string $actionName
* @param array<array-key, mixed> $routeParameters
* @param array<array-key, mixed> $queryParameters
*/
protected function generateAdminPrettyUrl(
string|null $dashboardFqcn,
string $crudControllerFqcn,
string $actionName,
array $routeParameters = [],
array $queryParameters = [],
string|null $fragment = null,
): string {
$route = $this->getContainerService(AdminRouteGenerator::class)->findRouteName(
dashboardFqcn: $dashboardFqcn,
crudControllerFqcn: $crudControllerFqcn,
actionName: $actionName,
);

$path = $this->getContainerService(UrlGeneratorInterface::class)->generate(
Type\non_empty_string()->assert($route),
$routeParameters,
);

$queryAndFragment = $this->prepareAdminUrlQueryParameters($queryParameters) . ($fragment ?? '');
if ($queryAndFragment !== '') {
return $path . '?' . $queryAndFragment;
}

return $path;
}

/**
* @param array<array-key, mixed> $queryParameters
*/
protected function prepareAdminUrlQueryParameters(array $queryParameters): string
{
// we need to prepare the URL having some query parameters in a specific order
$queryParameters = Dict\sort_by_key($queryParameters);

return http_build_query($queryParameters);
}

/**
* @param non-empty-string $expectedMessage
* @param non-empty-string ...$expectedMessages
Expand Down
2 changes: 1 addition & 1 deletion src/Test/Controller/AutocompleteActionTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
use function array_merge;

/**
* @template TController
* @template TController of CrudControllerInterface
* @template-extends CustomActionTestCase<TController>
*/
abstract class AutocompleteActionTestCase extends CustomActionTestCase
Expand Down
3 changes: 2 additions & 1 deletion src/Test/Controller/CustomActionTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\CrudControllerInterface;
use Override;
use Psl\Type;
use Symfony\Component\DomCrawler\Crawler;
Expand All @@ -15,7 +16,7 @@
use Symfony\Component\HttpFoundation\Response;

/**
* @template TCrudController
* @template TCrudController of CrudControllerInterface
* @template-extends AdminControllerWebTestCase<TCrudController>
*/
abstract class CustomActionTestCase extends AdminControllerWebTestCase
Expand Down
7 changes: 4 additions & 3 deletions src/Test/Controller/DashboardControllerTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Protung\EasyAdminPlusBundle\Test\Controller;

use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\DashboardControllerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Psl\Dict;
use Psl\Str;
Expand All @@ -14,7 +15,7 @@
use function array_key_exists;

/**
* @template TDashboardController
* @template TDashboardController of DashboardControllerInterface
*/
abstract class DashboardControllerTestCase extends AdminWebTestCase
{
Expand Down Expand Up @@ -100,7 +101,7 @@ protected function prepareDashboardUrl(array $routeParameters): string
{
return $this->getContainerService(AdminUrlGenerator::class)
->setAll(Dict\sort_by_key($routeParameters))
->setDashboard($this->getDashboardControllerFqcn())
->setDashboard($this->dashboardControllerFqcn())
->generateUrl();
}

Expand All @@ -118,5 +119,5 @@ private function makeGetRequestAndFollowRedirects(string $url): Crawler
/**
* @return class-string<TDashboardController>
*/
abstract protected function getDashboardControllerFqcn(): string;
abstract protected function dashboardControllerFqcn(): string;
}
15 changes: 14 additions & 1 deletion src/Test/Controller/DeleteActionTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ protected function assertRemovingEntityFromDetailPageAndRedirectingToIndexAction
*/
protected function assertDeleteEntityRespondsWithStatusCodeForbidden(array $queryParameters = []): void
{
if (! array_key_exists(EA::ENTITY_ID, $queryParameters)) {
if (! static::usePrettyUrls() && ! array_key_exists(EA::ENTITY_ID, $queryParameters)) {
$queryParameters[EA::ENTITY_ID] = $this->entityIdUnderTest();
}

Expand Down Expand Up @@ -129,6 +129,19 @@ protected function entityIdUnderTest(): string|int
return static::$expectedEntityIdUnderTest;
}

/**
* @return array<array-key, mixed> $routeParameters
*/
#[Override]
protected function prepareAdminUrlRouteParameters(): array
{
$routeParameters = parent::prepareAdminUrlRouteParameters();

$routeParameters[EA::ENTITY_ID] ??= $this->entityIdUnderTest();

return $routeParameters;
}

/**
* @return TEntity|null
*/
Expand Down
20 changes: 17 additions & 3 deletions src/Test/Controller/DetailActionTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\CrudControllerInterface;
use LogicException;
use Override;
use Psl\Str;
Expand All @@ -17,7 +18,7 @@
use function array_key_exists;

/**
* @template TCrudController
* @template TCrudController of CrudControllerInterface
* @template-extends AdminControllerWebTestCase<TCrudController>
*/
abstract class DetailActionTestCase extends AdminControllerWebTestCase
Expand Down Expand Up @@ -48,12 +49,25 @@ protected function entityIdUnderTest(): string|int
return static::$expectedEntityIdUnderTest;
}

/**
* @return array<array-key, mixed> $routeParameters
*/
#[Override]
protected function prepareAdminUrlRouteParameters(): array
{
$routeParameters = parent::prepareAdminUrlRouteParameters();

$routeParameters[EA::ENTITY_ID] ??= $this->entityIdUnderTest();

return $routeParameters;
}

/**
* @param array<array-key, mixed> $queryParameters
*/
public function assertRespondsWithStatusCodeForbidden(array $queryParameters = []): void
{
if (! array_key_exists(EA::ENTITY_ID, $queryParameters)) {
if (! static::usePrettyUrls() && ! array_key_exists(EA::ENTITY_ID, $queryParameters)) {
$queryParameters[EA::ENTITY_ID] = $this->entityIdUnderTest();
}

Expand All @@ -65,7 +79,7 @@ public function assertRespondsWithStatusCodeForbidden(array $queryParameters = [
*/
protected function assertPage(array $queryParameters = []): void
{
if (! array_key_exists(EA::ENTITY_ID, $queryParameters)) {
if (! static::usePrettyUrls() && ! array_key_exists(EA::ENTITY_ID, $queryParameters)) {
$queryParameters[EA::ENTITY_ID] = $this->entityIdUnderTest();
}

Expand Down
Loading