packages/ztd-query-core/tests/Unit/Rewrite/InsertSelectProjectionTest.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\InsertSelectProjection;
10
11#[CoversClass(InsertSelectProjection::class)]
12final class InsertSelectProjectionTest extends TestCase
13{
14    public function testDefaultExpressionValueDefaultExpressionRepresentsSourceExpressionGeneratedIdentityAndNullWithoutSqlRendering(): void
15    {
16        $source = InsertSelectProjection::source('name', 2);
17        $firstSource = InsertSelectProjection::source('id', 0);
18        $expression = InsertSelectProjection::defaultExpression('status', "'active'");
19        $generatedIdentity = InsertSelectProjection::generatedIdentity('generated_id', 1);
20        $null = InsertSelectProjection::nullValue('note');
21
22        self::assertSame('name', $source->targetColumn());
23        self::assertSame(2, $source->sourceIndex());
24        self::assertNull($source->defaultExpressionValue());
25        self::assertNull($source->generatedIdentityStart());
26        self::assertFalse($source->isNullValue());
27        self::assertSame(0, $firstSource->sourceIndex());
28        self::assertSame("'active'", $expression->defaultExpressionValue());
29        self::assertNull($expression->sourceIndex());
30        self::assertNull($expression->generatedIdentityStart());
31        self::assertFalse($expression->isNullValue());
32        self::assertSame(1, $generatedIdentity->generatedIdentityStart());
33        self::assertNull($generatedIdentity->sourceIndex());
34        self::assertNull($generatedIdentity->defaultExpressionValue());
35        self::assertFalse($generatedIdentity->isNullValue());
36        self::assertTrue($null->isNullValue());
37        self::assertNull($null->sourceIndex());
38        self::assertNull($null->defaultExpressionValue());
39        self::assertNull($null->generatedIdentityStart());
40    }
41
42    public function testSourceIndexIsWhereInTheQueryTheValueComesFrom(): void
43    {
44        self::assertSame(2, InsertSelectProjection::source('name', 2)->sourceIndex());
45    }
46
47    public function testSourceIndexIsNothingForAColumnTheQueryDoesNotSupply(): void
48    {
49        self::assertNull(InsertSelectProjection::nullValue('note')->sourceIndex());
50    }
51
52    public function testGeneratedIdentityStartIsTheFirstNumberTheDatabaseWouldAssign(): void
53    {
54        self::assertSame(5, InsertSelectProjection::generatedIdentity('id', 5)->generatedIdentityStart());
55    }
56
57    public function testNullValueReadsBackAsNullAndNothingElse(): void
58    {
59        $projection = InsertSelectProjection::nullValue('note');
60
61        self::assertTrue($projection->isNullValue());
62        self::assertNull($projection->sourceIndex());
63        self::assertNull($projection->generatedIdentityStart());
64    }
65
66    public function testIsNullValueIsFalseForEveryOtherKindOfColumn(): void
67    {
68        self::assertFalse(InsertSelectProjection::source('name', 0)->isNullValue());
69        self::assertFalse(InsertSelectProjection::generatedIdentity('id', 1)->isNullValue());
70    }
71
72    public function testTargetColumnNamesTheColumnOfTheTargetTable(): void
73    {
74        self::assertSame('name', InsertSelectProjection::source('name', 0)->targetColumn());
75    }
76}
77