packages/sql-catalog/tests/Unit/Extension/Pdo/PdoExtensionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Extension\Pdo;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlCatalog\Core\Extension\SinkRole;
11use SqlCatalog\Core\Extension\SinkSpec;
12use SqlCatalog\Extension\Pdo\PdoExtension;
13
14#[CoversClass(PdoExtension::class)]
15#[UsesClass(SinkSpec::class)]
16final class PdoExtensionTest extends TestCase
17{
18    public function testNameIsHowTheCommandLineSelectsIt(): void
19    {
20        self::assertSame('pdo', (new PdoExtension())->name());
21    }
22
23    public function testDescriptionMentionsWhatItCovers(): void
24    {
25        self::assertStringContainsString('PDO', (new PdoExtension())->description());
26    }
27
28    public function testSinksCoverQueryingPreparingAndBinding(): void
29    {
30        $sinks = (new PdoExtension())->sinks();
31        $roles = array_map(static fn (SinkSpec $sink): SinkRole => $sink->role, $sinks);
32        self::assertContains(SinkRole::Query, $roles);
33        self::assertContains(SinkRole::Prepare, $roles);
34        self::assertContains(SinkRole::Execute, $roles);
35        self::assertContains(SinkRole::Bind, $roles);
36        self::assertSame(['pdo.query', 'pdo.exec', 'pdo.prepare', 'pdo.statement.execute', 'pdo.statement.bindValue', 'pdo.statement.bindParam'], array_map(
37            static fn (SinkSpec $sink): string => $sink->id,
38            $sinks,
39        ));
40    }
41    public function testEverySinkIsDescribedExactly(): void
42    {
43        $described = array_map(
44            static fn (SinkSpec $sink): string => implode('|', [
45                $sink->id,
46                $sink->callKind->value,
47                $sink->receiverType ?? '-',
48                $sink->name,
49                $sink->role->value,
50                $sink->sqlParameter ?? '-',
51                $sink->valuesParameter ?? '-',
52                $sink->valuesFrom ?? '-',
53                $sink->nameParameter ?? '-',
54                $sink->valueParameter ?? '-',
55                ($sink->kind === null ? '-' : $sink->kind->value) . '/' . ($sink->handleType ?? '-'),
56            ]),
57            (new PdoExtension())->sinks(),
58        );
59
60        self::assertSame(
61            [
62            'pdo.query|method|PDO|query|query|0|-|-|-|-|-/-',
63            'pdo.exec|method|PDO|exec|query|0|-|-|-|-|-/-',
64            'pdo.prepare|method|PDO|prepare|prepare|0|-|-|-|-|-/PDOStatement',
65            'pdo.statement.execute|method|PDOStatement|execute|execute|-|0|-|-|-|-/-',
66            'pdo.statement.bindValue|method|PDOStatement|bindValue|bind|-|-|-|0|1|-/-',
67            'pdo.statement.bindParam|method|PDOStatement|bindParam|bind|-|-|-|0|1|-/-',
68            ],
69            $described,
70        );
71    }
72
73    public function testGlobalsAreEmptyBecauseTheHandleIsNotReachedThroughOne(): void
74    {
75        self::assertSame([], (new PdoExtension())->globals());
76    }
77}
78