Translated using Weblate (Portuguese)
[phpmyadmin.git] / tests / unit / Partitioning / TablePartitionDefinitionTest.php
blob95e80e43e62e117a5cce556e46bd25cf6d073511
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin\Tests\Partitioning;
7 use PhpMyAdmin\Partitioning\TablePartitionDefinition;
8 use PHPUnit\Framework\Attributes\CoversClass;
9 use PHPUnit\Framework\Attributes\DataProvider;
10 use PHPUnit\Framework\TestCase;
12 #[CoversClass(TablePartitionDefinition::class)]
13 class TablePartitionDefinitionTest extends TestCase
15 #[DataProvider('providerGetDetails')]
16 public function testGetDetails(
17 string $partitionBy,
18 bool $canHaveSubpartitions,
19 bool $valueEnabled,
20 int $partitionCount,
21 int $subPartitionCount,
22 array|null $partitions,
23 ): void {
24 $expected = [
25 'partition_by' => $partitionBy,
26 'partition_expr' => 'partition_expr',
27 'subpartition_by' => 'subpartition_by',
28 'subpartition_expr' => 'subpartition_expr',
29 'partition_count' => $partitionCount,
30 'subpartition_count' => $subPartitionCount,
31 'can_have_subpartitions' => $canHaveSubpartitions,
32 'value_enabled' => $valueEnabled,
33 'partitions' => [
35 'name' => 'part0',
36 'value_type' => '',
37 'value' => '',
38 'engine' => '',
39 'comment' => '',
40 'data_directory' => '',
41 'index_directory' => '',
42 'max_rows' => '',
43 'min_rows' => '',
44 'tablespace' => '',
45 'node_group' => '',
46 'prefix' => 'partitions[0]',
47 'subpartition_count' => 2,
48 'subpartitions' => [
50 'name' => 'part0_s0',
51 'engine' => '',
52 'comment' => '',
53 'data_directory' => '',
54 'index_directory' => '',
55 'max_rows' => '',
56 'min_rows' => '',
57 'tablespace' => '',
58 'node_group' => '',
59 'prefix' => 'partitions[0][subpartitions][0]',
62 'name' => 'part0_s1',
63 'engine' => '',
64 'comment' => '',
65 'data_directory' => '',
66 'index_directory' => '',
67 'max_rows' => '',
68 'min_rows' => '',
69 'tablespace' => '',
70 'node_group' => '',
71 'prefix' => 'partitions[0][subpartitions][1]',
76 'name' => 'p1',
77 'value_type' => '',
78 'value' => '',
79 'engine' => '',
80 'comment' => '',
81 'data_directory' => '',
82 'index_directory' => '',
83 'max_rows' => '',
84 'min_rows' => '',
85 'tablespace' => '',
86 'node_group' => '',
87 'prefix' => 'partitions[1]',
88 'subpartition_count' => 2,
89 'subpartitions' => [
91 'name' => 'p1_s0',
92 'engine' => '',
93 'comment' => '',
94 'data_directory' => '',
95 'index_directory' => '',
96 'max_rows' => '',
97 'min_rows' => '',
98 'tablespace' => '',
99 'node_group' => '',
100 'prefix' => 'partitions[1][subpartitions][0]',
103 'name' => 'p1_s1',
104 'engine' => '',
105 'comment' => '',
106 'data_directory' => '',
107 'index_directory' => '',
108 'max_rows' => '',
109 'min_rows' => '',
110 'tablespace' => '',
111 'node_group' => '',
112 'prefix' => 'partitions[1][subpartitions][1]',
119 if (! $canHaveSubpartitions && $partitionCount === 2) {
120 unset($expected['partitions'][0]['subpartition_count']);
121 unset($expected['partitions'][0]['subpartitions']);
122 unset($expected['partitions'][1]['subpartition_count']);
123 unset($expected['partitions'][1]['subpartitions']);
126 if ($partitionCount < 2) {
127 unset($expected['partitions']);
130 $_POST['partition_by'] = $partitionBy;
131 $_POST['partition_expr'] = 'partition_expr';
132 $_POST['subpartition_by'] = 'subpartition_by';
133 $_POST['subpartition_expr'] = 'subpartition_expr';
134 $_POST['partition_count'] = (string) $partitionCount;
135 $_POST['subpartition_count'] = (string) $subPartitionCount;
136 $_POST['partitions'] = $partitions;
137 $_POST['ignored_key'] = 'ignored_value';
139 $actual = TablePartitionDefinition::getDetails();
140 self::assertEquals($expected, $actual);
144 * @psalm-return array<string, array{
145 * 0: string, 1: bool, 2: bool, 3: int, 4: int, 5: array<string, string|array<string, string>[]>[]|null
146 * }>
148 public static function providerGetDetails(): array
150 return [
151 'partition by RANGE' => ['RANGE', true, true, 2, 2, [['name' => 'part0']]],
152 'partition by RANGE COLUMNS' => ['RANGE COLUMNS', true, true, 2, 2, [['name' => 'part0']]],
153 'partition by LIST' => ['LIST', true, true, 2, 2, [['name' => 'part0']]],
154 'partition by LIST COLUMNS' => ['LIST COLUMNS', true, true, 2, 2, [['name' => 'part0']]],
155 'partition by HASH' => ['HASH', false, false, 2, 2, [['name' => 'part0']]],
156 'partition count === 0' => ['RANGE', false, true, 0, 0, null],
157 'partition count === 1' => ['RANGE', false, true, 1, 1, null],
158 'more partitions than the partition count' => [
159 'RANGE',
160 true,
161 true,
164 [['name' => 'part0'], ['name' => 'p1'], ['name' => 'p2']],
166 'more subpartitions than the subpartition count' => [
167 'RANGE',
168 true,
169 true,
174 'name' => 'part0',
175 'subpartitions' => [
177 'name' => 'part0_s0',
178 'engine' => '',
179 'comment' => '',
180 'data_directory' => '',
181 'index_directory' => '',
182 'max_rows' => '',
183 'min_rows' => '',
184 'tablespace' => '',
185 'node_group' => '',
186 'prefix' => 'partitions[1][subpartitions][0]',
189 'name' => 'part0_s1',
190 'engine' => '',
191 'comment' => '',
192 'data_directory' => '',
193 'index_directory' => '',
194 'max_rows' => '',
195 'min_rows' => '',
196 'tablespace' => '',
197 'node_group' => '',
198 'prefix' => 'partitions[1][subpartitions][1]',
201 'name' => 'part0_s1',
202 'engine' => '',
203 'comment' => '',
204 'data_directory' => '',
205 'index_directory' => '',
206 'max_rows' => '',
207 'min_rows' => '',
208 'tablespace' => '',
209 'node_group' => '',
210 'prefix' => 'partitions[1][subpartitions][1]',
219 public function testGetDetailsWithoutPostValues(): void
221 $_POST = [];
222 $expected = [
223 'partition_by' => null,
224 'partition_expr' => null,
225 'subpartition_by' => null,
226 'subpartition_expr' => null,
227 'partition_count' => 0,
228 'subpartition_count' => 0,
229 'can_have_subpartitions' => false,
230 'value_enabled' => false,
233 $actual = TablePartitionDefinition::getDetails();
234 self::assertSame($expected, $actual);
237 #[DataProvider('providerGetDetailsWithMaxPartitions')]
238 public function testGetDetailsWithMaxPartitions(int $partitionCount, string $partitionCountFromPost): void
240 $_POST = ['partition_count' => $partitionCountFromPost];
241 $actual = TablePartitionDefinition::getDetails();
242 self::assertArrayHasKey('partition_count', $actual);
243 self::assertArrayHasKey('partitions', $actual);
244 self::assertSame($partitionCount, $actual['partition_count']);
245 self::assertIsArray($actual['partitions']);
246 self::assertCount($partitionCount, $actual['partitions']);
249 /** @psalm-return array{0: int, 1: string}[] */
250 public static function providerGetDetailsWithMaxPartitions(): array
252 return ['count within the limit' => [8192, '8192'], 'count above the limit' => [8192, '8193']];