Closed soullivaneuh closed 3 years ago
I managed to transform my test to get rid of liip-functional-test-bundle:
final class AdminControllerTest extends WebTestCase
{
public function testSecurityAccess(): void
{
// @see https://symfony.com/doc/4.4/testing/http_authentication.html#creating-the-authentication-token
$this->login('user_default');
$this->client->request('GET', '/admin/dashboard');
$this->assertResponseStatusCodeSame(403);
}
/**
* @dataProvider getSearchTestData
*/
public function testSearch(string $username, string $query, string $expectedLink): void
{
$this->login($username);
$crawler = $this->client->request('GET', '/admin/search', [
'q' => $query,
]);
$this->assertResponseIsSuccessful();
self::assertStringContainsString($expectedLink, $crawler->text());
}
/**
* @return string[][]
*/
public function getSearchTestData(): array
{
return [
['user_super_admin', 'default', 'John DOE'],
['user_super_admin', 'default', 'default.net (Hello World)'],
['user_support', 'default', 'John DOE'],
['user_support', 'default', 'default.net (Hello World)'],
['user_commercial', 'default', 'John DOE'],
['user_commercial', 'default', 'default.net (Hello World)'],
];
}
}
But I have exactly the same result.
I also suspected this breaking change: https://github.com/doctrine/DoctrineBundle/blob/2.3.x/UPGRADE-2.0.md#unitofwork-cleared-between-each-request
However:
So I don't think it's related.
Based on the query, can you please try with https://github.com/sonata-project/SonataDoctrineORMAdminBundle/releases/tag/3.31.0? maybe it's related to https://github.com/sonata-project/SonataDoctrineORMAdminBundle/pull/1358
As you can see on my issue description, I already have the latest release of this bundle:
sonata-project/doctrine-orm-admin-bundle 3.33.0 3.33.0 Integrate Doctrine ORM into the SonataAdminBundle
So I don't know if it's related, but it does not solve the problem. :slightly_smiling_face:
Oh I maybe misunderstood. Do you want me to try a downgrade?
You was right, downgrading to 3.31.0 resolves the problem. :+1:
According to my git bisect, the commit that introduced the bug is this one: https://github.com/sonata-project/SonataDoctrineORMAdminBundle/commit/0094a4502a33eb7a0dc94ab83d2342716be60f9c
Note: I add another test bug during git bisect, but not related to this error. So I considered the commits as good.
Bisect init:
git checkout 3.33.0
git bisect start
git bisect bad
git bisect good 3.31.0
I confirm:
So it's looks more to be related to https://github.com/sonata-project/SonataDoctrineORMAdminBundle/pull/1373.
Maybe the rename introduced some king of breaking change? :thinking:
Ping @phansys
@franmomu You pointed a sonata test files. Why do you think it's related? :thinking:
So was indeed related, the commit pointed by the git bisect
was a fix of the first one.
I tried this little hack on Filter.php
:
namespace Sonata\DoctrineORMAdminBundle\Filter;
use Doctrine\ORM\Query\Expr\Orx;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface as BaseProxyQueryInterface;
use Sonata\AdminBundle\Filter\Filter as BaseFilter;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQueryInterface;
abstract class Filter extends BaseFilter
{
/**
* @var bool
*/
protected $active = false;
/**
* Holds an array of grouped `orX` filter expressions that must be used within
* the same query builder.
*
* @var array<string, Orx>
*/
private static $groupedOrExpressions = [];
public static function resetGroupedOrExpressions()
{
static::$groupedOrExpressions = [];
}
Then I call the reset function at the very beginning of my test:
public function testSearch(string $username, string $query, string $expectedLink): void
{
Filter::resetGroupedOrExpressions();
$client = $this->makeClient();
$this->loginClient($client, $this->getReference($username), 'main');
$crawler = $client->request('GET', $this->getUrl('sonata_admin_search', [
'q' => $query,
]));
$this->assertStatusCode(200, $client);
self::assertStringContainsString($expectedLink, $crawler->text());
}
I don't really now the need of a static property here, but it's the cause of the problem.
@franmomu You pointed a sonata test files. Why do you think it's related? 🤔
You're having an issue in your tests only. The tear down method could have some impacts
So I ended up with this workaround:
public function testSearch(string $username, string $query, string $expectedLink): void
{
$sonataFilterReflection = new \ReflectionClass(Filter::class);
$sonataFilterReflection->setStaticPropertyValue('groupedOrExpressions', []);
$client = $this->makeClient();
$this->loginClient($client, $this->getReference($username), 'main');
$crawler = $client->request('GET', $this->getUrl('sonata_admin_search', [
'q' => $query,
]));
$this->assertStatusCode(200, $client);
self::assertStringContainsString($expectedLink, $crawler->text());
}
Works great. However, I should not have to dirty modify the properties of a vendor file to make multiple test request working properly.
This array have to be correctly cleanup when necessary (request terminate? Kernel shutdown? Other?).
Do you have time to take a look @phansys ?
I'll try to find some time this weekend.
Environment
Sonata packages
show
``` $ composer show --latest 'sonata-project/*' sonata-project/admin-bundle 3.97.0 3.97.0 The missing Symfony Admin Generator sonata-project/block-bundle 3.23.0 4.5.3 Symfony SonataBlockBundle sonata-project/cache 2.1.1 2.1.1 Cache library sonata-project/core-bundle 3.20.0 3.20.0 Symfony SonataCoreBundle (abandoned) Package sonata-project/core-bundle is abandoned, you should avoid using it. No replacement was suggested. sonata-project/doctrine-extensions 1.12.0 1.12.0 Doctrine2 behavioral extensions sonata-project/doctrine-orm-admin-bundle 3.33.0 3.33.0 Integrate Doctrine ORM into the SonataAdminBundle sonata-project/exporter 1.11.1 2.6.2 Lightweight Exporter library sonata-project/form-extensions 0.1.2 1.9.0 Symfony form extensions sonata-project/intl-bundle 2.7.0 2.10.1 Symfony SonataIntlBundle sonata-project/twig-extensions 0.1.1 1.5.1 Sonata twig extensions ```
Symfony packages
show
``` $ composer show --latest 'symfony/*' symfony/asset v5.2.4 v5.2.4 Manages URL generation and versioning of web assets such as CSS ... symfony/browser-kit v5.2.0 v5.2.4 Symfony BrowserKit Component symfony/cache v5.2.6 v5.2.6 Provides an extended PSR-6, PSR-16 (and tags) implementation symfony/cache-contracts v2.4.0 v2.4.0 Generic abstractions related to caching symfony/config v4.4.20 v5.2.4 Helps you find, load, combine, autofill and validate configurati... symfony/console v4.4.21 v5.2.6 Eases the creation of beautiful and testable command line interf... symfony/contracts v1.1.0 v2.4.0 A set of abstractions extracted out of the Symfony components symfony/css-selector v5.0.8 v5.2.4 Symfony CssSelector Component symfony/debug v4.4.20 v4.4.20 Provides tools to ease debugging PHP code symfony/debug-bundle v4.4.8 v5.2.4 Symfony DebugBundle symfony/dependency-injection v4.4.21 v5.2.6 Allows you to standardize and centralize the way objects are con... symfony/deprecation-contracts v2.4.0 v2.4.0 A generic function and convention to trigger deprecation notices symfony/doctrine-bridge v4.4.21 v5.2.6 Provides integration for Doctrine with various Symfony components symfony/dom-crawler v5.2.0 v5.2.4 Symfony DomCrawler Component symfony/dotenv v4.4.8 v5.2.4 Registers environment variables from a .env file symfony/error-handler v4.4.21 v5.2.6 Provides tools to manage errors and ease debugging PHP code symfony/event-dispatcher v4.4.20 v5.2.4 Provides tools that allow your application components to communi... symfony/event-dispatcher-contracts v1.1.9 v2.4.0 Generic abstractions related to dispatching event symfony/expression-language v4.4.20 v5.2.4 Provides an engine that can compile and evaluate expressions symfony/filesystem v4.4.21 v5.2.6 Provides basic utilities for the filesystem symfony/finder v5.2.4 v5.2.4 Finds files and directories via an intuitive fluent interface symfony/flex v1.11.0 v1.12.2 Composer plugin for Symfony symfony/form v4.4.21 v5.2.6 Allows to easily create, process and reuse HTML forms symfony/framework-bundle v4.4.21 v5.2.6 Provides a tight integration between Symfony components and the ... symfony/http-client v5.0.11 v5.2.6 Symfony HttpClient component symfony/http-client-contracts v2.4.0 v2.4.0 Generic abstractions related to HTTP clients symfony/http-foundation v4.4.20 v5.2.4 Defines an object-oriented layer for the HTTP specification symfony/http-kernel v4.4.21 v5.2.6 Provides a structured process for converting a Request into a Re... symfony/inflector v5.2.6 v5.2.6 Converts words between their singular and plural forms (English ... symfony/intl v4.4.20 v5.2.4 Provides a PHP replacement layer for the C intl extension that i... symfony/lock v4.4.8 v5.2.6 Symfony Lock Component symfony/messenger v4.4.19 v5.2.5 Helps applications send and receive messages to/from other appli... symfony/mime v5.2.6 v5.2.6 Allows manipulating MIME messages symfony/monolog-bridge v5.0.8 v5.2.5 Symfony Monolog Bridge symfony/monolog-bundle v3.5.0 v3.7.0 Symfony MonologBundle symfony/options-resolver v4.4.20 v5.2.4 Provides an improved replacement for the array_replace PHP function symfony/orm-pack v2.1.0 v2.1.0 A pack for the Doctrine ORM symfony/phpunit-bridge v4.4.8 v5.2.6 Symfony PHPUnit Bridge symfony/polyfill-ctype v1.22.1 v1.22.1 Symfony polyfill for ctype functions symfony/polyfill-iconv v1.15.0 v1.22.1 Symfony polyfill for the Iconv extension symfony/polyfill-intl-grapheme v1.22.1 v1.22.1 Symfony polyfill for intl's grapheme_* functions symfony/polyfill-intl-icu v1.22.1 v1.22.1 Symfony polyfill for intl's ICU-related data and classes symfony/polyfill-intl-idn v1.22.1 v1.22.1 Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions symfony/polyfill-intl-normalizer v1.22.1 v1.22.1 Symfony polyfill for intl's Normalizer class and related functions symfony/polyfill-mbstring v1.22.1 v1.22.1 Symfony polyfill for the Mbstring extension symfony/polyfill-php72 v1.22.1 v1.22.1 Symfony polyfill backporting some PHP 7.2+ features to lower PHP... symfony/polyfill-php73 v1.22.1 v1.22.1 Symfony polyfill backporting some PHP 7.3+ features to lower PHP... symfony/polyfill-php80 v1.22.1 v1.22.1 Symfony polyfill backporting some PHP 8.0+ features to lower PHP... symfony/polyfill-uuid v1.18.1 v1.22.1 Symfony polyfill for uuid functions symfony/process v4.4.8 v5.2.4 Symfony Process Component symfony/property-access v4.4.20 v5.2.4 Provides functions to read and write from/to an object or array ... symfony/property-info v5.2.4 v5.2.4 Extracts information about PHP class' properties using metadata ... symfony/proxy-manager-bridge v4.4.20 v5.2.4 Provides integration for ProxyManager with various Symfony compo... symfony/psr-http-message-bridge v1.3.0 v2.1.0 PSR HTTP message bridge symfony/routing v4.4.20 v5.2.6 Maps an HTTP request to a set of configuration variables symfony/security v4.4.21 v4.4.21 Provides a complete security system for your web application symfony/security-acl v3.1.1 v3.1.1 Symfony Security Component - ACL (Access Control List) symfony/security-bundle v4.4.21 v5.2.6 Provides a tight integration of the Security component into the ... symfony/serializer v4.4.20 v5.2.4 Handles serializing and deserializing data structures, including... symfony/serializer-pack v1.0.4 v1.0.4 A pack for the Symfony serializer symfony/service-contracts v2.4.0 v2.4.0 Generic abstractions related to writing services symfony/stopwatch v5.2.4 v5.2.4 Provides a way to profile code symfony/string v5.2.6 v5.2.6 Provides an object-oriented API to strings and deals with bytes,... symfony/swiftmailer-bundle v3.4.0 v3.5.2 Symfony SwiftmailerBundle symfony/templating v4.4.20 v5.2.4 Provides all the tools needed to build any kind of template system symfony/translation v4.4.21 v5.2.6 Provides tools to internationalize your application symfony/translation-contracts v2.4.0 v2.4.0 Generic abstractions related to translation symfony/twig-bridge v4.4.21 v5.2.6 Provides integration for Twig with various Symfony components symfony/twig-bundle v4.4.20 v5.2.4 Provides a tight integration of Twig into the Symfony full-stack... symfony/validator v4.4.21 v5.2.6 Provides tools to validate values symfony/var-dumper v4.4.21 v5.2.6 Provides mechanisms for walking through any arbitrary PHP variable symfony/var-exporter v5.2.4 v5.2.4 Allows exporting any serializable PHP data structure to plain PH... symfony/web-link v4.4.21 v5.2.5 Manages links between resources symfony/web-profiler-bundle v4.4.8 v5.2.6 Symfony WebProfilerBundle symfony/webpack-encore-bundle v1.7.3 v1.11.1 Integration with your Symfony app & Webpack Encore! symfony/yaml v4.4.21 v5.2.5 Loads and dumps YAML files ```
PHP version
Subject
Since project update section including Sonata (see diff below), the following web test case if broken:
As you can see, it's a simple search request with result parsing. The facts are:
getSearchTestData
is working, not the others.$client->request(...
line, the first test is directly failing. So it looks like to be cache issue or something like that.The error talks about wrong parameters count matching:
After some dump digging, I detected that the queries between the first working request and the others are indeed different:
As you can see, the
WHERE
clause looks to be dropped, or not build.The question is: Why? And I didn't find the source of the issue for now.
As only the first request is working, I mainly suspect https://github.com/sonata-project/SonataAdminBundle/commit/5386609a0f65905231ac8549cd31689211d22cf6 where the datagrid is prevented to be built if already loaded.
However, I maybe wrong and I cannot prove it because removing this part caue infinite loops on my tests.
Update diff
Minimal repository with the bug
Steps to reproduce
N/A for now, some help would be welcomed.
Expected results
Working functionnal tests.
Actual results
Only the first test is working.