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