packages/ztd-query-core/tests/Fake/FakeSessionFactory.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Fake;
6
7use ZtdQuery\Config\ZtdConfig;
8use ZtdQuery\Connection\ConnectionInterface;
9use ZtdQuery\Platform\SessionFactory;
10use ZtdQuery\ResultSelectRunner;
11use ZtdQuery\Schema\TableDefinitionRegistry;
12use ZtdQuery\Session;
13use ZtdQuery\Shadow\ShadowStore;
14
15/**
16 * Fake SessionFactory that assembles a Session using Fake platform implementations.
17 *
18 * Uses FakeSchemaParser and FakeSchemaReflector to pre-load schema,
19 * then creates a Session with FakeSqlRewriter.
20 */
21final class FakeSessionFactory implements SessionFactory
22{
23    private FakeSchemaReflector $reflector;
24
25    /**
26     * @param FakeSchemaReflector|null $reflector Optional pre-configured reflector.
27     */
28    public function __construct(?FakeSchemaReflector $reflector = null)
29    {
30        $this->reflector = $reflector ?? new FakeSchemaReflector();
31    }
32
33    /**
34     * Builds.
35     *
36     * @param ConnectionInterface $connection
37     * @param ZtdConfig $config
38     * @return Session
39     */
40    public function create(ConnectionInterface $connection, ZtdConfig $config): Session
41    {
42        $shadowStore = new ShadowStore();
43        $parser = new FakeSchemaParser();
44        $registry = new TableDefinitionRegistry();
45
46        foreach ($this->reflector->reflectAll() as $tableName => $createSql) {
47            $definition = $parser->parse($createSql);
48            if ($definition !== null) {
49                $registry->register($tableName, $definition);
50            }
51        }
52
53        $rewriter = new FakeSqlRewriter($shadowStore, $registry);
54
55        return new Session(
56            $rewriter,
57            $shadowStore,
58            new ResultSelectRunner(),
59            $config,
60            $connection,
61            registry: $registry,
62        );
63    }
64}
65