File: CachedQueryTest.php

package info (click to toggle)
php-doctrine-dbal 3.6.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 4,500 kB
  • sloc: php: 54,704; xml: 485; makefile: 42; sh: 24
file content (99 lines) | stat: -rw-r--r-- 3,339 bytes parent folder | download
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);
    }
}