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)]
39#[UsesClass(\SqlFixture\Plan\Choice\ChoiceValidation::class)]
40#[UsesClass(\SqlFixture\Plan\Choice\PlanContents::class)]
41final class PlanSchemaExceptionTest extends TestCase
42{
43 #[Test]
44 public function testUnknownColumnNamesTheLinkTheTableAndWhatItDoesHave(): void
45 {
46 $schema = new TableSchema('order', [
47 'id' => new ColumnDefinition('id', 'INT'),
48 'status' => new ColumnDefinition('status', 'VARCHAR'),
49 ]);
50
51 $message = (new \SqlFixture\Fixture\Exception\UnknownPlanColumnException(ColumnRef::of('order', 'idd'), 'idd', $schema))->getMessage();
52
53 self::assertSame(
54 'The plan links order.idd, but order has no column idd. Its columns are: id, status.',
55 $message
56 );
57 }
58
59 #[Test]
60 public function testGeneratedColumnExplainsWhyItCannotCarryAValue(): void
61 {
62 $schema = new TableSchema('order', ['code' => new ColumnDefinition('code', 'VARCHAR', generated: true)]);
63
64 $message = (new \SqlFixture\Fixture\Exception\GeneratedColumnReferenceException(ColumnRef::of('order', 'code'), 'code', $schema))->getMessage();
65
66 self::assertSame(
67 'The plan links order.code, but order.code is a generated column: the database '
68 . 'computes it, so there is no value to carry across the relation and none to write '
69 . 'into it. Link a stored column instead.',
70 $message
71 );
72 }
73
74 #[Test]
75 public function testMissingValueNamesBothEnds(): void
76 {
77 $message = (new \SqlFixture\Fixture\Exception\MissingRelationValueException('order_id', ColumnRef::of('order', 'id'), 'id'))->getMessage();
78
79 self::assertSame('Cannot fill order_id: the generated order row has no id to copy from.', $message);
80 }
81}
82