packages/ztd-query-core/tests/Unit/Platform/CopySupportTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform;
6
7use PHPUnit\Framework\Attributes\CoversNothing;
8use PHPUnit\Framework\TestCase;
9use Tests\Fake\FakeCopySupport;
10use ZtdQuery\Schema\TableDefinition;
11
12#[CoversNothing]
13final class CopySupportTest extends TestCase
14{
15 public function testTableNameDropsTheSchemaARelationWasQualifiedWith(): void
16 {
17 self::assertSame('users', (new FakeCopySupport())->tableName('public.users'));
18 }
19
20 public function testTargetTakesEveryColumnOfTheTableWhereTheStatementNamedNone(): void
21 {
22 $definition = new TableDefinition(['id', 'name'], [], ['id'], [], []);
23
24 $target = (new FakeCopySupport())->target('public.users', null, $definition);
25
26 self::assertSame(['id', 'name'], $target->columns);
27 self::assertSame('users', $target->tableName());
28 }
29
30 public function testTargetTakesTheColumnsTheStatementNamed(): void
31 {
32 $definition = new TableDefinition(['id', 'name'], [], ['id'], [], []);
33
34 $target = (new FakeCopySupport())->target('users', 'name, id', $definition);
35
36 self::assertSame(['name', 'id'], $target->columns);
37 }
38
39 public function testSelectSqlReadsTheColumnsTheStatementIsAbout(): void
40 {
41 $definition = new TableDefinition(['id', 'name'], [], ['id'], [], []);
42 $support = new FakeCopySupport();
43
44 $target = $support->target('users', null, $definition);
45
46 self::assertSame('SELECT id, name FROM users', $support->selectSql($target));
47 }
48
49 public function testInsertSqlWritesOneGroupOfValuesPerRow(): void
50 {
51 $definition = new TableDefinition(['id'], [], ['id'], [], []);
52 $support = new FakeCopySupport();
53
54 $sql = $support->insertSql($support->target('users', null, $definition), 2, false);
55
56 self::assertSame('INSERT INTO users (id) VALUES (?), (?)', $sql);
57 }
58
59 public function testInsertSqlSaysWhenAColumnTheDatabaseNumbersIsBeingWrittenAnyway(): void
60 {
61 $definition = new TableDefinition(['id'], [], ['id'], [], []);
62 $support = new FakeCopySupport();
63
64 $sql = $support->insertSql($support->target('users', null, $definition), 1, true);
65
66 self::assertStringContainsString('OVERRIDING SYSTEM VALUE', $sql);
67 }
68
69 public function testEncodeRowWritesANullAsWhateverTheStatementSaidStandsForOne(): void
70 {
71 self::assertSame("1\tN", (new FakeCopySupport())->encodeRow([1, null], "\t", 'N'));
72 }
73
74 public function testDecodeRowReadsBackWhatEncodeRowWrote(): void
75 {
76 $support = new FakeCopySupport();
77
78 $written = $support->encodeRow(['a', null], "\t", '\\N');
79
80 self::assertSame(['a', null], $support->decodeRow($written, "\t", '\\N'));
81 }
82
83 public function testIsCopyStatementAnswersForTheStatementsThisIsAbout(): void
84 {
85 $support = new FakeCopySupport();
86
87 self::assertTrue($support->isCopyStatement('COPY users TO STDOUT'));
88 self::assertFalse($support->isCopyStatement('SELECT 1'));
89 }
90}
91