packages/sql-faker/tests/Unit/Grammar/Resource/SqlVersionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Grammar\Resource;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use RuntimeException;
11use SqlFaker\Grammar\Resource\SqlVersion;
12use SqlFaker\Grammar\Resource\SqlVersionRegistry;
13
14#[CoversClass(SqlVersion::class)]
15#[UsesClass(SqlVersionRegistry::class)]
16final class SqlVersionTest extends TestCase
17{
18 public function testResolveAnswersTheDefaultReleaseWithItsGrammar(): void
19 {
20 $version = SqlVersion::resolve('mysql');
21
22 self::assertSame('mysql', $version->dialect);
23 self::assertSame('mysql-8.4.7', $version->name);
24 self::assertTrue(is_file($version->astPath));
25 }
26
27 public function testAllEnumeratesEveryRegisteredRelease(): void
28 {
29 $versions = SqlVersion::all();
30
31 self::assertCount(11, $versions);
32 self::assertSame(
33 ['mysql-5.6.51', 'mysql-5.7.44', 'mysql-8.0.44'],
34 array_slice(array_map(static fn (SqlVersion $version): string => $version->name, $versions), 0, 3),
35 );
36 array_walk($versions, static function (SqlVersion $version): void {
37 self::assertTrue(is_file($version->astPath));
38 });
39 }
40
41 public function testNamesEnumeratesTheReleasesOfOneDialect(): void
42 {
43 self::assertSame([
44 'mysql-5.6.51',
45 'mysql-5.7.44',
46 'mysql-8.0.44',
47 'mysql-8.1.0',
48 'mysql-8.2.0',
49 'mysql-8.3.0',
50 'mysql-8.4.7',
51 'mysql-9.0.1',
52 'mysql-9.1.0',
53 ], SqlVersion::names('mysql'));
54 }
55
56 public function testNamesRejectsADialectThePackageDoesNotShip(): void
57 {
58 $this->expectException(RuntimeException::class);
59 $this->expectExceptionMessage('Unknown SQL dialect: unknown');
60
61 SqlVersion::names('unknown');
62 }
63
64 public function testResolveRejectsAReleaseThePackageDoesNotShip(): void
65 {
66 $this->expectException(RuntimeException::class);
67 $this->expectExceptionMessage('Unsupported mysql version');
68
69 SqlVersion::resolve('mysql', 'mysql-999.0.0');
70 }
71
72 public function testResolveRejectsADialectThePackageDoesNotShip(): void
73 {
74 $this->expectException(RuntimeException::class);
75 $this->expectExceptionMessage('Unknown SQL dialect');
76
77 SqlVersion::resolve('oracle');
78 }
79
80}
81