packages/sql-catalog/tests/Unit/Core/Extension/SinkSpecTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Extension;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlCatalog\Core\Extension\SinkCallKind;
10use SqlCatalog\Core\Extension\SinkRole;
11use SqlCatalog\Core\Extension\SinkSpec;
12
13#[CoversClass(SinkSpec::class)]
14final class SinkSpecTest extends TestCase
15{
16 public function testMatchesNameIgnoresCaseAndLeadingBackslashes(): void
17 {
18 $sink = new SinkSpec('id', SinkCallKind::FunctionCall, null, 'mysqli_query', SinkRole::Query, sqlParameter: 1);
19 self::assertTrue($sink->matchesName('MYSQLI_QUERY'));
20 self::assertTrue($sink->matchesName('\\mysqli_query'));
21 self::assertFalse($sink->matchesName('mysqli_prepare'));
22 }
23
24 public function testTheArgumentPositionsAreKept(): void
25 {
26 $sink = new SinkSpec(
27 'id',
28 SinkCallKind::Method,
29 'PDO',
30 'prepare',
31 SinkRole::Prepare,
32 sqlParameter: 0,
33 handleType: 'PDOStatement',
34 );
35 self::assertSame(0, $sink->sqlParameter);
36 self::assertSame('PDOStatement', $sink->handleType);
37 self::assertNull($sink->valuesParameter);
38 }
39 public function testModelledOutputsUseSqlAndBindingsWithoutArgumentPositions(): void
40 {
41 $sink = new SinkSpec('example.run', SinkCallKind::FunctionCall, null, 'run', SinkRole::Modelled, model: 'example');
42 self::assertSame(0, $sink->sqlParameter);
43 self::assertSame(1, $sink->valuesParameter);
44 self::assertSame('example', $sink->model);
45 }
46
47}
48