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