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