Translated using Weblate (Portuguese)
[phpmyadmin.git] / tests / unit / TypesByDatabaseVersionTest.php
blobb20c4be4d96fd2cdc529dbbb560dac6277b3f519
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin\Tests;
7 use PhpMyAdmin\Dbal\DatabaseInterface;
8 use PhpMyAdmin\TypeClass;
9 use PhpMyAdmin\Types;
10 use PHPUnit\Framework\Attributes\CoversClass;
11 use PHPUnit\Framework\Attributes\DataProvider;
12 use PHPUnit\Framework\MockObject\Stub;
14 #[CoversClass(Types::class)]
15 class TypesByDatabaseVersionTest extends AbstractTestCase
17 private DatabaseInterface&Stub $dbiStub;
19 protected Types $object;
21 /**
22 * Sets up the fixture, for example, opens a network connection.
23 * This method is called before a test is executed.
25 protected function setUp(): void
27 parent::setUp();
29 $this->dbiStub = self::createStub(DatabaseInterface::class);
32 /**
33 * Tears down the fixture, for example, closes a network connection.
34 * This method is called after a test is executed.
36 protected function tearDown(): void
38 parent::tearDown();
40 unset($this->dbiStub);
41 unset($this->object);
44 /**
45 * @param string $database Database
46 * @param int $dbVersion Database Version
47 * @param TypeClass $class The class to get function list.
48 * @param array $includes Expected elements should contain in result
49 * @param array $excludes Expected elements should not contain in result
50 * @phpstan-param array<string> $includes
51 * @phpstan-param array<string> $excludes
53 #[DataProvider('providerFortTestGetFunctionsClass')]
54 public function testGetFunctionsClass(
55 string $database,
56 int $dbVersion,
57 TypeClass $class,
58 array $includes,
59 array $excludes,
60 ): void {
61 $this->createObject($database, $dbVersion);
63 $result = $this->object->getFunctionsClass($class);
65 foreach ($includes as $value) {
66 self::assertContains($value, $result);
69 if ($excludes === []) {
70 return;
73 foreach ($excludes as $value) {
74 self::assertNotContains($value, $result);
78 /**
79 * Data provider for testing function lists
81 * @psalm-return array<string, array{string, int, TypeClass, array<string>, array<string>}>
83 public static function providerFortTestGetFunctionsClass(): array
85 return [
86 'mysql 5.1.0 - CHAR - not support INET6 Converter' => [
87 'mysql',
88 50100,
89 TypeClass::Char,
90 // should contains
91 [],
92 // should not exist
93 [ 'INET6_NTOA' ],
95 'mysql 8.0.30 - CHAR - support INET6 Converter' => [
96 'mysql',
97 80030,
98 TypeClass::Char,
99 // should contains
100 [ 'INET6_NTOA' ],
101 // should not exist
104 'mariadb 5.1.0 - CHAR - not support INET6 Converter' => [
105 'mariadb',
106 50100,
107 TypeClass::Char,
108 // should contains
110 // should not exist
111 [ 'INET6_NTOA' ],
113 'mariadb 10.0.12 - CHAR - support INET6 Converter' => [
114 'mariadb',
115 100012,
116 TypeClass::Char,
117 // should contains
118 [ 'INET6_NTOA' ],
119 // should not exist
122 'mariadb 10.9.3 - CHAR - support INET6 Converter and UUID' => [
123 'mariadb',
124 100903,
125 TypeClass::Char,
126 // should contains
127 [ 'INET6_NTOA', 'UUID' ],
128 // should not exist
131 'mysql 5.1.0 - NUMBER - not support INET6 Converter' => [
132 'mysql',
133 50100,
134 TypeClass::Number,
135 // should contains
137 // should not exist
138 [ 'INET6_ATON' ],
140 'mysql 8.0.30 - NUMBER - support INET6 Converter' => [
141 'mysql',
142 80030,
143 TypeClass::Number,
144 // should contains
145 [ 'INET6_ATON' ],
146 // should not exist
149 'mariadb 5.1.0 - NUMBER - not support INET6 Converter' => [
150 'mariadb',
151 50100,
152 TypeClass::Number,
153 // should contains
155 // should not exist
156 [ 'INET6_ATON' ],
158 'mariadb 10.0.12 - NUMBER - support INET6 Converter' => [
159 'mariadb',
160 100012,
161 TypeClass::Number,
162 // should contains
163 [ 'INET6_ATON' ],
164 // should not exist
167 'mariadb 10.9.3 - NUMBER - support INET6 Converter and UUID' => [
168 'mariadb',
169 100903,
170 TypeClass::Number,
171 // should contains
172 [ 'INET6_ATON', 'UUID_SHORT' ],
173 // should not exist
176 'mysql 5.1.0 - SPATIAL - not support ST_Geometry' => [
177 'mysql',
178 50100,
179 TypeClass::Spatial,
180 // should contains
182 'GeomFromText',
183 'GeomFromWKB',
184 'GeomCollFromText',
185 'LineFromText',
186 'MLineFromText',
187 'PointFromText',
188 'MPointFromText',
189 'PolyFromText',
190 'MPolyFromText',
191 'GeomCollFromWKB',
192 'LineFromWKB',
193 'MLineFromWKB',
194 'PointFromWKB',
195 'MPointFromWKB',
196 'PolyFromWKB',
197 'MPolyFromWKB',
199 // should not exist
201 'ST_GeomFromText',
202 'ST_GeomFromWKB',
203 'ST_GeomCollFromText',
204 'ST_LineFromText',
205 'ST_MLineFromText',
206 'ST_PointFromText',
207 'ST_MPointFromText',
208 'ST_PolyFromText',
209 'ST_MPolyFromText',
210 'ST_GeomCollFromWKB',
211 'ST_LineFromWKB',
212 'ST_MLineFromWKB',
213 'ST_PointFromWKB',
214 'ST_MPointFromWKB',
215 'ST_PolyFromWKB',
216 'ST_MPolyFromWKB',
219 'mysql 8.0.30 - SPATIAL - support ST_Geometry' => [
220 'mysql',
221 80030,
222 TypeClass::Spatial,
223 // should contains
225 'ST_GeomFromText',
226 'ST_GeomFromWKB',
227 'ST_GeomCollFromText',
228 'ST_LineFromText',
229 'ST_MLineFromText',
230 'ST_PointFromText',
231 'ST_MPointFromText',
232 'ST_PolyFromText',
233 'ST_MPolyFromText',
234 'ST_GeomCollFromWKB',
235 'ST_LineFromWKB',
236 'ST_MLineFromWKB',
237 'ST_PointFromWKB',
238 'ST_MPointFromWKB',
239 'ST_PolyFromWKB',
240 'ST_MPolyFromWKB',
242 // should not exist
244 'GeomFromText',
245 'GeomFromWKB',
246 'GeomCollFromText',
247 'LineFromText',
248 'MLineFromText',
249 'PointFromText',
250 'MPointFromText',
251 'PolyFromText',
252 'MPolyFromText',
253 'GeomCollFromWKB',
254 'LineFromWKB',
255 'MLineFromWKB',
256 'PointFromWKB',
257 'MPointFromWKB',
258 'PolyFromWKB',
259 'MPolyFromWKB',
266 * Test for getAllFunctions
268 * @param string $database Database
269 * @param int $dbVersion Database Version
270 * @param array $includes Expected elements should contain in result
271 * @param array $excludes Expected elements should not contain in result
272 * @phpstan-param array<string> $includes
273 * @phpstan-param array<string> $excludes
275 #[DataProvider('providerFortTestGetAllFunctions')]
276 public function testGetAllFunctions(string $database, int $dbVersion, array $includes, array $excludes): void
278 $this->createObject($database, $dbVersion);
280 $result = $this->object->getAllFunctions();
282 foreach ($includes as $value) {
283 self::assertContains($value, $result);
286 if ($excludes === []) {
287 return;
290 foreach ($excludes as $value) {
291 self::assertNotContains($value, $result);
296 * Data provider for testing get all functions
298 * @psalm-return array<string, array{string, int, array<string>, array<string>}>
300 public static function providerFortTestGetAllFunctions(): array
302 return [
303 'mysql 5.1.0 - not support INET6_ATON, ST_Geometry' => [
304 'mysql',
305 50100,
307 'GeomFromText',
308 'GeomFromWKB',
309 'GeomCollFromText',
310 'LineFromText',
311 'MLineFromText',
312 'PointFromText',
313 'MPointFromText',
314 'PolyFromText',
315 'MPolyFromText',
316 'GeomCollFromWKB',
317 'LineFromWKB',
318 'MLineFromWKB',
319 'PointFromWKB',
320 'MPointFromWKB',
321 'PolyFromWKB',
322 'MPolyFromWKB',
325 'INET6_ATON',
326 'INET6_ATON',
327 'ST_GeomFromText',
328 'ST_GeomFromWKB',
329 'ST_GeomCollFromText',
330 'ST_LineFromText',
331 'ST_MLineFromText',
332 'ST_PointFromText',
333 'ST_MPointFromText',
334 'ST_PolyFromText',
335 'ST_MPolyFromText',
336 'ST_GeomCollFromWKB',
337 'ST_LineFromWKB',
338 'ST_MLineFromWKB',
339 'ST_PointFromWKB',
340 'ST_MPointFromWKB',
341 'ST_PolyFromWKB',
342 'ST_MPolyFromWKB',
345 'mysql 8.0.30 - support INET6_ATON and ST_Geometry' => [
346 'mysql',
347 80030,
349 'INET6_ATON',
350 'INET6_ATON',
351 'ST_GeomFromText',
352 'ST_GeomFromWKB',
353 'ST_GeomCollFromText',
354 'ST_LineFromText',
355 'ST_MLineFromText',
356 'ST_PointFromText',
357 'ST_MPointFromText',
358 'ST_PolyFromText',
359 'ST_MPolyFromText',
360 'ST_GeomCollFromWKB',
361 'ST_LineFromWKB',
362 'ST_MLineFromWKB',
363 'ST_PointFromWKB',
364 'ST_MPointFromWKB',
365 'ST_PolyFromWKB',
366 'ST_MPolyFromWKB',
367 'UUID',
368 'UUID_SHORT',
371 'GeomFromText',
372 'GeomFromWKB',
373 'GeomCollFromText',
374 'LineFromText',
375 'MLineFromText',
376 'PointFromText',
377 'MPointFromText',
378 'PolyFromText',
379 'MPolyFromText',
380 'GeomCollFromWKB',
381 'LineFromWKB',
382 'MLineFromWKB',
383 'PointFromWKB',
384 'MPointFromWKB',
385 'PolyFromWKB',
386 'MPolyFromWKB',
389 'mariadb 5.1.0 - not support INET6_ATON and ST_Geometry' => [
390 'mariadb',
391 50100,
393 'GeomFromText',
394 'GeomFromWKB',
395 'GeomCollFromText',
396 'LineFromText',
397 'MLineFromText',
398 'PointFromText',
399 'MPointFromText',
400 'PolyFromText',
401 'MPolyFromText',
402 'GeomCollFromWKB',
403 'LineFromWKB',
404 'MLineFromWKB',
405 'PointFromWKB',
406 'MPointFromWKB',
407 'PolyFromWKB',
408 'MPolyFromWKB',
409 'UUID',
410 'UUID_SHORT',
413 'INET6_ATON',
414 'INET6_ATON',
415 'ST_GeomFromText',
416 'ST_GeomFromWKB',
417 'ST_GeomCollFromText',
418 'ST_LineFromText',
419 'ST_MLineFromText',
420 'ST_PointFromText',
421 'ST_MPointFromText',
422 'ST_PolyFromText',
423 'ST_MPolyFromText',
424 'ST_GeomCollFromWKB',
425 'ST_LineFromWKB',
426 'ST_MLineFromWKB',
427 'ST_PointFromWKB',
428 'ST_MPointFromWKB',
429 'ST_PolyFromWKB',
430 'ST_MPolyFromWKB',
433 'mariadb 10.6.0 - support INET6_ATON and ST_Geometry' => [
434 'mariadb',
435 100600,
437 'INET6_ATON',
438 'INET6_ATON',
439 'ST_GeomFromText',
440 'ST_GeomFromWKB',
441 'ST_GeomCollFromText',
442 'ST_LineFromText',
443 'ST_MLineFromText',
444 'ST_PointFromText',
445 'ST_MPointFromText',
446 'ST_PolyFromText',
447 'ST_MPolyFromText',
448 'ST_GeomCollFromWKB',
449 'ST_LineFromWKB',
450 'ST_MLineFromWKB',
451 'ST_PointFromWKB',
452 'ST_MPointFromWKB',
453 'ST_PolyFromWKB',
454 'ST_MPolyFromWKB',
455 'UUID',
456 'UUID_SHORT',
459 'GeomFromText',
460 'GeomFromWKB',
461 'GeomCollFromText',
462 'LineFromText',
463 'MLineFromText',
464 'PointFromText',
465 'MPointFromText',
466 'PolyFromText',
467 'MPolyFromText',
468 'GeomCollFromWKB',
469 'LineFromWKB',
470 'MLineFromWKB',
471 'PointFromWKB',
472 'MPointFromWKB',
473 'PolyFromWKB',
474 'MPolyFromWKB',
477 'mariadb 10.9.3 - support INET6_ATON, ST_Geometry and UUID' => [
478 'mariadb',
479 100903,
481 'INET6_ATON',
482 'INET6_ATON',
483 'ST_GeomFromText',
484 'ST_GeomFromWKB',
485 'ST_GeomCollFromText',
486 'ST_LineFromText',
487 'ST_MLineFromText',
488 'ST_PointFromText',
489 'ST_MPointFromText',
490 'ST_PolyFromText',
491 'ST_MPolyFromText',
492 'ST_GeomCollFromWKB',
493 'ST_LineFromWKB',
494 'ST_MLineFromWKB',
495 'ST_PointFromWKB',
496 'ST_MPointFromWKB',
497 'ST_PolyFromWKB',
498 'ST_MPolyFromWKB',
499 'UUID',
500 'UUID_SHORT',
503 'GeomFromText',
504 'GeomFromWKB',
505 'GeomCollFromText',
506 'LineFromText',
507 'MLineFromText',
508 'PointFromText',
509 'MPointFromText',
510 'PolyFromText',
511 'MPolyFromText',
512 'GeomCollFromWKB',
513 'LineFromWKB',
514 'MLineFromWKB',
515 'PointFromWKB',
516 'MPointFromWKB',
517 'PolyFromWKB',
518 'MPolyFromWKB',
525 * Test for getColumns
527 * @param string $database Database
528 * @param int $dbVersion Database Version
529 * @param array $expected Expected Result
530 * @phpstan-param array<int|string, array<int, string>|string> $expected
532 #[DataProvider('providerFortTestGetColumns')]
533 public function testGetColumns(string $database, int $dbVersion, array $expected): void
535 $this->createObject($database, $dbVersion);
537 self::assertSame($expected, $this->object->getColumns());
541 * Data provider for testing test columns
543 * @psalm-return array<string, array{string, int, array<int|string, array<int, string>|string>}>
545 public static function providerFortTestGetColumns(): array
547 return [
548 'mysql 5.1.0 - not support INET6, JSON and UUID' => [
549 'mysql',
550 50100,
552 0 => 'INT',
553 1 => 'VARCHAR',
554 2 => 'TEXT',
555 3 => 'DATE',
556 'Numeric' => [
557 'TINYINT',
558 'SMALLINT',
559 'MEDIUMINT',
560 'INT',
561 'BIGINT',
562 '-',
563 'DECIMAL',
564 'FLOAT',
565 'DOUBLE',
566 'REAL',
567 '-',
568 'BIT',
569 'BOOLEAN',
570 'SERIAL',
572 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
573 'String' => [
574 'CHAR',
575 'VARCHAR',
576 '-',
577 'TINYTEXT',
578 'TEXT',
579 'MEDIUMTEXT',
580 'LONGTEXT',
581 '-',
582 'BINARY',
583 'VARBINARY',
584 '-',
585 'TINYBLOB',
586 'BLOB',
587 'MEDIUMBLOB',
588 'LONGBLOB',
589 '-',
590 'ENUM',
591 'SET',
593 'Spatial' => [
594 'GEOMETRY',
595 'POINT',
596 'LINESTRING',
597 'POLYGON',
598 'MULTIPOINT',
599 'MULTILINESTRING',
600 'MULTIPOLYGON',
601 'GEOMETRYCOLLECTION',
605 'mysql 8.0.30 - support JSON but not support INET6 and UUID' => [
606 'mysql',
607 80030,
609 0 => 'INT',
610 1 => 'VARCHAR',
611 2 => 'TEXT',
612 3 => 'DATE',
613 'Numeric' => [
614 'TINYINT',
615 'SMALLINT',
616 'MEDIUMINT',
617 'INT',
618 'BIGINT',
619 '-',
620 'DECIMAL',
621 'FLOAT',
622 'DOUBLE',
623 'REAL',
624 '-',
625 'BIT',
626 'BOOLEAN',
627 'SERIAL',
629 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
630 'String' => [
631 'CHAR',
632 'VARCHAR',
633 '-',
634 'TINYTEXT',
635 'TEXT',
636 'MEDIUMTEXT',
637 'LONGTEXT',
638 '-',
639 'BINARY',
640 'VARBINARY',
641 '-',
642 'TINYBLOB',
643 'BLOB',
644 'MEDIUMBLOB',
645 'LONGBLOB',
646 '-',
647 'ENUM',
648 'SET',
650 'Spatial' => [
651 'GEOMETRY',
652 'POINT',
653 'LINESTRING',
654 'POLYGON',
655 'MULTIPOINT',
656 'MULTILINESTRING',
657 'MULTIPOLYGON',
658 'GEOMETRYCOLLECTION',
660 'JSON' => ['JSON'],
663 'mariadb 5.1.0 - not support INET6, JSON and UUID' => [
664 'mariadb',
665 50100,
667 0 => 'INT',
668 1 => 'VARCHAR',
669 2 => 'TEXT',
670 3 => 'DATE',
671 'Numeric' => [
672 'TINYINT',
673 'SMALLINT',
674 'MEDIUMINT',
675 'INT',
676 'BIGINT',
677 '-',
678 'DECIMAL',
679 'FLOAT',
680 'DOUBLE',
681 'REAL',
682 '-',
683 'BIT',
684 'BOOLEAN',
685 'SERIAL',
687 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
688 'String' => [
689 'CHAR',
690 'VARCHAR',
691 '-',
692 'TINYTEXT',
693 'TEXT',
694 'MEDIUMTEXT',
695 'LONGTEXT',
696 '-',
697 'BINARY',
698 'VARBINARY',
699 '-',
700 'TINYBLOB',
701 'BLOB',
702 'MEDIUMBLOB',
703 'LONGBLOB',
704 '-',
705 'ENUM',
706 'SET',
708 'Spatial' => [
709 'GEOMETRY',
710 'POINT',
711 'LINESTRING',
712 'POLYGON',
713 'MULTIPOINT',
714 'MULTILINESTRING',
715 'MULTIPOLYGON',
716 'GEOMETRYCOLLECTION',
720 'mariadb 10.2.8 - support JSON but not support INET6 and UUID' => [
721 'mariadb',
722 100208,
724 0 => 'INT',
725 1 => 'VARCHAR',
726 2 => 'TEXT',
727 3 => 'DATE',
728 'Numeric' => [
729 'TINYINT',
730 'SMALLINT',
731 'MEDIUMINT',
732 'INT',
733 'BIGINT',
734 '-',
735 'DECIMAL',
736 'FLOAT',
737 'DOUBLE',
738 'REAL',
739 '-',
740 'BIT',
741 'BOOLEAN',
742 'SERIAL',
744 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
745 'String' => [
746 'CHAR',
747 'VARCHAR',
748 '-',
749 'TINYTEXT',
750 'TEXT',
751 'MEDIUMTEXT',
752 'LONGTEXT',
753 '-',
754 'BINARY',
755 'VARBINARY',
756 '-',
757 'TINYBLOB',
758 'BLOB',
759 'MEDIUMBLOB',
760 'LONGBLOB',
761 '-',
762 'ENUM',
763 'SET',
765 'Spatial' => [
766 'GEOMETRY',
767 'POINT',
768 'LINESTRING',
769 'POLYGON',
770 'MULTIPOINT',
771 'MULTILINESTRING',
772 'MULTIPOLYGON',
773 'GEOMETRYCOLLECTION',
775 'JSON' => [ 'JSON' ],
778 'mariadb 10.5.0 - support JSON and INET6 but not support UUID' => [
779 'mariadb',
780 100500,
782 0 => 'INT',
783 1 => 'VARCHAR',
784 2 => 'TEXT',
785 3 => 'DATE',
786 'Numeric' => [
787 'TINYINT',
788 'SMALLINT',
789 'MEDIUMINT',
790 'INT',
791 'BIGINT',
792 '-',
793 'DECIMAL',
794 'FLOAT',
795 'DOUBLE',
796 'REAL',
797 '-',
798 'BIT',
799 'BOOLEAN',
800 'SERIAL',
802 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
803 'String' => [
804 'CHAR',
805 'VARCHAR',
806 '-',
807 'TINYTEXT',
808 'TEXT',
809 'MEDIUMTEXT',
810 'LONGTEXT',
811 '-',
812 'BINARY',
813 'VARBINARY',
814 '-',
815 'TINYBLOB',
816 'BLOB',
817 'MEDIUMBLOB',
818 'LONGBLOB',
819 '-',
820 'ENUM',
821 'SET',
822 '-',
823 'INET6',
825 'Spatial' => [
826 'GEOMETRY',
827 'POINT',
828 'LINESTRING',
829 'POLYGON',
830 'MULTIPOINT',
831 'MULTILINESTRING',
832 'MULTIPOLYGON',
833 'GEOMETRYCOLLECTION',
835 'JSON' => [ 'JSON' ],
838 'mariadb 10.9.3 - support INET6, JSON and UUID' => [
839 'mariadb',
840 100903,
842 0 => 'INT',
843 1 => 'VARCHAR',
844 2 => 'TEXT',
845 3 => 'DATE',
846 4 => 'UUID',
847 'Numeric' => [
848 'TINYINT',
849 'SMALLINT',
850 'MEDIUMINT',
851 'INT',
852 'BIGINT',
853 '-',
854 'DECIMAL',
855 'FLOAT',
856 'DOUBLE',
857 'REAL',
858 '-',
859 'BIT',
860 'BOOLEAN',
861 'SERIAL',
863 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
864 'String' => [
865 'CHAR',
866 'VARCHAR',
867 '-',
868 'TINYTEXT',
869 'TEXT',
870 'MEDIUMTEXT',
871 'LONGTEXT',
872 '-',
873 'BINARY',
874 'VARBINARY',
875 '-',
876 'TINYBLOB',
877 'BLOB',
878 'MEDIUMBLOB',
879 'LONGBLOB',
880 '-',
881 'ENUM',
882 'SET',
883 '-',
884 'INET6',
886 'Spatial' => [
887 'GEOMETRY',
888 'POINT',
889 'LINESTRING',
890 'POLYGON',
891 'MULTIPOINT',
892 'MULTILINESTRING',
893 'MULTIPOLYGON',
894 'GEOMETRYCOLLECTION',
896 'JSON' => [ 'JSON' ],
897 'UUID' => [ 'UUID' ],
904 * @param string $database Database
905 * @param int $version Database Version
907 private function createObject(string $database, int $version): void
909 $this->dbiStub->method('isMariaDB')->willReturn($database === 'mariadb');
910 $this->dbiStub->method('getVersion')->willReturn($version);
911 $this->object = new Types($this->dbiStub);