packages/ztd-query-core/tests/Unit/Rewrite/MultiRewritePlanTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Rewrite\MultiRewritePlan;
11use ZtdQuery\Rewrite\QueryKind;
12use ZtdQuery\Rewrite\RewritePlan;
13
14#[UsesClass(RewritePlan::class)]
15#[CoversClass(MultiRewritePlan::class)]
16final class MultiRewritePlanTest extends TestCase
17{
18    public function testPlansReturnsAllPlans(): void
19    {
20        $plan1 = new RewritePlan('SELECT * FROM users', QueryKind::READ);
21        $plan2 = new RewritePlan('INSERT INTO users (id) VALUES (1)', QueryKind::WRITE_SIMULATED);
22        $plans = [$plan1, $plan2];
23
24        $multiPlan = new MultiRewritePlan($plans);
25
26        self::assertSame($plans, $multiPlan->plans());
27    }
28
29    public function testCountReturnsNumberOfPlans(): void
30    {
31        $plans = [
32            new RewritePlan('SELECT 1', QueryKind::READ),
33            new RewritePlan('SELECT 2', QueryKind::READ),
34            new RewritePlan('SELECT 3', QueryKind::READ),
35        ];
36
37        $multiPlan = new MultiRewritePlan($plans);
38
39        self::assertSame(3, $multiPlan->count());
40    }
41
42    public function testCountReturnsZeroForEmptyPlans(): void
43    {
44        $multiPlan = new MultiRewritePlan([]);
45
46        self::assertSame(0, $multiPlan->count());
47    }
48
49    public function testFirstReturnsFirstPlan(): void
50    {
51        $plan1 = new RewritePlan('SELECT 1', QueryKind::READ);
52        $plan2 = new RewritePlan('SELECT 2', QueryKind::READ);
53
54        $multiPlan = new MultiRewritePlan([$plan1, $plan2]);
55
56        self::assertSame($plan1, $multiPlan->first());
57    }
58
59    public function testFirstReturnsNullForEmptyPlans(): void
60    {
61        $multiPlan = new MultiRewritePlan([]);
62
63        self::assertNull($multiPlan->first());
64    }
65
66    public function testGetReturnsPlanAtIndex(): void
67    {
68        $plan1 = new RewritePlan('SELECT 1', QueryKind::READ);
69        $plan2 = new RewritePlan('SELECT 2', QueryKind::READ);
70        $plan3 = new RewritePlan('SELECT 3', QueryKind::READ);
71
72        $multiPlan = new MultiRewritePlan([$plan1, $plan2, $plan3]);
73
74        self::assertSame($plan1, $multiPlan->get(0));
75        self::assertSame($plan2, $multiPlan->get(1));
76        self::assertSame($plan3, $multiPlan->get(2));
77    }
78
79    public function testGetReturnsNullForInvalidIndex(): void
80    {
81        $multiPlan = new MultiRewritePlan([
82            new RewritePlan('SELECT 1', QueryKind::READ),
83        ]);
84
85        self::assertNull($multiPlan->get(1));
86        self::assertNull($multiPlan->get(-1));
87        self::assertNull($multiPlan->get(100));
88    }
89
90    public function testGetReturnsNullForEmptyPlans(): void
91    {
92        $multiPlan = new MultiRewritePlan([]);
93
94        self::assertNull($multiPlan->get(0));
95    }
96}
97