1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
<?php
declare(strict_types=1);
namespace Doctrine\DBAL\Tests\Connection;
use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\Cache\Cache;
use Doctrine\Common\Cache\Psr6\DoctrineProvider;
use Doctrine\DBAL\Cache\ArrayResult;
use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver;
use PHPUnit\Framework\TestCase;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use function class_exists;
class CachedQueryTest extends TestCase
{
public function testCachedQuery(): void
{
$cache = new ArrayAdapter();
$this->assertCachedQueryIsExecutedOnceAndYieldsTheSameResult($cache, __FUNCTION__);
self::assertCount(1, $cache->getItem(__FUNCTION__)->get());
}
public function testCachedQueryLegacy(): void
{
if (! class_exists(ArrayCache::class)) {
self::markTestSkipped('This test requires the legacy ArrayCache class.');
}
$cache = new ArrayCache();
$this->assertCachedQueryIsExecutedOnceAndYieldsTheSameResult($cache, __FUNCTION__);
self::assertCount(1, $cache->fetch(__FUNCTION__));
}
public function testCachedQueryLegacyWrapped(): void
{
$cache = new ArrayAdapter();
$legacy = DoctrineProvider::wrap($cache);
$this->assertCachedQueryIsExecutedOnceAndYieldsTheSameResult($legacy, __FUNCTION__);
self::assertCount(1, $cache->getItem(__FUNCTION__)->get());
}
/** @param CacheItemPoolInterface|Cache $cache */
private function assertCachedQueryIsExecutedOnceAndYieldsTheSameResult(object $cache, string $cacheKey): void
{
$data = [['foo' => 'bar']];
$connection = $this->createConnection(1, $data);
$qcp = new QueryCacheProfile(0, $cacheKey, $cache);
self::assertSame($data, $connection->executeCacheQuery('SELECT 1', [], [], $qcp)->fetchAllAssociative());
self::assertSame($data, $connection->executeCacheQuery('SELECT 1', [], [], $qcp)->fetchAllAssociative());
}
public function testCachedQueryWithChangedImplementationIsExecutedTwice(): void
{
$data = [['baz' => 'qux']];
$connection = $this->createConnection(2, $data);
self::assertSame($data, $connection->executeCacheQuery(
'SELECT 1',
[],
[],
new QueryCacheProfile(0, __FUNCTION__, new ArrayAdapter()),
)->fetchAllAssociative());
self::assertSame($data, $connection->executeCacheQuery(
'SELECT 1',
[],
[],
new QueryCacheProfile(0, __FUNCTION__, new ArrayAdapter()),
)->fetchAllAssociative());
}
/** @param list<array<string, mixed>> $data */
private function createConnection(int $expectedQueryCount, array $data): Connection
{
$connection = $this->createMock(Driver\Connection::class);
$connection->expects(self::exactly($expectedQueryCount))
->method('query')
->willReturnCallback(static function () use ($data): ArrayResult {
return new ArrayResult($data);
});
$driver = $this->createMock(Driver::class);
$driver->method('connect')
->willReturn($connection);
return new Connection([], $driver);
}
}
|