packages/sql-catalog/tests/Unit/Core/Catalog/FindingRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Catalog;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlCatalog\Core\Catalog\FindingRule;
12use SqlCatalog\Core\Catalog\Severity;
13
14#[CoversClass(FindingRule::class)]
15#[UsesClass(Severity::class)]
16final class FindingRuleTest extends TestCase
17{
18    #[DataProvider('providerSeverity')]
19    public function testSeverity(FindingRule $rule, Severity $expected): void
20    {
21        self::assertSame($expected, $rule->severity());
22    }
23
24    /**
25     * @return list<array{FindingRule, Severity}>
26     */
27    public static function providerSeverity(): array
28    {
29        return [
30            [FindingRule::ExternalInput, Severity::High],
31            [FindingRule::DynamicSql, Severity::Medium],
32            [FindingRule::PlaceholderCountMismatch, Severity::Medium],
33            [FindingRule::UnresolvedSql, Severity::Low],
34        ];
35    }
36
37    public function testDescribeExplainsEveryRule(): void
38    {
39        $descriptions = array_map(
40            static fn (FindingRule $rule): string => $rule->describe(),
41            FindingRule::cases(),
42        );
43        self::assertCount(count(FindingRule::cases()), array_unique($descriptions));
44        self::assertStringContainsString('external input', FindingRule::ExternalInput->describe());
45    }
46}
47