packages/ztd-query-core/tests/Unit/Rewrite/InsertSelectProjectionPlannerTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Rewrite\InsertSelectProjection;
11use ZtdQuery\Rewrite\InsertSelectProjectionPlanner;
12
13#[CoversClass(InsertSelectProjectionPlanner::class)]
14#[UsesClass(InsertSelectProjection::class)]
15final class InsertSelectProjectionPlannerTest extends TestCase
16{
17 public function testPlansSourcePositionsGeneratedDefaultsAndNulls(): void
18 {
19 $projections = (new InsertSelectProjectionPlanner())->plan(
20 ['id', 'name', 'status', 'note'],
21 ['name'],
22 ['status' => "'active'"],
23 ['id' => 8],
24 );
25
26 self::assertCount(4, $projections);
27 self::assertSame('id', $projections[0]->targetColumn());
28 self::assertSame(8, $projections[0]->generatedIdentityStart());
29 self::assertNull($projections[0]->defaultExpressionValue());
30 self::assertSame('name', $projections[1]->targetColumn());
31 self::assertSame(0, $projections[1]->sourceIndex());
32 self::assertSame('status', $projections[2]->targetColumn());
33 self::assertSame("'active'", $projections[2]->defaultExpressionValue());
34 self::assertSame('note', $projections[3]->targetColumn());
35 self::assertTrue($projections[3]->isNullValue());
36 }
37
38 public function testUsesInsertColumnsWhenTableShapeIsUnavailable(): void
39 {
40 $projections = (new InsertSelectProjectionPlanner())->plan([], ['id', 'name'], [], []);
41
42 self::assertCount(2, $projections);
43 self::assertSame(0, $projections[0]->sourceIndex());
44 self::assertSame(1, $projections[1]->sourceIndex());
45 }
46
47 public function testGeneratedIdentityTakesPriorityOverDefault(): void
48 {
49 $projections = (new InsertSelectProjectionPlanner())->plan(
50 ['id'],
51 [],
52 ['id' => 'DEFAULT_ID()'],
53 ['id' => 7],
54 );
55
56 self::assertSame(7, $projections[0]->generatedIdentityStart());
57 self::assertNull($projections[0]->defaultExpressionValue());
58 }
59}
60