Skip to content

Commit aa75652

Browse files
authored
Merge pull request absolute-quantum#48 from phansys/sca
Fix compatibility with "doctrine/orm" 3.x
2 parents a0d32a2 + bab65a6 commit aa75652

15 files changed

+116
-76
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
uses: "shivammathur/setup-php@v2"
2323
with:
2424
coverage: "none"
25-
php-version: "8.0"
25+
php-version: "8.4"
2626
extensions: pdo, pdo_sqlite
2727

2828
- name: "Validate composer.json"
@@ -37,6 +37,9 @@ jobs:
3737
composer-options: "--prefer-stable"
3838
dependency-versions: 'highest'
3939

40+
- name: "Trigger install for PHPUnit dependencies"
41+
run: "vendor/bin/simple-phpunit --version"
42+
4043
- name: "PHPStan"
4144
run: "vendor/bin/phpstan analyze"
4245

phpstan-baseline.neon

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
parameters:
2+
ignoreErrors:
3+
-
4+
message: "#^Class Doctrine\\\\ORM\\\\Mapping\\\\ClassMetadataInfo not found\\.$#"
5+
count: 1
6+
path: src/Command/AbstractCommand.php
7+
8+
-
9+
message: "#^Class Doctrine\\\\ORM\\\\Mapping\\\\ClassMetadataInfo not found\\.$#"
10+
count: 1
11+
path: src/Command/DoctrineDecryptDatabaseCommand.php
12+
13+
-
14+
message: "#^Class Doctrine\\\\ORM\\\\Mapping\\\\ClassMetadataInfo not found\\.$#"
15+
count: 1
16+
path: src/Command/DoctrineEncryptStatusCommand.php
17+
18+
-
19+
message: "#^Call to an undefined static method Doctrine\\\\ORM\\\\EntityManager\\:\\:create\\(\\)\\.$#"
20+
count: 1
21+
path: tests/Functional/AbstractFunctionalTestCase.php
22+
23+
-
24+
message: "#^Call to static method createAnnotationMetadataConfiguration\\(\\) on an unknown class Doctrine\\\\ORM\\\\Tools\\\\Setup\\.$#"
25+
count: 1
26+
path: tests/Functional/AbstractFunctionalTestCase.php
27+
28+
-
29+
message: "#^Instantiated class Doctrine\\\\DBAL\\\\Logging\\\\DebugStack not found\\.$#"
30+
count: 1
31+
path: tests/Functional/AbstractFunctionalTestCase.php

phpstan.neon.dist

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
includes:
2+
- phpstan-baseline.neon
3+
14
parameters:
25
level: 0
36
paths:
47
- src
5-
#- tests
8+
- tests
69
tmpDir: .phpstan-cache

src/Command/AbstractCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Doctrine\Common\Annotations\Reader;
88
use Doctrine\ORM\EntityManager;
99
use Doctrine\ORM\EntityManagerInterface;
10+
use Doctrine\ORM\Mapping\ClassMetadata;
1011
use Doctrine\ORM\Mapping\ClassMetadataInfo;
1112
use Symfony\Component\Console\Command\Command;
1213

@@ -81,7 +82,7 @@ protected function getEncryptionableEntityMetaData(): array
8182
$metaDataArray = $this->entityManager->getMetadataFactory()->getAllMetadata();
8283

8384
foreach ($metaDataArray as $entityMetaData) {
84-
if ($entityMetaData instanceof ClassMetadataInfo and $entityMetaData->isMappedSuperclass) {
85+
if (($entityMetaData instanceof ClassMetadataInfo || $entityMetaData instanceof ClassMetadata) && $entityMetaData->isMappedSuperclass) {
8586
continue;
8687
}
8788

src/Command/DoctrineDecryptDatabaseCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Ambta\DoctrineEncryptBundle\Command;
44

55
use Ambta\DoctrineEncryptBundle\DependencyInjection\DoctrineEncryptExtension;
6+
use Doctrine\ORM\Mapping\ClassMetadata;
67
use Doctrine\ORM\Mapping\ClassMetadataInfo;
78
use Symfony\Component\Console\Helper\ProgressBar;
89
use Symfony\Component\Console\Input\InputArgument;
@@ -63,7 +64,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
6364
// Set counter and loop through entity manager meta data
6465
$propertyCount = 0;
6566
foreach ($metaDataArray as $metaData) {
66-
if ($metaData instanceof ClassMetadataInfo and $metaData->isMappedSuperclass) {
67+
if (($metaData instanceof ClassMetadataInfo || $metaData instanceof ClassMetadata) && $metaData->isMappedSuperclass) {
6768
continue;
6869
}
6970

src/Command/DoctrineEncryptStatusCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Ambta\DoctrineEncryptBundle\Command;
44

5+
use Doctrine\ORM\Mapping\ClassMetadata;
56
use Doctrine\ORM\Mapping\ClassMetadataInfo;
67
use Symfony\Component\Console\Input\InputInterface;
78
use Symfony\Component\Console\Output\OutputInterface;
@@ -27,7 +28,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
2728

2829
$totalCount = 0;
2930
foreach ($metaDataArray as $metaData) {
30-
if ($metaData instanceof ClassMetadataInfo && $metaData->isMappedSuperclass) {
31+
if (($metaData instanceof ClassMetadataInfo || $metaData instanceof ClassMetadata) && $metaData->isMappedSuperclass) {
3132
continue;
3233
}
3334

tests/Functional/AbstractFunctionalTestCase.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ protected function resetQueryStack(): void
237237
*/
238238
public function assertStringDoesNotContain($needle, $string, $ignoreCase = false, $message = ''): void
239239
{
240-
$this->assertIsString($needle, $message);
241-
$this->assertIsString($string, $message);
242-
$this->assertIsBool($ignoreCase, $message);
240+
static::assertIsString($needle, $message);
241+
static::assertIsString($string, $message);
242+
static::assertIsBool($ignoreCase, $message);
243243

244244
$constraint = new LogicalNot(new StringContains(
245245
$needle,

tests/Functional/BasicQueryTest/AbstractBasicQueryTestCase.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,44 +18,44 @@ public function testPersistEntity(): void
1818
$this->entityManager->flush();
1919

2020
// Start transaction; insert; commit
21-
$this->assertEquals('top secret information', $user->getSecret());
22-
$this->assertEquals(3, $this->getCurrentQueryCount());
21+
static::assertEquals('top secret information', $user->getSecret());
22+
static::assertEquals(3, $this->getCurrentQueryCount());
2323
}
2424

2525
public function testNoUpdateOnReadEncrypted(): void
2626
{
2727
$this->entityManager->beginTransaction();
28-
$this->assertEquals(1, $this->getCurrentQueryCount());
28+
static::assertEquals(1, $this->getCurrentQueryCount());
2929

3030
$user = new CascadeTarget();
3131
$user->setNotSecret('My public information');
3232
$user->setSecret('top secret information');
3333
$this->entityManager->persist($user);
3434
$this->entityManager->flush();
35-
$this->assertEquals(2, $this->getCurrentQueryCount());
35+
static::assertEquals(2, $this->getCurrentQueryCount());
3636

3737
// Test if no query is executed when doing nothing
3838
$this->entityManager->flush();
39-
$this->assertEquals(2, $this->getCurrentQueryCount());
39+
static::assertEquals(2, $this->getCurrentQueryCount());
4040

4141
// Test if no query is executed when reading unrelated field
4242
$user->getNotSecret();
4343
$this->entityManager->flush();
44-
$this->assertEquals(2, $this->getCurrentQueryCount());
44+
static::assertEquals(2, $this->getCurrentQueryCount());
4545

4646
// Test if no query is executed when reading related field and if field is valid
47-
$this->assertEquals('top secret information', $user->getSecret());
47+
static::assertEquals('top secret information', $user->getSecret());
4848
$this->entityManager->flush();
49-
$this->assertEquals(2, $this->getCurrentQueryCount());
49+
static::assertEquals(2, $this->getCurrentQueryCount());
5050

5151
// Test if 1 query is executed when updating entity
5252
$user->setSecret('top secret information change');
5353
$this->entityManager->flush();
54-
$this->assertEquals(3, $this->getCurrentQueryCount());
55-
$this->assertEquals('top secret information change', $user->getSecret());
54+
static::assertEquals(3, $this->getCurrentQueryCount());
55+
static::assertEquals('top secret information change', $user->getSecret());
5656

5757
$this->entityManager->rollback();
58-
$this->assertEquals(4, $this->getCurrentQueryCount());
58+
static::assertEquals(4, $this->getCurrentQueryCount());
5959
}
6060

6161
public function testStoredDataIsEncrypted(): void
@@ -92,7 +92,7 @@ public function testNoUpdateForUnalteredChildrenOfAbstractEntities()
9292
$this->entityManager->flush();
9393

9494
// start transaction, insert, commit
95-
$this->assertEquals(3, $this->getCurrentQueryCount());
95+
static::assertEquals(3, $this->getCurrentQueryCount());
9696

9797
// Remove all logged queries
9898
$this->resetQueryStack();
@@ -103,6 +103,6 @@ public function testNoUpdateForUnalteredChildrenOfAbstractEntities()
103103

104104
// Verify there are no queries executed
105105
$this->assertNull($this->getLatestUpdateQuery());
106-
$this->assertEquals(0, $this->getCurrentQueryCount());
106+
static::assertEquals(0, $this->getCurrentQueryCount());
107107
}
108108
}

tests/Functional/BasicQueryTest/BasicQueryHaliteTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ protected function getEncryptor(): EncryptorInterface
1515
public function setUp(): void
1616
{
1717
if (!extension_loaded('sodium') && !class_exists('ParagonIE_Sodium_Compat')) {
18-
$this->markTestSkipped('This test only runs when the sodium extension is enabled.');
18+
static::markTestSkipped('This test only runs when the sodium extension is enabled.');
1919

2020
return;
2121
}

tests/Functional/DoctrineEncryptSubscriber/AbstractDoctrineEncryptSubscriberTestCase.php

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,20 @@ public function testEncryptionHappensOnOnlyAnnotatedFields(): void
3333
$connection = $em->getConnection();
3434
$stmt = $connection->prepare('SELECT * from owner WHERE id = ?');
3535
$owners = $em->getRepository(Owner::class)->findAll();
36-
$this->assertCount(1, $owners);
36+
static::assertCount(1, $owners);
3737
/** @var Owner $owner */
3838
$owner = $owners[0];
39-
$this->assertEquals($secret, $owner->getSecret());
40-
$this->assertEquals($notSecret, $owner->getNotSecret());
39+
static::assertEquals($secret, $owner->getSecret());
40+
static::assertEquals($notSecret, $owner->getNotSecret());
4141
$stmt->bindValue(1, $owner->getId());
4242
$results = $this->executeStatementFetchAll($stmt);
4343
$this->assertCount(1, $results);
4444
$result = $results[0];
45-
$this->assertEquals($notSecret, $result['notSecret']);
45+
static::assertEquals($notSecret, $result['notSecret']);
4646
$this->assertNotEquals($secret, $result['secret']);
4747
$this->assertStringEndsWith('<ENC>', $result['secret']);
4848
$decrypted = $this->encryptor->decrypt(str_replace('<ENC>', '', $result['secret']));
49-
$this->assertEquals($secret, $decrypted);
49+
static::assertEquals($secret, $decrypted);
5050
}
5151

5252
public function testEncryptionCascades(): void
@@ -73,17 +73,17 @@ public function testEncryptionCascades(): void
7373
$this->assertCount(1, $cascadeTargets);
7474
/** @var CascadeTarget $cascadeTarget */
7575
$cascadeTarget = $cascadeTargets[0];
76-
$this->assertEquals($secret, $cascadeTarget->getSecret());
77-
$this->assertEquals($notSecret, $cascadeTarget->getNotSecret());
76+
static::assertEquals($secret, $cascadeTarget->getSecret());
77+
static::assertEquals($notSecret, $cascadeTarget->getNotSecret());
7878
$stmt->bindValue(1, $cascadeTarget->getId());
7979
$results = $this->executeStatementFetchAll($stmt);
8080
$this->assertCount(1, $results);
8181
$result = $results[0];
82-
$this->assertEquals($notSecret, $result['notSecret']);
82+
static::assertEquals($notSecret, $result['notSecret']);
8383
$this->assertNotEquals($secret, $result['secret']);
8484
$this->assertStringEndsWith('<ENC>', $result['secret']);
8585
$decrypted = $this->encryptor->decrypt(str_replace('<ENC>', '', $result['secret']));
86-
$this->assertEquals($secret, $decrypted);
86+
static::assertEquals($secret, $decrypted);
8787
}
8888

8989
public function testEncryptionClassTableInheritance(): void
@@ -171,16 +171,16 @@ public function testEncryptionDoesNotHappenWhenThereIsNoChange(): void
171171
$owners = $em->getRepository(Owner::class)->findAll();
172172
/** @var Owner $owner */
173173
foreach ($owners as $owner) {
174-
$this->assertEquals($secret, $owner->getSecret());
175-
$this->assertEquals($notSecret, $owner->getNotSecret());
174+
static::assertEquals($secret, $owner->getSecret());
175+
static::assertEquals($notSecret, $owner->getNotSecret());
176176
}
177177
$this->resetQueryStack();
178178
$this->assertCount(0, $this->getDebugQueries());
179179
$beforeFlush = $this->subscriber->encryptCounter;
180180
$em->flush();
181181
$afterFlush = $this->subscriber->encryptCounter;
182182
// No encryption should have happened because we didn't change anything.
183-
$this->assertEquals($beforeFlush, $afterFlush);
183+
static::assertEquals($beforeFlush, $afterFlush);
184184
// No queries happened because we didn't change anything.
185185
$this->assertCount(0, $this->getDebugQueries(), "Unexpected queries:\n".var_export($this->getDebugQueries(), true));
186186

@@ -189,7 +189,7 @@ public function testEncryptionDoesNotHappenWhenThereIsNoChange(): void
189189
$em->flush();
190190
$afterFlush = $this->subscriber->encryptCounter;
191191
// No encryption should have happened because we didn't change anything.
192-
$this->assertEquals($beforeFlush, $afterFlush);
192+
static::assertEquals($beforeFlush, $afterFlush);
193193
// No queries happened because we didn't change anything.
194194
$this->assertCount(0, $this->getDebugQueries(), "Unexpected queries:\n".var_export($this->getDebugQueries(), true));
195195

@@ -199,7 +199,7 @@ public function testEncryptionDoesNotHappenWhenThereIsNoChange(): void
199199
$result = $results[0];
200200
$shouldBeTheSameAsBefore = $result['secret'];
201201
$this->assertStringEndsWith('<ENC>', $shouldBeTheSameAsBefore); // is encrypted
202-
$this->assertEquals($originalEncryption, $shouldBeTheSameAsBefore);
202+
static::assertEquals($originalEncryption, $shouldBeTheSameAsBefore);
203203
}
204204

205205
public function testEncryptionDoesNotHappenWhenThereIsNoChangeClassInheritance(): void
@@ -332,7 +332,7 @@ public function testEntitySetterUseStrtoupper()
332332

333333
$this->assertStringEndsWith(DoctrineEncryptSubscriber::ENCRYPTION_MARKER, $passwordData);
334334
$this->assertStringDoesNotContain('my secret', $passwordData);
335-
$this->assertEquals('MY SECRET', $secret);
335+
static::assertEquals('MY SECRET', $secret);
336336
}
337337

338338
public function testEntityWithDateTimeJsonAndArrayProperties()
@@ -361,7 +361,7 @@ public function testEntityWithDateTimeJsonAndArrayProperties()
361361
// Doctrine datetime type is only for date and time. milliseconds and timezone is not stored.
362362
// We only test the date and time accordingly
363363
// https://www.doctrine-project.org/projects/doctrine-dbal/en/3.7/reference/types.html#datetime
364-
$this->assertEquals($datetime->format('Y-m-d\\TH:i:s'), $entityDate->format('Y-m-d\\TH:i:s'));
365-
$this->assertEquals($jsonArray, $entityJson);
364+
static::assertEquals($datetime->format('Y-m-d\\TH:i:s'), $entityDate->format('Y-m-d\\TH:i:s'));
365+
static::assertEquals($jsonArray, $entityJson);
366366
}
367367
}

0 commit comments

Comments
 (0)