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