packages/ztd-query-core/tests/Unit/Rewrite/InsertRowProjectionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Rewrite\InsertRowProjection;
10
11#[CoversClass(InsertRowProjection::class)]
12final class InsertRowProjectionTest extends TestCase
13{
14    public function testDefaultExpressionValueDefaultExpressionRepresentsProvidedDefaultGeneratedAndNullValuesWithoutSqlRendering(): void
15    {
16        $provided = InsertRowProjection::provided('name', "'Ada'");
17        $default = InsertRowProjection::defaultExpression('status', "'active'");
18        $generated = InsertRowProjection::generatedIdentity('id', 8);
19        $null = InsertRowProjection::nullValue('note');
20
21        self::assertSame('name', $provided->targetColumn());
22        self::assertSame("'Ada'", $provided->providedExpression());
23        self::assertNull($provided->defaultExpressionValue());
24        self::assertNull($provided->generatedIdentityValue());
25        self::assertFalse($provided->isNullValue());
26        self::assertSame("'active'", $default->defaultExpressionValue());
27        self::assertNull($default->providedExpression());
28        self::assertNull($default->generatedIdentityValue());
29        self::assertFalse($default->isNullValue());
30        self::assertSame(8, $generated->generatedIdentityValue());
31        self::assertNull($generated->providedExpression());
32        self::assertNull($generated->defaultExpressionValue());
33        self::assertFalse($generated->isNullValue());
34        self::assertTrue($null->isNullValue());
35        self::assertNull($null->providedExpression());
36        self::assertNull($null->defaultExpressionValue());
37        self::assertNull($null->generatedIdentityValue());
38    }
39
40    public function testGeneratedIdentityValueAcceptsMinimumGeneratedIdentityValue(): void
41    {
42        self::assertSame(1, InsertRowProjection::generatedIdentity('id', 1)->generatedIdentityValue());
43    }
44
45    public function testProvidedCarriesTheExpressionTheStatementWrote(): void
46    {
47        $projection = InsertRowProjection::provided('name', "'Ada'");
48
49        self::assertSame("'Ada'", $projection->providedExpression());
50        self::assertNull($projection->defaultExpressionValue());
51    }
52
53    public function testProvidedExpressionIsNothingForAColumnTheStatementLeftOut(): void
54    {
55        self::assertNull(InsertRowProjection::nullValue('note')->providedExpression());
56    }
57
58    public function testNullValueReadsBackAsNullAndNothingElse(): void
59    {
60        $projection = InsertRowProjection::nullValue('note');
61
62        self::assertTrue($projection->isNullValue());
63        self::assertNull($projection->providedExpression());
64        self::assertNull($projection->generatedIdentityValue());
65    }
66
67    public function testIsNullValueIsFalseForEveryOtherKindOfColumn(): void
68    {
69        self::assertFalse(InsertRowProjection::provided('name', "'Ada'")->isNullValue());
70        self::assertFalse(InsertRowProjection::generatedIdentity('id', 1)->isNullValue());
71    }
72
73    public function testTargetColumnNamesTheColumnOfTheTargetTable(): void
74    {
75        self::assertSame('name', InsertRowProjection::provided('name', "'Ada'")->targetColumn());
76    }
77}
78