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