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