packages/sql-fixture/tests/Unit/Fixture/PlanSchemaExceptionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Fixture;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Test;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFixture\Fixture\PlanSchemaException;
12use SqlFixture\Plan\ColumnRef;
13use SqlFixture\Schema\ColumnDefinition;
14use SqlFixture\Schema\TableSchema;
15
16#[CoversClass(PlanSchemaException::class)]
17#[UsesClass(ColumnRef::class)]
18#[UsesClass(TableSchema::class)]
19#[UsesClass(ColumnDefinition::class)]
20#[UsesClass(\SqlFixture\Plan\FixturePlan::class)]
21#[UsesClass(\SqlFixture\Plan\PlanParser::class)]
22#[UsesClass(\SqlFixture\Plan\PlanPrinter::class)]
23#[UsesClass(\SqlFixture\Plan\PlanSyntaxException::class)]
24#[UsesClass(\SqlFixture\Plan\Relation::class)]
25#[UsesClass(\SqlFixture\Plan\RelationKind::class)]
26#[UsesClass(\SqlFixture\Plan\RelationSide::class)]
27#[UsesClass(\SqlFixture\Plan\Parsing\PlanStatements::class)]
28#[UsesClass(\SqlFixture\Plan\Parsing\RelationCursor::class)]
29#[UsesClass(\SqlFixture\Plan\Parsing\RelationReader::class)]
30#[UsesClass(\SqlFixture\Plan\PlanStructureException::class)]
31#[UsesClass(\SqlFixture\Plan\Printing\PlanTables::class)]
32#[UsesClass(\SqlFixture\Plan\Printing\RelationGroups::class)]
33#[UsesClass(\SqlFixture\Plan\Printing\StatementPrinter::class)]
34#[UsesClass(\SqlFixture\Plan\Validation\PlanValidation::class)]
35#[UsesClass(\SqlFixture\Plan\Validation\TableName::class)]
36#[UsesClass(\SqlFixture\Fixture\Exception\GeneratedColumnReferenceException::class)]
37#[UsesClass(\SqlFixture\Fixture\Exception\MissingRelationValueException::class)]
38#[UsesClass(\SqlFixture\Fixture\Exception\UnknownPlanColumnException::class)]
39final class PlanSchemaExceptionTest extends TestCase
40{
41    #[Test]
42    public function testUnknownColumnNamesTheLinkTheTableAndWhatItDoesHave(): void
43    {
44        $schema = new TableSchema('order', [
45            'id' => new ColumnDefinition('id', 'INT'),
46            'status' => new ColumnDefinition('status', 'VARCHAR'),
47        ]);
48
49        $message = (new \SqlFixture\Fixture\Exception\UnknownPlanColumnException(ColumnRef::of('order', 'idd'), 'idd', $schema))->getMessage();
50
51        self::assertSame(
52            'The plan links order.idd, but order has no column idd. Its columns are: id, status.',
53            $message
54        );
55    }
56
57    #[Test]
58    public function testGeneratedColumnExplainsWhyItCannotCarryAValue(): void
59    {
60        $schema = new TableSchema('order', ['code' => new ColumnDefinition('code', 'VARCHAR', generated: true)]);
61
62        $message = (new \SqlFixture\Fixture\Exception\GeneratedColumnReferenceException(ColumnRef::of('order', 'code'), 'code', $schema))->getMessage();
63
64        self::assertSame(
65            'The plan links order.code, but order.code is a generated column: the database '
66            . 'computes it, so there is no value to carry across the relation and none to write '
67            . 'into it. Link a stored column instead.',
68            $message
69        );
70    }
71
72    #[Test]
73    public function testMissingValueNamesBothEnds(): void
74    {
75        $message = (new \SqlFixture\Fixture\Exception\MissingRelationValueException('order_id', ColumnRef::of('order', 'id'), 'id'))->getMessage();
76
77        self::assertSame('Cannot fill order_id: the generated order row has no id to copy from.', $message);
78    }
79}
80