8000 Merge branch '4.4' into 5.3 · symfony/symfony@8837a2f · GitHub
[go: up one dir, main page]

Skip to content

Commit 8837a2f

Browse files
committed
Merge branch '4.4' into 5.3
* 4.4: Fix tests failing with DBAL 3 Signed-off-by: Alexander M. Turek <me@derrabus.de>
2 parents 0a5ce3e + 1b496a0 commit 8837a2f

File tree

8 files changed

+97
-54
lines changed

8 files changed

+97
-54
lines changed

src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Doctrine\DBAL\Connection;
1515
use Doctrine\DBAL\Driver\Result as DriverResult;
16+
use Doctrine\DBAL\ParameterType;
1617
use Doctrine\DBAL\Result;
1718
use Doctrine\DBAL\Schema\Schema;
1819
use Doctrine\DBAL\Types\Types;
@@ -57,7 +58,7 @@ public function loadTokenBySeries(string $series)
5758
// the alias for lastUsed works around case insensitivity in PostgreSQL
5859
$sql = 'SELECT class, username, value, lastUsed AS last_used FROM rememberme_token WHERE series=:series';
5960
$paramValues = ['series' => $series];
60-
$paramTypes = ['series' => \PDO::PARAM_STR];
61+
$paramTypes = ['series' => ParameterType::STRING];
6162
$stmt = $this->conn->executeQuery($sql, $paramValues, $paramTypes);
6263
$row = $stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchAssociative() : $stmt->fetch(\PDO::FETCH_ASSOC);
6364

@@ -75,7 +76,7 @@ public function deleteTokenBySeries(string $series)
7576
{
7677
$sql = 'DELETE FROM rememberme_token WHERE series=:series';
7778
$paramValues = ['series' => $series];
78-
$paramTypes = ['series' => \PDO::PARAM_STR];
79+
$paramTypes = ['series' => ParameterType::STRING];
7980
if (method_exists($this->conn, 'executeStatement')) {
8081
$this->conn->executeStatement($sql, $paramValues, $paramTypes);
8182
} else {
@@ -95,9 +96,9 @@ public function updateToken(string $series, string $tokenValue, \DateTime $lastU
9596
'series' => $series,
9697
];
9798
$paramTypes = [
98-
'value' => \PDO::PARAM_STR,
99+
'value' => ParameterType::STRING,
99100
'lastUsed' => Types::DATETIME_MUTABLE,
100-
'series' => \PDO::PARAM_STR,
101+
'series' => ParameterType::STRING,
101102
];
102103
if (method_exists($this->conn, 'executeStatement')) {
103104
$updated = $this->conn->executeStatement($sql, $paramValues, $paramTypes);
@@ -124,10 +125,10 @@ public function createNewToken(PersistentTokenInterface $token)
124125
'lastUsed' => $token->getLastUsed(),
125126
];
126127
$paramTypes = [
127-
'class' => \PDO::PARAM_STR,
128-
'username' => \PDO::PARAM_STR,
129-
'series' => \PDO::PARAM_STR,
130-
'value' => \PDO::PARAM_STR,
128+
'class' => ParameterType::STRING,
129+
'username' => ParameterType::STRING,
130+
'series' => ParameterType::STRING,
131+
'value' => ParameterType::STRING,
131132
'lastUsed' => Types::DATETIME_MUTABLE,
132133
];
133134
if (method_exists($this->conn, 'executeStatement')) {

src/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
namespace Symfony\Bridge\Doctrine\Tests\DataCollector;
1313

14+
use Doctrine\DBAL\Connection;
1415
use Doctrine\DBAL\Logging\DebugStack;
15-
use Doctrine\DBAL\Platforms\MySqlPlatform;
16-
use Doctrine\DBAL\Version;
16+
use Doctrine\DBAL\Platforms\MySQLPlatform;
1717
use Doctrine\Persistence\ManagerRegistry;
1818
use PHPUnit\Framework\TestCase;
1919
use Symfony\Bridge\Doctrine\DataCollector\DoctrineDataCollector;
@@ -22,6 +22,9 @@
2222
use Symfony\Component\VarDumper\Cloner\Data;
2323
use Symfony\Component\VarDumper\Dumper\CliDumper;
2424

25+
// Doctrine DBAL 2 compatibility
26+
class_exists(\Doctrine\DBAL\Platforms\MySqlPlatform::class);
27+
2528
class DoctrineDataCollectorTest extends TestCase
2629
{
2730
public function testCollectConnections()
@@ -93,6 +96,8 @@ public function testCollectQueries($param, $types, $expected, $explainable, bool
9396
$dumper->setColors(false);
9497
$collectedParam->dump($dumper);
9598
$this->assertStringMatchesFormat($expected, print_r(stream_get_contents($out, -1, 0), true));
99+
} elseif (\is_string($expected)) {
100+
$this->assertStringMatchesFormat($expected, $collectedParam);
96101
} else {
97102
$this->assertEquals($expected, $collectedParam);
98103
}
@@ -150,7 +155,7 @@ public function testReset()
150155
/**
151156
* @dataProvider paramProvider
152157
*/
153-
public function testSerialization($param, $types, $expected, $explainable, bool $runnable = true)
158+
public function testSerialization($param, array $types, $expected, $explainable, bool $runnable = true)
154159
{
155160
$queries = [
156161
['sql' => 'SELECT * FROM table1 WHERE field1 = ?1', 'params' => [$param], 'types' => $types, 'executionMS' => 1],
@@ -167,6 +172,8 @@ public function testSerialization($param, $types, $expected, $explainable, bool
167172
$dumper->setColors(false);
168173
$collectedParam->dump($dumper);
169174
$this->assertStringMatchesFormat($expected, print_r(stream_get_contents($out, -1, 0), true));
175+
} elseif (\is_string($expected)) {
176+
$this->assertStringMatchesFormat($expected, $collectedParam);
170177
} else {
171178
$this->assertEquals($expected, $collectedParam);
172179
}
@@ -175,9 +182,9 @@ public function testSerialization($param, $types, $expected, $explainable, bool
175182
$this->assertSame($runnable, $collectedQueries['default'][0]['runnable']);
176183
}
177184

178-
public function paramProvider()
185+
public function paramProvider(): array
179186
{
180-
$tests = [
187+
return [
181188
['some value', [], 'some value', true],
182189
[1, [], 1, true],
183190
[true, [], true, true],
@@ -207,30 +214,25 @@ public function paramProvider()
207214
,
208215
false,
209216
],
210-
];
211-
212-
if (version_compare(Version::VERSION, '2.6', '>=')) {
213-
$tests[] = ['this is not a date', ['date'], "⚠ Could not convert PHP value 'this is not a date' of type 'string' to type 'date'. Expected one of the following types: null, DateTime", false, false];
214-
$tests[] = [
217+
['this is not a date', ['date'], "⚠ Could not convert PHP value 'this is not a date'%S to type %Sdate%S. Expected one of the following types: null, DateTime", false, false],
218+
[
215219
new \stdClass(),
216220
['date'],
217221
<<<EOTXT
218222
{#%d
219-
⚠: "Could not convert PHP value of type 'stdClass' to type 'date'. Expected one of the following types: null, DateTime"
223+
⚠: "Could not convert PHP value of type %SstdClass%S to type %Sdate%S. Expected one of the following types: null, DateTime"
220224
}
221225
EOTXT
222226
,
223227
false,
224228
false,
225-
];
226-
}
227-
228-
return $tests;
229+
],
230+
];
229231
}
230232

231-
private function createCollector($queries)
233+
private function createCollector(array $queries): DoctrineDataCollector
232234
{
233-
$connection = $this->getMockBuilder(\Doctrine\DBAL\Connection::class)
235+
$connection = $this->getMockBuilder(Connection::class)
234236
->disableOriginalConstructor()
235237
->getMock();
236238
$connection->expects($this->any())

src/Symfony/Bridge/Doctrine/Tests/Messenger/DoctrinePingConnectionMiddlewareTest.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,12 @@ public function testInvalidEntityManagerThrowsException()
103103

104104
public function testMiddlewareNoPingInNonWorkerContext()
105105
{
106-
$this->connection->expects($this->never())
107-
->method('ping')
108-
->willReturn(false);
106+
// This method has been removed in DBAL 3.0
107+
if (method_exists(Connection::class, 'ping')) {
108+
$this->connection->expects($this->never())
109+
->method('ping')
110+
->willReturn(false);
111+
}
109112

110113
$this->connection->expects($this->never())
111114
->method('close')

src/Symfony/Bridge/Doctrine/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
},
5353
"conflict": {
5454
"doctrine/dbal": "<2.10",
55+
"doctrine/orm": "<2.7.3",
5556
"phpunit/phpunit": "<5.4.3",
5657
"symfony/dependency-injection": "<4.4",
5758
"symfony/form": "<5.1",

src/Symfony/Component/Cache/Adapter/PdoAdapter.php

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Doctrine\DBAL\DriverManager;
1818
use Doctrine\DBAL\Exception;
1919
use Doctrine\DBAL\Exception\TableNotFoundException;
20+
use Doctrine\DBAL\ParameterType;
2021
use Doctrine\DBAL\Schema\Schema;
2122
use Symfony\Component\Cache\Exception\InvalidArgumentException;
2223
use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
@@ -191,17 +192,20 @@ public function prune()
191192
$deleteSql .= " AND $this->idCol LIKE :namespace";
192193
}
193194

195+
$connection = $this->getConnection();
196+
$useDbalConstants = $connection instanceof Connection;
197+
194198
try {
195-
$delete = $this->getConnection()->prepare($deleteSql);
199+
$delete = $connection->prepare($deleteSql);
196200
} catch (TableNotFoundException $e) {
197201
return true;
198202
} catch (\PDOException $e) {
199203
return true;
200204
}
201-
$delete->bindValue(':time', time(), \PDO::PARAM_INT);
205+
$delete->bindValue(':time', time(), $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
202206

203207
if ('' !== $this->namespace) {
204-
$delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \PDO::PARAM_STR);
208+
$delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), $useDbalConstants ? ParameterType::STRING : \PDO::PARAM_STR);
205209
}
206210
try {
207211
return $delete->execute();
@@ -217,13 +221,16 @@ public function prune()
217221
*/
218222
protected function doFetch(array $ids)
219223
{
224+
$connection = $this->getConnection();
225+
$useDbalConstants = $connection instanceof Connection;
226+
220227
$now = time();
221228
$expired = [];
222229

223230
$sql = str_pad('', (\count($ids) << 1) - 1, '?,');
224231
$sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)";
225-
$stmt = $this->getConnection()->prepare($sql);
226-
$stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
232+
$stmt = $connection->prepare($sql);
233+
$stmt->bindValue($i = 1, $now, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
227234
foreach ($ids as $id) {
228235
$stmt->bindValue(++$i, $id);
229236
}
@@ -247,8 +254,8 @@ protected function doFetch(array $ids)
247254
if ($expired) {
248255
$sql = str_pad('', (\count($expired) << 1) - 1, '?,');
249256
$sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)";
250-
$stmt = $this->getConnection()->prepare($sql);
251-
$stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
257+
$stmt = $connection->prepare($sql);
258+
$stmt->bindValue($i = 1, $now, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
252259
foreach ($expired as $id) {
253260
$stmt->bindValue(++$i, $id);
254261
}
@@ -261,11 +268,14 @@ protected function doFetch(array $ids)
261268
*/
262269
protected function doHave(string $id)
263270
{
271+
$connection = $this->getConnection();
272+
$useDbalConstants = $connection instanceof Connection;
273+
264274
$sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)";
265-
$stmt = $this->getConnection()->prepare($sql);
275+
$stmt = $connection->prepare($sql);
266276

267277
$stmt->bindValue(':id', $id);
268-
$stmt->bindValue(':time', time(), \PDO::PARAM_INT);
278+
$stmt->bindValue(':time', time(), $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
269279
$result = $stmt->execute();
270280

271281
return (bool) (\is_object($result) ? $result->fetchOne() : $stmt->fetchColumn());
@@ -328,6 +338,8 @@ protected function doSave(array $values, int $lifetime)
328338
}
329339

330340
$conn = $this->getConnection();
341+
$useDbalConstants = $conn instanceof Connection;
342+
331343
$driver = $this->driver;
332344
$insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";
333345

@@ -379,25 +391,25 @@ protected function doSave(array $values, int $lifetime)
379391
if ('sqlsrv' === $driver || 'oci' === $driver) {
380392
$stmt->bindParam(1, $id);
381393
$stmt->bindParam(2, $id);
382-
$stmt->bindParam(3, $data, \PDO::PARAM_LOB);
383-
$stmt->bindValue(4, $lifetime, \PDO::PARAM_INT);
384-
$stmt->bindValue(5, $now, \PDO::PARAM_INT);
385-
$stmt->bindParam(6, $data, \PDO::PARAM_LOB);
386-
$stmt->bindValue(7, $lifetime, \PDO::PARAM_INT);
387-
$stmt->bindValue(8, $now, \PDO::PARAM_INT);
394+
$stmt->bindParam(3, $data, $useDbalConstants ? ParameterType::LARGE_OBJECT : \PDO::PARAM_LOB);
395+
$stmt->bindValue(4, $lifetime, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
396+
$stmt->bindValue(5, $now, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
397+
$stmt->bindParam(6, $data, $useDbalConstants ? ParameterType::LARGE_OBJECT : \PDO::PARAM_LOB);
398+
$stmt->bindValue(7, $lifetime, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
399+
$stmt->bindValue(8, $now, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
388400
} else {
389401
$stmt->bindParam(':id', $id);
390-
$stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
391-
$stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
392-
$stmt->bindValue(':time', $now, \PDO::PARAM_INT);
402+
$stmt->bindParam(':data', $data, $useDbalConstants ? ParameterType::LARGE_OBJECT : \PDO::PARAM_LOB);
403+
$stmt->bindValue(':lifetime', $lifetime, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
404+
$stmt->bindValue(':time', $now, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
393405
}
394406
if (null === $driver) {
395407
$insertStmt = $conn->prepare($insertSql);
396408

397409
$insertStmt->bindParam(':id', $id);
398-
$insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
399-
$insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
400-
$insertStmt->bindValue(':time', $now, \PDO::PARAM_INT);
410+
$insertStmt->bindParam(':data', $data, $useDbalConstants ? ParameterType::LARGE_OBJECT : \PDO::PARAM_LOB);
411+
$insertStmt->bindValue(':lifetime', $lifetime, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
412+
$insertStmt->bindValue(':time', $now, $useDbalConstants ? ParameterType::INTEGER : \PDO::PARAM_INT);
401413
}
402414

403415
foreach ($values as $id => $data) {

src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,11 @@ private function getDBALConnectionMock()
140140
$schemaConfig->method('getMaxIdentifierLength')->willReturn(63);
141141
$schemaConfig->method('getDefaultTableOptions')->willReturn([]);
142142
$schemaManager->method('createSchemaConfig')->willReturn($schemaConfig);
143-
$driverConnection->method('getSchemaManager')->willReturn($schemaManager);
143+
if (method_exists(DBALConnection::class, 'createSchemaManager')) {
144+
$driverConnection->method('createSchemaManager')->willReturn($schemaManager);
145+
} else {
146+
$driverConnection->method('getSchemaManager')->willReturn($schemaManager);
147+
}
144148

145149
return $driverConnection;
146150
}
@@ -430,7 +434,11 @@ public function testSetupIndices(string $platformClass, array $expectedIndices)
430434
$expectedTable->addIndex($indexColumns);
431435
}
432436
$schemaManager->method('createSchema')->willReturn($schema);
433-
$driverConnection->method('getSchemaManager')->willReturn($schemaManager);
437+
if (method_exists(DBALConnection::class, 'createSchemaManager')) {
438+
$driverConnection->method('createSchemaManager')->willReturn($schemaManager);
439+
} else {
440+
$driverConnection->method('getSchemaManager')->willReturn($schemaManager);
441+
}
434442

435443
$platformMock = $this->createMock($platformClass);
436444
$platformMock

src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineIntegrationTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Doctrine\DBAL\Driver\Result as DriverResult;
1515
use Doctrine\DBAL\DriverManager;
1616
use Doctrine\DBAL\Result;
17+
use Doctrine\DBAL\Schema\AbstractSchemaManager;
1718
use PHPUnit\Framework\TestCase;
1819
use Symfony\Component\Messenger\Bridge\Doctrine\Tests\Fixtures\DummyMessage;
1920
use Symfony\Component\Messenger\Bridge\Doctrine\Transport\Connection;
@@ -175,7 +176,7 @@ public function testItRetrieveTheMessageThatIsOlderThanRedeliverTimeout()
175176

176177
public function testTheTransportIsSetupOnGet()
177178
{
178-
$this->assertFalse($this->driverConnection->getSchemaManager()->tablesExist('messenger_messages'));
179+
$this->assertFalse($this->createSchemaManager()->tablesExist('messenger_messages'));
179180
$this->assertNull($this->connection->get());
180181

181182
$this->connection->send('the body', ['my' => 'header']);
@@ -187,4 +188,11 @@ private function formatDateTime(\DateTime $dateTime)
187188
{
188189
return $dateTime->format($this->driverConnection->getDatabasePlatform()->getDateTimeFormatString());
189190
}
191+
192+
private function createSchemaManager(): AbstractSchemaManager
193+
{
194+
return method_exists($this->driverConnection, 'createSchemaManager')
195+
? $this->driverConnection->createSchemaManager()
196+
: $this->driverConnection->getSchemaManager();
197+
}
190198
}

src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Doctrine\DBAL\Platforms\MySqlPlatform;
2121
use Doctrine\DBAL\Query\QueryBuilder;
2222
use Doctrine\DBAL\Result;
23+
use Doctrine\DBAL\Schema\AbstractSchemaManager;
2324
use Doctrine\DBAL\Schema\Comparator;
2425
use Doctrine\DBAL\Schema\Schema;
2526
use Doctrine\DBAL\Schema\Synchronizer\SchemaSynchronizer;
@@ -386,7 +387,7 @@ protected function executeStatement(string $sql, array $parameters = [], array $
386387

387388
private function getSchema(): Schema
388389
{
389-
$schema = new Schema([], [], $this->driverConnection->getSchemaManager()->createSchemaConfig());
390+
$schema = new Schema([], [], $this->createSchemaManager()->createSchemaConfig());
390391
$this->addTableToSchema($schema);
391392

392393
return $schema;
@@ -437,7 +438,7 @@ private function updateSchema(): void
437438
}
438439

439440
$comparator = new Comparator();
440-
$schemaDiff = $comparator->compare($this->driverConnection->getSchemaManager()->createSchema(), $this->getSchema());
441+
$schemaDiff = $comparator->compare($this->createSchemaManager()->createSchema(), $this->getSchema());
441442

442443
foreach ($schemaDiff->toSaveSql($this->driverConnection->getDatabasePlatform()) as $sql) {
443444
if (method_exists($this->driverConnection, 'executeStatement')) {
@@ -447,6 +448,13 @@ private function updateSchema(): void
447448
}
448449
}
449450
}
451+
452+
private function createSchemaManager(): AbstractSchemaManager
453+
{
454+
return method_exists($this->driverConnection, 'createSchemaManager')
455+
? $this->driverConnection->createSchemaManager()
456+
: $this->driverConnection->getSchemaManager();
457+
}
450458
}
451459

452460
if (!class_exists(\Symfony\Component\Messenger\Transport\Doctrine\Connection::class, false)) {

0 commit comments

Comments
 (0)
0