packages/sql-catalog/tests/Unit/Extension/WordPress/WordPressExtensionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Extension\WordPress;
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\Core\Sql\StatementKind;
13use SqlCatalog\Extension\WordPress\WordPressExtension;
14
15#[CoversClass(WordPressExtension::class)]
16#[UsesClass(SinkSpec::class)]
17final class WordPressExtensionTest extends TestCase
18{
19    public function testNameIsHowTheCommandLineSelectsIt(): void
20    {
21        self::assertSame('wordpress', (new WordPressExtension())->name());
22    }
23
24    public function testDescriptionMentionsWhatItCovers(): void
25    {
26        self::assertStringContainsString('wpdb', (new WordPressExtension())->description());
27    }
28
29    public function testPrepareHandsTheStatementBackRatherThanSendingIt(): void
30    {
31        $prepare = array_values(array_filter(
32            (new WordPressExtension())->sinks(),
33            static fn (SinkSpec $sink): bool => $sink->id === 'wordpress.prepare',
34        ));
35
36        self::assertSame(SinkRole::Compose, $prepare[0]->role);
37        self::assertSame(0, $prepare[0]->sqlParameter);
38        self::assertSame(1, $prepare[0]->valuesFrom);
39    }
40
41    public function testMethodsNameTheKindTheReadingCallsImply(): void
42    {
43        $methods = (new WordPressExtension())->methods();
44
45        self::assertSame(StatementKind::Select, $methods['get_results']);
46        self::assertSame(StatementKind::Select, $methods['get_var']);
47        self::assertNull($methods['query']);
48    }
49
50    public function testSinksCoverInterpolatingAndIssuingAStatement(): void
51    {
52        $roles = array_map(static fn (SinkSpec $sink): SinkRole => $sink->role, (new WordPressExtension())->sinks());
53
54        self::assertContains(SinkRole::Compose, $roles);
55        self::assertContains(SinkRole::Query, $roles);
56    }
57
58    public function testEverySinkIsDescribedExactly(): void
59    {
60        $described = array_map(
61            static fn (SinkSpec $sink): string => implode('|', [
62                $sink->id,
63                $sink->callKind->value,
64                $sink->receiverType ?? '-',
65                $sink->name,
66                $sink->role->value,
67                $sink->sqlParameter ?? '-',
68                $sink->valuesParameter ?? '-',
69                $sink->valuesFrom ?? '-',
70                $sink->nameParameter ?? '-',
71                $sink->valueParameter ?? '-',
72                ($sink->kind === null ? '-' : $sink->kind->value) . '/' . ($sink->handleType ?? '-'),
73            ]),
74            (new WordPressExtension())->sinks(),
75        );
76
77        self::assertSame(
78            [
79            'wordpress.prepare|method|wpdb|prepare|compose|0|-|1|-|-|-/-',
80            'wordpress.query|method|wpdb|query|query|0|-|-|-|-|-/-',
81            'wordpress.get_results|method|wpdb|get_results|query|0|-|-|-|-|select/-',
82            'wordpress.get_row|method|wpdb|get_row|query|0|-|-|-|-|select/-',
83            'wordpress.get_col|method|wpdb|get_col|query|0|-|-|-|-|select/-',
84            'wordpress.get_var|method|wpdb|get_var|query|0|-|-|-|-|select/-',
85            'wordpress.get_col_info|method|wpdb|get_col_info|query|0|-|-|-|-|select/-',
86            ],
87            $described,
88        );
89    }
90
91    public function testGlobalsDeclareTheHandleWordPressHandsOut(): void
92    {
93        self::assertSame(['wpdb' => 'wpdb'], (new WordPressExtension())->globals());
94    }
95}
96