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