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