packages/sql-fixture/tests/Unit/Platform/MySql/Value/StringGeneratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\MySql\Value;
6
7use Faker\Factory;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\MySql\Value\StringGenerator as Subject;
11use SqlFixture\Schema\ColumnDefinition;
12
13#[CoversClass(Subject::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(ColumnDefinition::class)]
15final class StringGeneratorTest extends TestCase
16{
17    public function testGenerateCharRespectsDeclaredLength(): void
18    {
19        $faker = Factory::create();
20        $faker->seed(42);
21        $value = (new Subject())->generateChar($faker, new ColumnDefinition('code', 'CHAR', length: 12));
22        self::assertNotSame('', $value);
23        self::assertLessThanOrEqual(12, strlen($value));
24    }
25
26    public function testGenerateVarcharRespectsDeclaredLength(): void
27    {
28        $faker = Factory::create();
29        $faker->seed(42);
30        $value = (new Subject())->generateVarchar($faker, new ColumnDefinition('code', 'VARCHAR', length: 12));
31        self::assertNotSame('', $value);
32        self::assertLessThanOrEqual(12, strlen($value));
33    }
34
35    public function testGenerateBinaryRespectsDeclaredLength(): void
36    {
37        $faker = Factory::create();
38        $faker->seed(42);
39        $value = (new Subject())->generateBinary($faker, new ColumnDefinition('code', 'BINARY', length: 12));
40        self::assertNotSame('', $value);
41        self::assertLessThanOrEqual(12, strlen($value));
42    }
43
44    public function testGenerateVarbinaryRespectsDeclaredLength(): void
45    {
46        $faker = Factory::create();
47        $faker->seed(42);
48        $value = (new Subject())->generateVarbinary($faker, new ColumnDefinition('code', 'VARBINARY', length: 12));
49        self::assertNotSame('', $value);
50        self::assertLessThanOrEqual(12, strlen($value));
51    }
52
53    public function testGenerateEnumChoosesADeclaredMember(): void
54    {
55        $generator = new Subject();
56        $faker = Factory::create();
57        self::assertContains($generator->generateEnum($faker, new ColumnDefinition('status', 'ENUM', enumValues: ['open', 'closed'])), ['open', 'closed']);
58        self::assertNull($generator->generateEnum($faker, new ColumnDefinition('status', 'ENUM')));
59    }
60
61    public function testGenerateSetChoosesOnlyDeclaredMembers(): void
62    {
63        $generator = new Subject();
64        $faker = Factory::create();
65        $value = $generator->generateSet($faker, new ColumnDefinition('flags', 'SET', enumValues: ['a', 'b', 'c']));
66        self::assertNotNull($value);
67        self::assertSame([], array_diff(explode(',', $value), ['a', 'b', 'c']));
68        self::assertNull($generator->generateSet($faker, new ColumnDefinition('flags', 'SET')));
69    }
70
71    #[\PHPUnit\Framework\Attributes\DataProvider('providerSeeds')]
72    public function testGenerateSetSupportsASingleMember(int $seed): void
73    {
74        $generator = new Subject();
75        $faker = Factory::create();
76        $column = new ColumnDefinition('status', 'SET', enumValues: ['active']);
77        $faker->seed($seed);
78        self::assertSame('active', $generator->generateSet($faker, $column));
79    }
80
81    #[\PHPUnit\Framework\Attributes\DataProvider('providerSeeds')]
82    public function testSingleByteBinaryColumnsProduceExactlyOneByte(int $seed): void
83    {
84        $generator = new Subject();
85        $faker = Factory::create();
86        $faker->seed($seed);
87        self::assertSame(1, strlen($generator->generateBinary($faker, new ColumnDefinition('value', 'BINARY', length: 1))));
88        self::assertSame(1, strlen($generator->generateVarbinary($faker, new ColumnDefinition('value', 'VARBINARY', length: 1))));
89    }
90
91    #[\PHPUnit\Framework\Attributes\DataProvider('providerShortVarchars')]
92    public function testGenerateVarcharSupportsColumnsShorterThanAFakerWord(int $length): void
93    {
94        $value = (new Subject())->generateVarchar(Factory::create(), new ColumnDefinition('code', 'VARCHAR', length: $length));
95        self::assertNotSame('', $value);
96        self::assertLessThanOrEqual($length, strlen($value));
97    }
98
99    public function testGenerateVarcharSupportsAZeroLengthColumn(): void
100    {
101        self::assertSame('', (new Subject())->generateVarchar(Factory::create(), new ColumnDefinition('code', 'VARCHAR', length: 0)));
102    }
103
104    /**
105     * @return list<array{int}>
106     */
107    public static function providerShortVarchars(): array
108    {
109        return [[1], [2], [3], [4]];
110    }
111    /**
112     * @return list<array{int}>
113     */
114    public static function providerSeeds(): array
115    {
116        return array_map(static fn (int $seed): array => [$seed], range(1, 16));
117    }
118}
119