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