packages/sql-catalog/tests/Unit/Facade/BuiltinsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Facade;
6
7use PHPUnit\Framework\TestCase;
8
9#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Facade\Builtins::class)]
10#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Core\Sql\Dialects::class)]
11#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Reporter\Html\SqlFormatter::class)]
12#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Core\Catalog\StatementPart::class)]
13#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Platform\MySql\Dialect::class)]
14#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Platform\MySql\SqlFormatter::class)]
15#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Platform\PostgreSql\Dialect::class)]
16#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Platform\PostgreSql\SqlFormatter::class)]
17#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Platform\Sqlite\Dialect::class)]
18#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Platform\Sqlite\SqlFormatter::class)]
19#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Core\Extension\ExtensionRegistry::class)]
20#[\PHPUnit\Framework\Attributes\CoversClass(\SqlCatalog\Core\Reporter\ReporterRegistry::class)]
21final class BuiltinsTest extends TestCase
22{
23    public function testExtensionsRegistersTheShippedImplementationsAndDefaults(): void
24    {
25        $extensions = \SqlCatalog\Facade\Builtins::extensions();
26        self::assertSame(['doctrine', 'laravel', 'mysqli', 'pdo', 'wordpress'], $extensions->names());
27        self::assertSame(['pdo', 'mysqli'], $extensions->defaultNames());
28    }
29
30    public function testReportersRegistersTheShippedFormats(): void
31    {
32        self::assertSame(['html', 'json', 'text'], \SqlCatalog\Facade\Builtins::reporters()->names());
33    }
34
35    public function testDialectsSelectsIndependentPolicies(): void
36    {
37        $dialects = \SqlCatalog\Facade\Builtins::dialects();
38        self::assertSame('`', $dialects->find('mysql')?->identifierQuote());
39        self::assertSame('"', $dialects->find('pgsql')?->identifierQuote());
40        self::assertSame('insert or ignore into ', $dialects->find('sqlite')?->insertPrefix(true));
41    }
42
43    public function testFormattersCoverAllBuiltInLanguages(): void
44    {
45        self::assertCount(3, \SqlCatalog\Facade\Builtins::formatters());
46    }
47
48    public function testSqlFormatterKeepsTheDefaultExpandedPresentation(): void
49    {
50        $parts = \SqlCatalog\Facade\Builtins::sqlFormatter()->format([new \SqlCatalog\Core\Catalog\StatementPart('SELECT 1')]);
51        self::assertSame("SELECT\n    1", $parts[0]->text);
52    }
53}
54