packages/sql-fixture/tests/Unit/InvalidOverrideExceptionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Test;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFixture\InvalidOverrideException;
12use SqlFixture\Schema\ColumnDefinition;
13use SqlFixture\Schema\TableSchema;
14
15#[CoversClass(InvalidOverrideException::class)]
16#[UsesClass(TableSchema::class)]
17#[UsesClass(ColumnDefinition::class)]
18#[UsesClass(\SqlFixture\Fixture\Exception\UnknownOverrideColumnException::class)]
19#[UsesClass(\SqlFixture\Fixture\Exception\NullOverrideException::class)]
20#[UsesClass(\SqlFixture\Fixture\Exception\GeneratedColumnOverrideException::class)]
21final class InvalidOverrideExceptionTest extends TestCase
22{
23 #[Test]
24 public function testUnknownColumnListsWhatTheTableHas(): void
25 {
26 $schema = new TableSchema('order', [
27 'id' => new ColumnDefinition('id', 'INT'),
28 'status' => new ColumnDefinition('status', 'VARCHAR'),
29 ]);
30
31 $message = (new \SqlFixture\Fixture\Exception\UnknownOverrideColumnException('staus', $schema))->getMessage();
32
33 self::assertSame(
34 'Cannot override order.staus: there is no such column. Its columns are: id, status.',
35 $message
36 );
37 }
38
39 #[Test]
40 public function testNotNullableSaysWhyNullIsRefused(): void
41 {
42 $schema = new TableSchema('order', ['status' => new ColumnDefinition('status', 'VARCHAR', nullable: false)]);
43
44 $message = (new \SqlFixture\Fixture\Exception\NullOverrideException('status', $schema))->getMessage();
45
46 self::assertSame('Cannot override order.status with null: the column is NOT NULL.', $message);
47 }
48
49 #[Test]
50 public function testGeneratedColumnSaysTheDatabaseComputesIt(): void
51 {
52 $schema = new TableSchema('order', ['code' => new ColumnDefinition('code', 'VARCHAR', generated: true)]);
53
54 $message = (new \SqlFixture\Fixture\Exception\GeneratedColumnOverrideException('code', $schema))->getMessage();
55
56 self::assertSame(
57 'Cannot override order.code: the database computes it, so a value written here '
58 . 'would be rejected on insert.',
59 $message
60 );
61 }
62
63}
64