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