packages/sql-catalog/tests/Unit/Core/Extension/ExtensionRegistryTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Extension;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlCatalog\Core\Extension\ExtensionInterface;
11use SqlCatalog\Core\Extension\ExtensionRegistry;
12use SqlCatalog\Core\Extension\SinkSpec;
13use SqlCatalog\Core\Extension\UnknownExtensionException;
14use SqlCatalog\Extension\Doctrine\DoctrineExtension;
15use SqlCatalog\Extension\Laravel\LaravelExtension;
16use SqlCatalog\Extension\Mysqli\MysqliExtension;
17use SqlCatalog\Extension\Pdo\PdoExtension;
18use SqlCatalog\Extension\WordPress\WordPressExtension;
19
20#[CoversClass(ExtensionRegistry::class)]
21#[UsesClass(DoctrineExtension::class)]
22#[UsesClass(LaravelExtension::class)]
23#[UsesClass(MysqliExtension::class)]
24#[UsesClass(PdoExtension::class)]
25#[UsesClass(WordPressExtension::class)]
26#[UsesClass(SinkSpec::class)]
27#[UsesClass(UnknownExtensionException::class)]
28final class ExtensionRegistryTest extends TestCase
29{
30    public function testWithBuiltinsRegistersEverythingThatShips(): void
31    {
32        self::assertSame(['doctrine', 'laravel', 'mysqli', 'pdo', 'wordpress'], \SqlCatalog\Facade\Builtins::extensions()->names());
33    }
34
35    public function testRegisterReplacesAnExtensionOfTheSameName(): void
36    {
37        $registry = new ExtensionRegistry([new PdoExtension()]);
38        $registry->register(new PdoExtension());
39        self::assertSame(['pdo'], $registry->names());
40    }
41
42    public function testNamesAreAlphabetical(): void
43    {
44        self::assertSame(['mysqli', 'pdo'], (new ExtensionRegistry([new PdoExtension(), new MysqliExtension()]))->names());
45    }
46
47    public function testHasReportsWhetherAnExtensionIsRegistered(): void
48    {
49        $registry = new ExtensionRegistry([new PdoExtension()]);
50        self::assertTrue($registry->has('pdo'));
51        self::assertFalse($registry->has('laravel'));
52    }
53
54    public function testGetAnswersWithTheRegisteredExtension(): void
55    {
56        self::assertSame('pdo', (new ExtensionRegistry([new PdoExtension()]))->get('pdo')->name());
57    }
58
59    public function testGetRefusesAnUnknownName(): void
60    {
61        $this->expectException(UnknownExtensionException::class);
62        (new ExtensionRegistry([new PdoExtension()]))->get('symfony');
63    }
64
65    public function testDefaultNamesAreTheDriverExtensionsThatAreRegistered(): void
66    {
67        self::assertSame(['pdo', 'mysqli'], \SqlCatalog\Facade\Builtins::extensions()->defaultNames());
68        self::assertSame(['pdo'], (new ExtensionRegistry([new PdoExtension()], ['pdo']))->defaultNames());
69    }
70
71    public function testSinksOfCollectsTheCallsOfEveryNamedExtension(): void
72    {
73        $sinks = \SqlCatalog\Facade\Builtins::extensions()->sinksOf(['pdo', 'mysqli']);
74        $ids = array_map(static fn (SinkSpec $sink): string => $sink->id, $sinks);
75        self::assertContains('pdo.query', $ids);
76        self::assertContains('mysqli.query', $ids);
77    }
78
79    public function testSinksOfRefusesAnUnknownName(): void
80    {
81        $this->expectException(UnknownExtensionException::class);
82        \SqlCatalog\Facade\Builtins::extensions()->sinksOf(['symfony']);
83    }
84
85    public function testAllReturnsTheExtensionsAlphabetically(): void
86    {
87        $names = array_map(
88            static fn (ExtensionInterface $extension): string => $extension->name(),
89            \SqlCatalog\Facade\Builtins::extensions()->all(),
90        );
91        self::assertSame(['doctrine', 'laravel', 'mysqli', 'pdo', 'wordpress'], $names);
92    }
93
94    public function testGlobalsOfCollectsWhatTheNamedExtensionsDeclare(): void
95    {
96        self::assertSame(
97            ['wpdb' => 'wpdb'],
98            \SqlCatalog\Facade\Builtins::extensions()->globalsOf(['pdo', 'wordpress']),
99        );
100    }
101
102    public function testGlobalsOfRefusesAnUnknownName(): void
103    {
104        $this->expectException(UnknownExtensionException::class);
105        \SqlCatalog\Facade\Builtins::extensions()->globalsOf(['symfony']);
106    }
107    public function testModelProvidersOfSelectsEnabledProvidersAndKeepsRawExtensionsCompatible(): void
108    {
109        $registry = \SqlCatalog\Facade\Builtins::extensions();
110        self::assertSame([], $registry->modelProvidersOf(['pdo', 'wordpress']));
111        self::assertSame([$registry->get('laravel')], $registry->modelProvidersOf(['pdo', 'laravel']));
112    }
113
114}
115