Skip to content

Commit f84309f

Browse files
authored
Don't mock what you don't own (#66)
* Do not rely on mock for Doctrine manager nor registry * Do not rely on mock for event dispatcher * Do not rely on mock for symfony normalizer nor denormalizer * Remove phpspec/prophecy-phpunit dev dependency from packages that are no longer using it
1 parent a79f448 commit f84309f

File tree

31 files changed

+633
-350
lines changed

31 files changed

+633
-350
lines changed

src/batch-doctrine-dbal/tests/DoctrineDBALTestCase.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Doctrine\DBAL\Schema\Table;
1111
use Doctrine\Persistence\ConnectionRegistry;
1212
use PHPUnit\Framework\TestCase;
13+
use Yokai\Batch\Tests\Bridge\Doctrine\DBAL\Dummy\SingleConnectionRegistry;
1314

1415
abstract class DoctrineDBALTestCase extends TestCase
1516
{
@@ -19,12 +20,7 @@ abstract class DoctrineDBALTestCase extends TestCase
1920
protected function setUp(): void
2021
{
2122
$this->connection = DriverManager::getConnection(['url' => \getenv('DATABASE_URL')]);
22-
$this->doctrine = $this->createMock(ConnectionRegistry::class);
23-
$this->doctrine->method('getDefaultConnectionName')
24-
->willReturn('default');
25-
$this->doctrine->method('getConnection')
26-
->with('default')
27-
->willReturn($this->connection);
23+
$this->doctrine = new SingleConnectionRegistry($this->connection);
2824
}
2925

3026
protected function createTable(string $table, array $columns): void
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Tests\Bridge\Doctrine\DBAL\Dummy;
6+
7+
use Doctrine\DBAL\Connection;
8+
use Doctrine\Persistence\ConnectionRegistry;
9+
use InvalidArgumentException;
10+
11+
final class SingleConnectionRegistry implements ConnectionRegistry
12+
{
13+
public function __construct(
14+
private Connection $connection,
15+
private string $name = 'default',
16+
) {
17+
}
18+
19+
public function getDefaultConnectionName()
20+
{
21+
return $this->name;
22+
}
23+
24+
public function getConnection($name = null)
25+
{
26+
if ($name === $this->name) {
27+
return $this->connection;
28+
}
29+
30+
throw new InvalidArgumentException(sprintf('Doctrine Connection named "%s" does not exist.', $name));
31+
}
32+
33+
public function getConnections()
34+
{
35+
return [$this->connection];
36+
}
37+
38+
public function getConnectionNames()
39+
{
40+
return [$this->name];
41+
}
42+
}

src/batch-doctrine-orm/composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
}
2222
},
2323
"require-dev": {
24-
"phpspec/prophecy-phpunit": "^2.0",
2524
"phpunit/phpunit": "^9.5"
2625
},
2726
"autoload-dev": {

src/batch-doctrine-orm/phpunit.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
colors="true"
88
bootstrap="vendor/autoload.php"
99
>
10+
<php>
11+
<env name="DATABASE_URL" value="sqlite:///:memory:"/>
12+
</php>
13+
1014
<testsuites>
1115
<testsuite name="Tests">
1216
<directory>./tests</directory>

src/batch-doctrine-orm/src/EntityReader.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@ public function read(): iterable
3434
);
3535
}
3636

37-
$query = $manager->createQueryBuilder()
37+
yield from $manager->createQueryBuilder()
3838
->select('e')
39-
->from($this->class, 'e');
40-
41-
foreach ($query->getQuery()->toIterable() as [$entity]) {
42-
yield $entity;
43-
}
39+
->from($this->class, 'e')
40+
->getQuery()
41+
->toIterable();
4442
}
4543
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Tests\Bridge\Doctrine\ORM\Dummy;
6+
7+
use Doctrine\ORM\Proxy\Proxy;
8+
use Doctrine\Persistence\AbstractManagerRegistry;
9+
use Doctrine\Persistence\ObjectManager;
10+
11+
final class SingleManagerRegistry extends AbstractManagerRegistry
12+
{
13+
public function __construct(
14+
private ObjectManager $manager,
15+
) {
16+
parent::__construct('ORM', ['default'], ['default'], 'default', 'default', Proxy::class);
17+
}
18+
19+
protected function getService($name)
20+
{
21+
if ($name !== 'default') {
22+
throw new \InvalidArgumentException('Unknown service "' . $name . '".');
23+
}
24+
25+
return $this->manager;
26+
}
27+
28+
protected function resetService($name)
29+
{
30+
}
31+
32+
public function getAliasNamespace($alias)
33+
{
34+
return $alias;
35+
}
36+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Tests\Bridge\Doctrine\ORM\Entity;
6+
7+
final class Unknown
8+
{
9+
public int $id;
10+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Tests\Bridge\Doctrine\ORM\Entity;
6+
7+
use Doctrine\ORM\Mapping as ORM;
8+
9+
#[ORM\Entity]
10+
#[ORM\Table(name: 'user')]
11+
class User
12+
{
13+
#[ORM\Column(type: 'integer')]
14+
#[ORM\Id]
15+
#[ORM\GeneratedValue]
16+
public int $id;
17+
18+
#[ORM\Column(type: 'string')]
19+
public string $name;
20+
21+
public function __construct(string $name)
22+
{
23+
$this->name = $name;
24+
}
25+
}

src/batch-doctrine-orm/tests/EntityReaderTest.php

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,77 +4,55 @@
44

55
namespace Yokai\Batch\Tests\Bridge\Doctrine\ORM;
66

7-
use Doctrine\ORM\AbstractQuery;
87
use Doctrine\ORM\EntityManager;
9-
use Doctrine\ORM\QueryBuilder;
8+
use Doctrine\ORM\ORMSetup;
9+
use Doctrine\ORM\Tools\SchemaTool;
1010
use Doctrine\Persistence\ManagerRegistry;
11+
use Generator;
1112
use PHPUnit\Framework\TestCase;
12-
use Prophecy\PhpUnit\ProphecyTrait;
13-
use Prophecy\Prophecy\ObjectProphecy;
1413
use Yokai\Batch\Bridge\Doctrine\ORM\EntityReader;
1514
use Yokai\Batch\Exception\UnexpectedValueException;
15+
use Yokai\Batch\Tests\Bridge\Doctrine\ORM\Dummy\SingleManagerRegistry;
16+
use Yokai\Batch\Tests\Bridge\Doctrine\ORM\Entity\Unknown;
17+
use Yokai\Batch\Tests\Bridge\Doctrine\ORM\Entity\User;
1618

1719
class EntityReaderTest extends TestCase
1820
{
19-
use ProphecyTrait;
21+
private EntityManager $manager;
22+
private ManagerRegistry $doctrine;
2023

21-
private const ENTITY = 'App\Entity\User';
22-
23-
public function testRead()
24+
protected function setUp(): void
2425
{
25-
/** @var ObjectProphecy|AbstractQuery $query */
26-
$query = $this->prophesize(AbstractQuery::class);
27-
$query->toIterable()
28-
->shouldBeCalledTimes(1)
29-
->willReturn(
30-
new \ArrayIterator([[$user1 = new User('1')], [$user2 = new User('2')], [$user3 = new User('3')]])
31-
);
32-
33-
$queryBuilder = $this->getMockBuilder(QueryBuilder::class)
34-
->disableOriginalConstructor()
35-
->getMock();
36-
$queryBuilder->expects($this->once())
37-
->method('select')
38-
->with('e')
39-
->will($this->returnSelf());
40-
$queryBuilder->expects($this->once())
41-
->method('from')
42-
->with(self::ENTITY)
43-
->will($this->returnSelf());
44-
$queryBuilder->expects($this->once())
45-
->method('getQuery')
46-
->will($this->returnValue($query->reveal()));
26+
$config = ORMSetup::createAttributeMetadataConfiguration([__DIR__ . '/Entity'], true);
27+
$this->manager = EntityManager::create(['url' => \getenv('DATABASE_URL')], $config);
28+
$this->doctrine = new SingleManagerRegistry($this->manager);
4729

48-
/** @var ObjectProphecy|EntityManager $manager */
49-
$manager = $this->prophesize(EntityManager::class);
50-
$manager->createQueryBuilder()
51-
->shouldBeCalledTimes(1)
52-
->willReturn($queryBuilder);
30+
(new SchemaTool($this->manager))
31+
->createSchema($this->manager->getMetadataFactory()->getAllMetadata());
32+
}
5333

54-
/** @var ObjectProphecy|ManagerRegistry $doctrine */
55-
$doctrine = $this->prophesize(ManagerRegistry::class);
56-
$doctrine->getManagerForClass(self::ENTITY)
57-
->shouldBeCalledTimes(1)
58-
->willReturn($manager->reveal());
34+
public function testRead(): void
35+
{
36+
$this->manager->persist($forest = new User('Forest'));
37+
$this->manager->persist($jenny = new User('Jenny'));
38+
$this->manager->persist($bubba = new User('Bubba'));
39+
$this->manager->flush();
5940

60-
$reader = new EntityReader($doctrine->reveal(), self::ENTITY);
41+
$reader = new EntityReader($this->doctrine, User::class);
6142
$entities = $reader->read();
6243

63-
self::assertInstanceOf(\Generator::class, $entities);
64-
self::assertSame([$user1, $user2, $user3], iterator_to_array($entities));
44+
self::assertInstanceOf(Generator::class, $entities);
45+
self::assertSame([$forest, $jenny, $bubba], \iterator_to_array($entities));
6546
}
6647

67-
public function testReadExceptionWithUnknownEntityClass()
48+
public function testReadExceptionWithUnknownEntityClass(): void
6849
{
6950
$this->expectException(UnexpectedValueException::class);
7051

71-
/** @var ObjectProphecy|ManagerRegistry $doctrine */
72-
$doctrine = $this->prophesize(ManagerRegistry::class);
73-
$doctrine->getManagerForClass(self::ENTITY)
74-
->shouldBeCalledTimes(1)
75-
->willReturn(null);
52+
$reader = new EntityReader($this->doctrine, Unknown::class);
53+
$entities = $reader->read();
7654

77-
$reader = new EntityReader($doctrine->reveal(), self::ENTITY);
78-
iterator_to_array($reader->read()); // the method is using a yield expression
55+
self::assertInstanceOf(Generator::class, $entities);
56+
\iterator_to_array($entities);
7957
}
8058
}

src/batch-doctrine-orm/tests/User.php

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)