packages/sql-fixture/tests/Unit/Provider/DatabaseSchemaCacheTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Provider;
6
7use PDO;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Provider\DatabaseSchemaCache as Subject;
11
12#[CoversClass(Subject::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\SqliteSchemaFetcher::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\SqliteSchemaParser::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\ColumnDefinition::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\SchemaFetcherInterface::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\SchemaParseException::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\SchemaParserInterface::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\TableSchema::class)]
20#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\ColumnParser::class)]
21#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\CreateTableQuery::class)]
22#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\DefaultExpression::class)]
23#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\DefinitionList::class)]
24#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\PragmaColumn::class)]
25#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\PragmaSchema::class)]
26#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\TableSyntax::class)]
27#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\TypeDeclaration::class)]
28#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\DefinitionSegments::class)]
29#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\TypeShape::class)]
30#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\Exception\InvalidSqlException::class)]
31#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\Exception\ExpectedCreateTableException::class)]
32#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\Exception\MissingColumnDefinitionsException::class)]
33final class DatabaseSchemaCacheTest extends TestCase
34{
35    public function testGetSchemaReusesTheParsedTableUntilInvalidated(): void
36    {
37        $pdo = new PDO('sqlite::memory:');
38        $pdo->exec('CREATE TABLE users (id INT)');
39        $cache = new Subject($pdo, new \SqlFixture\Platform\Sqlite\SqliteSchemaFetcher());
40        $first = $cache->getSchema('users');
41        $pdo->exec('ALTER TABLE users ADD COLUMN name TEXT');
42        self::assertSame($first, $cache->getSchema('users'));
43        self::assertSame(['id'], array_keys($cache->getSchema('users')->columns));
44    }
45
46    public function testClearReflectsSubsequentDdlChanges(): void
47    {
48        $pdo = new PDO('sqlite::memory:');
49        $pdo->exec('CREATE TABLE users (id INT)');
50        $cache = new Subject($pdo, new \SqlFixture\Platform\Sqlite\SqliteSchemaFetcher());
51        $cache->getSchema('users');
52        $pdo->exec('ALTER TABLE users ADD COLUMN name TEXT');
53        $cache->clear();
54        self::assertSame(['id', 'name'], array_keys($cache->getSchema('users')->columns));
55    }
56}
57