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

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\PostgreSql\Value;
6
7use Faker\Factory;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\PostgreSql\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    #[\PHPUnit\Framework\Attributes\DataProvider('providerShortVarchars')]
36    public function testGenerateVarcharSupportsColumnsShorterThanAFakerWord(int $length): void
37    {
38        $value = (new Subject())->generateVarchar(Factory::create(), new ColumnDefinition('code', 'VARCHAR', length: $length));
39        self::assertNotSame('', $value);
40        self::assertLessThanOrEqual($length, strlen($value));
41    }
42
43    public function testGenerateVarcharSupportsAZeroLengthColumn(): void
44    {
45        self::assertSame('', (new Subject())->generateVarchar(Factory::create(), new ColumnDefinition('code', 'VARCHAR', length: 0)));
46    }
47
48    /**
49     * @return list<array{int}>
50     */
51    public static function providerShortVarchars(): array
52    {
53        return [[1], [2], [3], [4]];
54    }
55}
56