packages/sql-fixture/tests/Unit/Schema/StaticSchemaResolverTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Test;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFixture\Schema\ColumnDefinition;
12use SqlFixture\Schema\SchemaNotFoundException;
13use SqlFixture\Schema\StaticSchemaResolver;
14use SqlFixture\Schema\TableSchema;
15
16#[CoversClass(StaticSchemaResolver::class)]
17#[UsesClass(TableSchema::class)]
18#[UsesClass(ColumnDefinition::class)]
19#[UsesClass(SchemaNotFoundException::class)]
20#[CoversClass(\SqlFixture\Schema\TableIdentifier::class)]
21#[UsesClass(\SqlFixture\Schema\SchemaResolverInterface::class)]
22final class StaticSchemaResolverTest extends TestCase
23{
24    #[Test]
25    public function testResolvesARegisteredSchema(): void
26    {
27        $schema = new TableSchema('order', ['id' => new ColumnDefinition('id', 'INT')]);
28
29        self::assertSame($schema, (new StaticSchemaResolver([$schema]))->resolve('order'));
30    }
31
32    #[Test]
33    public function testResolvesIgnoringCaseQuotingAndSchemaQualifier(): void
34    {
35        $schema = new TableSchema('Order', ['id' => new ColumnDefinition('id', 'INT')]);
36        $resolver = new StaticSchemaResolver([$schema]);
37
38        self::assertSame($schema, $resolver->resolve('ORDER'));
39        self::assertSame($schema, $resolver->resolve('`shop`.`order`'));
40    }
41
42    #[Test]
43    public function testRegisterAddsAfterConstruction(): void
44    {
45        $resolver = new StaticSchemaResolver();
46        $resolver->register(new TableSchema('order', ['id' => new ColumnDefinition('id', 'INT')]));
47
48        self::assertTrue($resolver->has('order'));
49    }
50
51    #[Test]
52    public function testRegisterReplacesASchemaOfTheSameName(): void
53    {
54        $resolver = new StaticSchemaResolver([
55            new TableSchema('order', ['id' => new ColumnDefinition('id', 'INT')]),
56        ]);
57        $replacement = new TableSchema('order', ['no' => new ColumnDefinition('no', 'INT')]);
58        $resolver->register($replacement);
59
60        self::assertSame($replacement, $resolver->resolve('order'));
61        self::assertCount(1, $resolver->tableNames());
62    }
63
64    #[Test]
65    public function testHasReportsAnUnknownTable(): void
66    {
67        self::assertFalse((new StaticSchemaResolver())->has('order'));
68    }
69
70    #[Test]
71    public function testTableNamesAreLowerCased(): void
72    {
73        $resolver = new StaticSchemaResolver([
74            new TableSchema('Order', ['id' => new ColumnDefinition('id', 'INT')]),
75        ]);
76
77        self::assertSame(['order'], $resolver->tableNames());
78    }
79
80    #[Test]
81    public function testResolveThrowsListingWhatIsKnown(): void
82    {
83        $resolver = new StaticSchemaResolver([
84            new TableSchema('customer', ['id' => new ColumnDefinition('id', 'INT')]),
85        ]);
86
87        $this->expectException(SchemaNotFoundException::class);
88        $this->expectExceptionMessage('Known tables: customer');
89
90        $resolver->resolve('order');
91    }
92}
93