3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Tests\ConfigStorage
;
7 use PhpMyAdmin\ConfigStorage\Features\BookmarkFeature
;
8 use PhpMyAdmin\ConfigStorage\Features\BrowserTransformationFeature
;
9 use PhpMyAdmin\ConfigStorage\Features\CentralColumnsFeature
;
10 use PhpMyAdmin\ConfigStorage\Features\ColumnCommentsFeature
;
11 use PhpMyAdmin\ConfigStorage\Features\ConfigurableMenusFeature
;
12 use PhpMyAdmin\ConfigStorage\Features\DatabaseDesignerSettingsFeature
;
13 use PhpMyAdmin\ConfigStorage\Features\DisplayFeature
;
14 use PhpMyAdmin\ConfigStorage\Features\ExportTemplatesFeature
;
15 use PhpMyAdmin\ConfigStorage\Features\FavoriteTablesFeature
;
16 use PhpMyAdmin\ConfigStorage\Features\NavigationItemsHidingFeature
;
17 use PhpMyAdmin\ConfigStorage\Features\PdfFeature
;
18 use PhpMyAdmin\ConfigStorage\Features\RecentlyUsedTablesFeature
;
19 use PhpMyAdmin\ConfigStorage\Features\RelationFeature
;
20 use PhpMyAdmin\ConfigStorage\Features\SavedQueryByExampleSearchesFeature
;
21 use PhpMyAdmin\ConfigStorage\Features\SqlHistoryFeature
;
22 use PhpMyAdmin\ConfigStorage\Features\TrackingFeature
;
23 use PhpMyAdmin\ConfigStorage\Features\UiPreferencesFeature
;
24 use PhpMyAdmin\ConfigStorage\Features\UserPreferencesFeature
;
25 use PhpMyAdmin\ConfigStorage\RelationParameters
;
26 use PhpMyAdmin\Identifiers\DatabaseName
;
27 use PhpMyAdmin\Version
;
28 use PHPUnit\Framework\Attributes\CoversClass
;
29 use PHPUnit\Framework\Attributes\DataProvider
;
30 use PHPUnit\Framework\TestCase
;
32 #[CoversClass(RelationParameters::class)]
33 #[CoversClass(BookmarkFeature::class)]
34 #[CoversClass(BrowserTransformationFeature::class)]
35 #[CoversClass(CentralColumnsFeature::class)]
36 #[CoversClass(ColumnCommentsFeature::class)]
37 #[CoversClass(ConfigurableMenusFeature::class)]
38 #[CoversClass(DatabaseDesignerSettingsFeature::class)]
39 #[CoversClass(DisplayFeature::class)]
40 #[CoversClass(ExportTemplatesFeature::class)]
41 #[CoversClass(FavoriteTablesFeature::class)]
42 #[CoversClass(NavigationItemsHidingFeature::class)]
43 #[CoversClass(PdfFeature::class)]
44 #[CoversClass(RecentlyUsedTablesFeature::class)]
45 #[CoversClass(RelationFeature::class)]
46 #[CoversClass(SavedQueryByExampleSearchesFeature::class)]
47 #[CoversClass(SqlHistoryFeature::class)]
48 #[CoversClass(TrackingFeature::class)]
49 #[CoversClass(UiPreferencesFeature::class)]
50 #[CoversClass(UserPreferencesFeature::class)]
51 class RelationParametersTest
extends TestCase
53 public function testFeaturesWithTwoTables(): void
55 self
::assertNull(RelationParameters
::fromArray([
57 'pdf_pages' => 'pdf_pages',
58 'table_coords' => ' invalid ',
61 self
::assertNull(RelationParameters
::fromArray([
63 'pdf_pages' => ' invalid ',
64 'table_coords' => 'table_coords',
67 self
::assertNull(RelationParameters
::fromArray([
69 'relation' => 'relation',
70 'table_info' => ' invalid ',
71 'displaywork' => true,
73 self
::assertNull(RelationParameters
::fromArray([
75 'relation' => ' invalid ',
76 'table_info' => 'table_info',
77 'displaywork' => true,
79 self
::assertNull(RelationParameters
::fromArray([
81 'usergroups' => 'usergroups',
82 'users' => ' invalid ',
84 ])->configurableMenusFeature
);
85 self
::assertNull(RelationParameters
::fromArray([
87 'usergroups' => ' invalid ',
90 ])->configurableMenusFeature
);
93 public function testFeaturesWithSharedTable(): void
95 $relationParameters = RelationParameters
::fromArray([
97 'column_info' => 'column_info',
98 'relation' => 'relation',
99 'table_info' => 'table_info',
102 'displaywork' => true,
105 self
::assertNotNull($relationParameters->browserTransformationFeature
);
106 self
::assertNotNull($relationParameters->columnCommentsFeature
);
107 self
::assertNotNull($relationParameters->displayFeature
);
108 self
::assertNotNull($relationParameters->relationFeature
);
110 $relationParameters->browserTransformationFeature
->columnInfo
,
111 $relationParameters->columnCommentsFeature
->columnInfo
,
113 self
::assertSame($relationParameters->relationFeature
->relation
, $relationParameters->displayFeature
->relation
);
115 $relationParameters = RelationParameters
::fromArray([
117 'column_info' => 'column_info',
118 'relation' => 'relation',
119 'table_info' => 'table_info',
122 'displaywork' => true,
125 self
::assertNull($relationParameters->browserTransformationFeature
);
126 self
::assertNotNull($relationParameters->columnCommentsFeature
);
127 self
::assertNotNull($relationParameters->displayFeature
);
128 self
::assertNull($relationParameters->relationFeature
);
131 public function testFeaturesHaveSameDatabase(): void
133 $relationParameters = RelationParameters
::fromArray([
135 'bookmark' => 'bookmark',
136 'central_columns' => 'central_columns',
137 'column_info' => 'column_info',
138 'designer_settings' => 'designer_settings',
139 'export_templates' => 'export_templates',
140 'favorite' => 'favorite',
141 'history' => 'history',
142 'navigationhiding' => 'navigationhiding',
143 'pdf_pages' => 'pdf_pages',
144 'recent' => 'recent',
145 'relation' => 'relation',
146 'savedsearches' => 'savedsearches',
147 'table_coords' => 'table_coords',
148 'table_info' => 'table_info',
149 'table_uiprefs' => 'table_uiprefs',
150 'tracking' => 'tracking',
151 'userconfig' => 'userconfig',
152 'usergroups' => 'usergroups',
154 'bookmarkwork' => true,
156 'centralcolumnswork' => true,
159 'designersettingswork' => true,
160 'displaywork' => true,
161 'exporttemplateswork' => true,
162 'favoritework' => true,
165 'recentwork' => true,
167 'savedsearcheswork' => true,
168 'historywork' => true,
169 'trackingwork' => true,
170 'uiprefswork' => true,
171 'userconfigwork' => true,
173 self
::assertInstanceOf(DatabaseName
::class, $relationParameters->db
);
174 self
::assertSame('db', $relationParameters->db
->getName());
175 self
::assertNotNull($relationParameters->bookmarkFeature
);
176 self
::assertSame($relationParameters->db
, $relationParameters->bookmarkFeature
->database
);
177 self
::assertNotNull($relationParameters->browserTransformationFeature
);
178 self
::assertSame($relationParameters->db
, $relationParameters->browserTransformationFeature
->database
);
179 self
::assertNotNull($relationParameters->centralColumnsFeature
);
180 self
::assertSame($relationParameters->db
, $relationParameters->centralColumnsFeature
->database
);
181 self
::assertNotNull($relationParameters->columnCommentsFeature
);
182 self
::assertSame($relationParameters->db
, $relationParameters->columnCommentsFeature
->database
);
183 self
::assertNotNull($relationParameters->configurableMenusFeature
);
184 self
::assertSame($relationParameters->db
, $relationParameters->configurableMenusFeature
->database
);
185 self
::assertNotNull($relationParameters->databaseDesignerSettingsFeature
);
186 self
::assertSame($relationParameters->db
, $relationParameters->databaseDesignerSettingsFeature
->database
);
187 self
::assertNotNull($relationParameters->displayFeature
);
188 self
::assertSame($relationParameters->db
, $relationParameters->displayFeature
->database
);
189 self
::assertNotNull($relationParameters->exportTemplatesFeature
);
190 self
::assertSame($relationParameters->db
, $relationParameters->exportTemplatesFeature
->database
);
191 self
::assertNotNull($relationParameters->favoriteTablesFeature
);
192 self
::assertSame($relationParameters->db
, $relationParameters->favoriteTablesFeature
->database
);
193 self
::assertNotNull($relationParameters->navigationItemsHidingFeature
);
194 self
::assertSame($relationParameters->db
, $relationParameters->navigationItemsHidingFeature
->database
);
195 self
::assertNotNull($relationParameters->pdfFeature
);
196 self
::assertSame($relationParameters->db
, $relationParameters->pdfFeature
->database
);
197 self
::assertNotNull($relationParameters->recentlyUsedTablesFeature
);
198 self
::assertSame($relationParameters->db
, $relationParameters->recentlyUsedTablesFeature
->database
);
199 self
::assertNotNull($relationParameters->relationFeature
);
200 self
::assertSame($relationParameters->db
, $relationParameters->relationFeature
->database
);
201 self
::assertNotNull($relationParameters->savedQueryByExampleSearchesFeature
);
202 self
::assertSame($relationParameters->db
, $relationParameters->savedQueryByExampleSearchesFeature
->database
);
203 self
::assertNotNull($relationParameters->sqlHistoryFeature
);
204 self
::assertSame($relationParameters->db
, $relationParameters->sqlHistoryFeature
->database
);
205 self
::assertNotNull($relationParameters->trackingFeature
);
206 self
::assertSame($relationParameters->db
, $relationParameters->trackingFeature
->database
);
207 self
::assertNotNull($relationParameters->uiPreferencesFeature
);
208 self
::assertSame($relationParameters->db
, $relationParameters->uiPreferencesFeature
->database
);
209 self
::assertNotNull($relationParameters->userPreferencesFeature
);
210 self
::assertSame($relationParameters->db
, $relationParameters->userPreferencesFeature
->database
);
213 public function testHasAllFeatures(): void
217 'bookmark' => 'bookmark',
218 'central_columns' => 'central_columns',
219 'column_info' => 'column_info',
220 'designer_settings' => 'designer_settings',
221 'export_templates' => 'export_templates',
222 'favorite' => 'favorite',
223 'history' => 'history',
224 'navigationhiding' => 'navigationhiding',
225 'pdf_pages' => 'pdf_pages',
226 'recent' => 'recent',
227 'relation' => 'relation',
228 'savedsearches' => 'savedsearches',
229 'table_coords' => 'table_coords',
230 'table_info' => 'table_info',
231 'table_uiprefs' => 'table_uiprefs',
232 'tracking' => 'tracking',
233 'userconfig' => 'userconfig',
234 'usergroups' => 'usergroups',
236 'bookmarkwork' => true,
238 'centralcolumnswork' => true,
241 'designersettingswork' => true,
242 'displaywork' => true,
243 'exporttemplateswork' => true,
244 'favoritework' => true,
247 'recentwork' => true,
249 'savedsearcheswork' => true,
250 'historywork' => true,
251 'trackingwork' => true,
252 'uiprefswork' => true,
253 'userconfigwork' => true,
255 self
::assertFalse(RelationParameters
::fromArray([])->hasAllFeatures());
256 self
::assertTrue(RelationParameters
::fromArray($params)->hasAllFeatures());
257 $params['bookmarkwork'] = false;
258 self
::assertFalse(RelationParameters
::fromArray($params)->hasAllFeatures());
262 * @param mixed[] $params
263 * @param mixed[] $expected
265 #[DataProvider('providerForTestToArray')]
266 public function testToArray(array $params, array $expected): void
268 self
::assertSame($expected, RelationParameters
::fromArray($params)->toArray());
271 /** @return array<string, array<int, array<string, mixed>>> */
272 public static function providerForTestToArray(): array
275 'default values' => [
278 'version' => Version
::VERSION
,
282 'central_columns' => null,
283 'column_info' => null,
284 'designer_settings' => null,
285 'export_templates' => null,
288 'navigationhiding' => null,
292 'savedsearches' => null,
293 'table_coords' => null,
294 'table_info' => null,
295 'table_uiprefs' => null,
297 'userconfig' => null,
298 'usergroups' => null,
300 'bookmarkwork' => false,
302 'centralcolumnswork' => false,
304 'menuswork' => false,
305 'designersettingswork' => false,
306 'displaywork' => false,
307 'exporttemplateswork' => false,
308 'favoritework' => false,
311 'recentwork' => false,
313 'savedsearcheswork' => false,
314 'historywork' => false,
315 'trackingwork' => false,
316 'uiprefswork' => false,
317 'userconfigwork' => false,
321 'default values 2' => [
324 'displaywork' => false,
325 'bookmarkwork' => false,
329 'historywork' => false,
330 'recentwork' => false,
331 'favoritework' => false,
332 'uiprefswork' => false,
333 'trackingwork' => false,
334 'userconfigwork' => false,
335 'menuswork' => false,
337 'savedsearcheswork' => false,
338 'centralcolumnswork' => false,
339 'designersettingswork' => false,
340 'exporttemplateswork' => false,
345 'central_columns' => null,
346 'column_info' => null,
347 'designer_settings' => null,
348 'export_templates' => null,
351 'navigationhiding' => null,
355 'savedsearches' => null,
356 'table_coords' => null,
357 'table_info' => null,
358 'table_uiprefs' => null,
360 'userconfig' => null,
361 'usergroups' => null,
365 'version' => Version
::VERSION
,
369 'central_columns' => null,
370 'column_info' => null,
371 'designer_settings' => null,
372 'export_templates' => null,
375 'navigationhiding' => null,
379 'savedsearches' => null,
380 'table_coords' => null,
381 'table_info' => null,
382 'table_uiprefs' => null,
384 'userconfig' => null,
385 'usergroups' => null,
387 'bookmarkwork' => false,
389 'centralcolumnswork' => false,
391 'menuswork' => false,
392 'designersettingswork' => false,
393 'displaywork' => false,
394 'exporttemplateswork' => false,
395 'favoritework' => false,
398 'recentwork' => false,
400 'savedsearcheswork' => false,
401 'historywork' => false,
402 'trackingwork' => false,
403 'uiprefswork' => false,
404 'userconfigwork' => false,
411 'displaywork' => true,
412 'bookmarkwork' => true,
416 'historywork' => true,
417 'recentwork' => true,
418 'favoritework' => true,
419 'uiprefswork' => true,
420 'trackingwork' => true,
421 'userconfigwork' => true,
424 'savedsearcheswork' => true,
425 'centralcolumnswork' => true,
426 'designersettingswork' => true,
427 'exporttemplateswork' => true,
431 'bookmark' => 'bookmark',
432 'central_columns' => 'central_columns',
433 'column_info' => 'column_info',
434 'designer_settings' => 'designer_settings',
435 'export_templates' => 'export_templates',
436 'favorite' => 'favorite',
437 'history' => 'history',
438 'navigationhiding' => 'navigationhiding',
439 'pdf_pages' => 'pdf_pages',
440 'recent' => 'recent',
441 'relation' => 'relation',
442 'savedsearches' => 'savedsearches',
443 'table_coords' => 'table_coords',
444 'table_info' => 'table_info',
445 'table_uiprefs' => 'table_uiprefs',
446 'tracking' => 'tracking',
447 'userconfig' => 'userconfig',
448 'usergroups' => 'usergroups',
452 'version' => Version
::VERSION
,
455 'bookmark' => 'bookmark',
456 'central_columns' => 'central_columns',
457 'column_info' => 'column_info',
458 'designer_settings' => 'designer_settings',
459 'export_templates' => 'export_templates',
460 'favorite' => 'favorite',
461 'history' => 'history',
462 'navigationhiding' => 'navigationhiding',
463 'pdf_pages' => 'pdf_pages',
464 'recent' => 'recent',
465 'relation' => 'relation',
466 'savedsearches' => 'savedsearches',
467 'table_coords' => 'table_coords',
468 'table_info' => 'table_info',
469 'table_uiprefs' => 'table_uiprefs',
470 'tracking' => 'tracking',
471 'userconfig' => 'userconfig',
472 'usergroups' => 'usergroups',
474 'bookmarkwork' => true,
476 'centralcolumnswork' => true,
479 'designersettingswork' => true,
480 'displaywork' => true,
481 'exporttemplateswork' => true,
482 'favoritework' => true,
485 'recentwork' => true,
487 'savedsearcheswork' => true,
488 'historywork' => true,
489 'trackingwork' => true,
490 'uiprefswork' => true,
491 'userconfigwork' => true,
495 'valid values 2' => [
499 'column_info' => 'column_info',
500 'relation' => 'relation',
501 'table_info' => 'table_info',
503 'displaywork' => true,
508 'version' => Version
::VERSION
,
512 'central_columns' => null,
513 'column_info' => 'column_info',
514 'designer_settings' => null,
515 'export_templates' => null,
518 'navigationhiding' => null,
521 'relation' => 'relation',
522 'savedsearches' => null,
523 'table_coords' => null,
524 'table_info' => 'table_info',
525 'table_uiprefs' => null,
527 'userconfig' => null,
528 'usergroups' => null,
530 'bookmarkwork' => false,
532 'centralcolumnswork' => false,
534 'menuswork' => false,
535 'designersettingswork' => false,
536 'displaywork' => true,
537 'exporttemplateswork' => false,
538 'favoritework' => false,
541 'recentwork' => false,
543 'savedsearcheswork' => false,
544 'historywork' => false,
545 'trackingwork' => false,
546 'uiprefswork' => false,
547 'userconfigwork' => false,
551 'invalid values' => [
564 'userconfigwork' => 1,
567 'savedsearcheswork' => 1,
568 'centralcolumnswork' => 1,
569 'designersettingswork' => 1,
570 'exporttemplateswork' => 1,
575 'central_columns' => 1,
577 'designer_settings' => 1,
578 'export_templates' => 1,
581 'navigationhiding' => 1,
585 'savedsearches' => 1,
588 'table_uiprefs' => 1,
595 'version' => Version
::VERSION
,
599 'central_columns' => null,
600 'column_info' => null,
601 'designer_settings' => null,
602 'export_templates' => null,
605 'navigationhiding' => null,
609 'savedsearches' => null,
610 'table_coords' => null,
611 'table_info' => null,
612 'table_uiprefs' => null,
614 'userconfig' => null,
615 'usergroups' => null,
617 'bookmarkwork' => false,
619 'centralcolumnswork' => false,
621 'menuswork' => false,
622 'designersettingswork' => false,
623 'displaywork' => false,
624 'exporttemplateswork' => false,
625 'favoritework' => false,
628 'recentwork' => false,
630 'savedsearcheswork' => false,
631 'historywork' => false,
632 'trackingwork' => false,
633 'uiprefswork' => false,
634 'userconfigwork' => false,
638 'invalid values 2' => [
643 'central_columns' => '',
645 'designer_settings' => '',
646 'export_templates' => '',
649 'navigationhiding' => '',
653 'savedsearches' => '',
654 'table_coords' => '',
656 'table_uiprefs' => '',
663 'version' => Version
::VERSION
,
667 'central_columns' => null,
668 'column_info' => null,
669 'designer_settings' => null,
670 'export_templates' => null,
673 'navigationhiding' => null,
677 'savedsearches' => null,
678 'table_coords' => null,
679 'table_info' => null,
680 'table_uiprefs' => null,
682 'userconfig' => null,
683 'usergroups' => null,
685 'bookmarkwork' => false,
687 'centralcolumnswork' => false,
689 'menuswork' => false,
690 'designersettingswork' => false,
691 'displaywork' => false,
692 'exporttemplateswork' => false,
693 'favoritework' => false,
696 'recentwork' => false,
698 'savedsearcheswork' => false,
699 'historywork' => false,
700 'trackingwork' => false,
701 'uiprefswork' => false,
702 'userconfigwork' => false,
706 'invalid values 3' => [
707 ['user' => '', 'db' => 'db', 'bookmarkwork' => true, 'bookmark' => ' invalid name '],
709 'version' => Version
::VERSION
,
713 'central_columns' => null,
714 'column_info' => null,
715 'designer_settings' => null,
716 'export_templates' => null,
719 'navigationhiding' => null,
723 'savedsearches' => null,
724 'table_coords' => null,
725 'table_info' => null,
726 'table_uiprefs' => null,
728 'userconfig' => null,
729 'usergroups' => null,
731 'bookmarkwork' => false,
733 'centralcolumnswork' => false,
735 'menuswork' => false,
736 'designersettingswork' => false,
737 'displaywork' => false,
738 'exporttemplateswork' => false,
739 'favoritework' => false,
742 'recentwork' => false,
744 'savedsearcheswork' => false,
745 'historywork' => false,
746 'trackingwork' => false,
747 'uiprefswork' => false,
748 'userconfigwork' => false,
752 'invalid values 4' => [
753 ['user' => '', 'db' => ''],
755 'version' => Version
::VERSION
,
759 'central_columns' => null,
760 'column_info' => null,
761 'designer_settings' => null,
762 'export_templates' => null,
765 'navigationhiding' => null,
769 'savedsearches' => null,
770 'table_coords' => null,
771 'table_info' => null,
772 'table_uiprefs' => null,
774 'userconfig' => null,
775 'usergroups' => null,
777 'bookmarkwork' => false,
779 'centralcolumnswork' => false,
781 'menuswork' => false,
782 'designersettingswork' => false,
783 'displaywork' => false,
784 'exporttemplateswork' => false,
785 'favoritework' => false,
788 'recentwork' => false,
790 'savedsearcheswork' => false,
791 'historywork' => false,
792 'trackingwork' => false,
793 'uiprefswork' => false,
794 'userconfigwork' => false,