packages/sql-catalog/tests/Unit/Core/Extension/ExtensionInterfaceTest.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\SinkSpec;
12use SqlCatalog\Extension\Doctrine\DoctrineExtension;
13use SqlCatalog\Extension\Laravel\LaravelExtension;
14use SqlCatalog\Extension\Mysqli\MysqliExtension;
15use SqlCatalog\Extension\Pdo\PdoExtension;
16
17#[CoversClass(ExtensionInterface::class)]
18#[UsesClass(DoctrineExtension::class)]
19#[UsesClass(LaravelExtension::class)]
20#[UsesClass(MysqliExtension::class)]
21#[UsesClass(PdoExtension::class)]
22#[UsesClass(SinkSpec::class)]
23final class ExtensionInterfaceTest extends TestCase
24{
25 public function testNameIsUniqueAcrossTheExtensionsThatShip(): void
26 {
27 $names = array_map(
28 static fn (ExtensionInterface $extension): string => $extension->name(),
29 [new PdoExtension(), new MysqliExtension(), new DoctrineExtension(), new LaravelExtension(\SqlCatalog\Facade\Builtins::dialects())],
30 );
31 self::assertSame($names, array_values(array_unique($names)));
32 }
33
34 public function testDescriptionIsAlwaysWritten(): void
35 {
36 $descriptions = array_map(
37 static fn (ExtensionInterface $extension): string => $extension->description(),
38 [new PdoExtension(), new MysqliExtension(), new DoctrineExtension(), new LaravelExtension(\SqlCatalog\Facade\Builtins::dialects())],
39 );
40 self::assertNotContains('', $descriptions);
41 }
42
43 public function testSinksAreIdentifiedUniquelyWithinAnExtension(): void
44 {
45 $ids = array_map(static fn (SinkSpec $sink): string => $sink->id, (new PdoExtension())->sinks());
46 self::assertSame($ids, array_values(array_unique($ids)));
47 }
48
49 public function testGlobalsAreDeclaredOnlyByAnExtensionThatHandsOneOut(): void
50 {
51 $globals = array_map(
52 static fn (ExtensionInterface $extension): array => $extension->globals(),
53 [new PdoExtension(), new MysqliExtension(), new DoctrineExtension(), new LaravelExtension(\SqlCatalog\Facade\Builtins::dialects())],
54 );
55 self::assertSame([[], [], [], []], $globals);
56 }
57}
58