packages/ztd-query-sqlite/tests/Unit/Shadow/Resolution/MutationTableLookupTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Resolution;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\Sqlite\Shadow\Resolution\MutationTableLookup;
10use ZtdQuery\Schema\TableDefinition;
11use ZtdQuery\Schema\TableDefinitionRegistry;
12use ZtdQuery\Shadow\ShadowStore;
13
14#[CoversClass(MutationTableLookup::class)]
15final class MutationTableLookupTest extends TestCase
16{
17 public function testDefinitionReturnsTheRegisteredSchema(): void
18 {
19 $registry = new TableDefinitionRegistry();
20 $definition = new TableDefinition(['id', 'name'], ['id' => 'INTEGER', 'name' => 'TEXT'], ['id'], ['id'], []);
21 $registry->register('users', $definition);
22 $store = new ShadowStore();
23 $store->set('users', [['id' => 1, 'name' => 'Alice']]);
24 self::assertSame($definition, (new MutationTableLookup($registry))->definition('UPDATE users SET id = 1', 'users'));
25 }
26
27 public function testDefinitionRejectsUnknownTables(): void
28 {
29 $registry = new TableDefinitionRegistry();
30 $definition = new TableDefinition(['id', 'name'], ['id' => 'INTEGER', 'name' => 'TEXT'], ['id'], ['id'], []);
31 $registry->register('users', $definition);
32 $store = new ShadowStore();
33 $store->set('users', [['id' => 1, 'name' => 'Alice']]);
34 $this->expectException(\ZtdQuery\Exception\UnknownSchemaException::class);
35 (new MutationTableLookup($registry))->definition('UPDATE missing SET id = 1', 'missing');
36 }
37
38 public function testAssertTableWasNotRemovedRejectsDroppedTables(): void
39 {
40 $registry = new TableDefinitionRegistry();
41 $definition = new TableDefinition(['id', 'name'], ['id' => 'INTEGER', 'name' => 'TEXT'], ['id'], ['id'], []);
42 $registry->register('users', $definition);
43 $store = new ShadowStore();
44 $store->set('users', [['id' => 1, 'name' => 'Alice']]);
45 $registry->markRemoved('users');
46 $this->expectException(\ZtdQuery\Exception\UnsupportedSqlException::class);
47 (new MutationTableLookup($registry))->assertTableWasNotRemoved('INSERT INTO users(id) VALUES (1)', 'users');
48 }
49
50 public function testAssertTableWasNotRemovedPermitsAnActiveSchema(): void
51 {
52 $registry = new TableDefinitionRegistry();
53 $definition = new TableDefinition(['id', 'name'], ['id' => 'INTEGER', 'name' => 'TEXT'], ['id'], ['id'], []);
54 $registry->register('users', $definition);
55 $store = new ShadowStore();
56 $store->set('users', [['id' => 1, 'name' => 'Alice']]);
57 (new MutationTableLookup($registry))->assertTableWasNotRemoved('INSERT INTO users(id) VALUES (1)', 'users');
58 self::assertSame($definition, $registry->get('users'));
59 }
60
61}
62