packages/sql-fixture/tests/Unit/Fixture/Exception/GeneratedColumnReferenceExceptionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Fixture\Exception;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Plan\ColumnRef;
11use SqlFixture\Schema\ColumnDefinition;
12use SqlFixture\Schema\TableSchema;
13
14#[CoversClass(\SqlFixture\Fixture\Exception\GeneratedColumnReferenceException::class)]
15#[UsesClass(\SqlFixture\Fixture\PlanSchemaException::class)]
16#[UsesClass(ColumnRef::class)]
17#[UsesClass(ColumnDefinition::class)]
18#[UsesClass(TableSchema::class)]
19#[UsesClass(\SqlFixture\Fixture\Exception\MissingRelationValueException::class)]
20#[UsesClass(\SqlFixture\Fixture\Exception\UnknownPlanColumnException::class)]
21final class GeneratedColumnReferenceExceptionTest extends TestCase
22{
23 public function testDescribesGeneratedColumnReference(): void
24 {
25 $schema = new TableSchema('order', ['code' => new ColumnDefinition('code', 'VARCHAR', generated: true)]);
26 $exception = new \SqlFixture\Fixture\Exception\GeneratedColumnReferenceException(ColumnRef::of('order', 'code'), 'code', $schema);
27
28
29 $message = $exception->getMessage();
30
31 self::assertSame(
32 'The plan links order.code, but order.code is a generated column: the database '
33 . 'computes it, so there is no value to carry across the relation and none to write '
34 . 'into it. Link a stored column instead.',
35 $message
36 );
37 self::assertEquals(ColumnRef::of('order', 'code'), $exception->reference);
38 self::assertSame('code', $exception->column);
39 self::assertSame($schema, $exception->schema);
40 }
41}
42