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