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