packages/sql-fixture/tests/Unit/Platform/Sqlite/Value/ColumnGeneratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\Sqlite\Value;
6
7use Faker\Factory;
8use PHPUnit\Framework\Attributes\CoversClass;
9use PHPUnit\Framework\TestCase;
10use SqlFixture\Platform\Sqlite\Value\ColumnGenerator as Subject;
11use SqlFixture\Schema\ColumnDefinition;
12
13#[CoversClass(Subject::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Value\TypeAffinity::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(ColumnDefinition::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\ParagraphGenerator::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\IntegerRange::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\IntegerWidth::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\TypeMapper\DecimalRange::class)]
20final class ColumnGeneratorTest extends TestCase
21{
22    public function testGenerateValueRespectsStringLength(): void
23    {
24        $faker = Factory::create();
25        $faker->seed(42);
26        $value = (new Subject())->generateValue($faker, new ColumnDefinition('code', 'VARCHAR', length: 12));
27        self::assertIsString($value);
28        self::assertLessThanOrEqual(12, strlen($value));
29        self::assertNotSame('', $value);
30    }
31
32    public function testGenerateIntegerRespectsNumericDomain(): void
33    {
34        $faker = Factory::create();
35        $faker->seed(42);
36        $value = (new Subject())->generateInteger($faker, new ColumnDefinition('amount', 'INTEGER', precision: 5, scale: 2));
37        self::assertGreaterThanOrEqual(-2147483648, $value);
38        self::assertLessThanOrEqual(2147483647, $value);
39    }
40
41    public function testGenerateRealRespectsNumericDomain(): void
42    {
43        $faker = Factory::create();
44        $faker->seed(42);
45        $value = (new Subject())->generateReal($faker, new ColumnDefinition('amount', 'DECIMAL', precision: 5, scale: 2));
46        self::assertGreaterThanOrEqual(-999.99, $value);
47        self::assertLessThanOrEqual(999.99, $value);
48    }
49
50    public function testGenerateNumericRespectsNumericDomain(): void
51    {
52        $faker = Factory::create();
53        $faker->seed(42);
54        $value = (new Subject())->generateNumeric($faker, new ColumnDefinition('amount', 'DECIMAL', precision: 5, scale: 2));
55        self::assertIsNumeric($value);
56        self::assertGreaterThanOrEqual(-999.99, $value);
57        self::assertLessThanOrEqual(999.99, $value);
58    }
59
60    public function testGenerateDecimalRespectsNumericDomain(): void
61    {
62        $faker = Factory::create();
63        $faker->seed(42);
64        $value = (new Subject())->generateDecimal($faker, new ColumnDefinition('amount', 'DECIMAL', precision: 5, scale: 2));
65        self::assertGreaterThanOrEqual(-999.99, $value);
66        self::assertLessThanOrEqual(999.99, $value);
67    }
68
69    public function testGenerateTextReturnsDeclaredLength(): void
70    {
71        $faker = Factory::create();
72        $value = (new Subject())->generateText($faker, new ColumnDefinition('value', 'TEXT', length: 10));
73        self::assertNotSame('', $value);
74        self::assertLessThanOrEqual(10, strlen($value));
75    }
76
77    public function testGenerateBlobReturnsDeclaredLength(): void
78    {
79        $faker = Factory::create();
80        $value = (new Subject())->generateBlob($faker, new ColumnDefinition('value', 'BLOB', length: 10));
81        self::assertNotSame('', $value);
82        self::assertLessThanOrEqual(10, strlen($value));
83    }
84    public function testGenerateDecimalProducesNonzeroFractionalValues(): void
85    {
86        $faker = Factory::create();
87        $column = new ColumnDefinition('ratio', 'DECIMAL', precision: 2, scale: 2, nullable: false);
88        $values = array_map(static function (int $seed) use ($faker, $column): float {
89            $faker->seed($seed);
90            return (new Subject())->generateDecimal($faker, $column);
91        }, range(1, 20));
92        self::assertGreaterThan(1, count(array_unique($values)));
93        self::assertGreaterThanOrEqual(-0.99, min($values));
94        self::assertLessThanOrEqual(0.99, max($values));
95    }
96}
97