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