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