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