packages/deriver/tests/Unit/Configuration/ConfigurationTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Configuration;
6
7use Deriver\Configuration\Configuration;
8use Deriver\Configuration\Environment;
9use Deriver\Configuration\ReportFormat;
10use Deriver\Exception\ConfigurationException;
11use PHPUnit\Framework\Attributes\CoversClass;
12use PHPUnit\Framework\Attributes\DataProvider;
13use PHPUnit\Framework\Attributes\UsesClass;
14use PHPUnit\Framework\TestCase;
15
16#[CoversClass(Configuration::class)]
17#[UsesClass(Environment::class)]
18final class ConfigurationTest extends TestCase
19{
20 public function testFromArrayKeepsDefaultsIndependentOfAnalysis(): void
21 {
22 $configuration = Configuration::fromArray([]);
23 self::assertSame(['.'], $configuration->paths);
24 self::assertSame(['**/*.php'], $configuration->include);
25 self::assertSame([], $configuration->exclude);
26 self::assertNull($configuration->phpVersion);
27 self::assertSame(ReportFormat::Text, $configuration->format);
28 }
29
30 public function testFromArrayAcceptsExplicitLanguageAndEnvironmentSettings(): void
31 {
32 $configuration = Configuration::fromArray(['paths' => ['app', 'lib'], 'include' => ['*.php'], 'exclude' => ['Generated'], 'phpVersion' => '8.4', 'floatPrecision' => -1, 'environment' => ['APP_ENV' => 'test', '$_GET' => ['page' => 2]], 'standardEvaluators' => false, 'format' => 'json']);
33 self::assertSame(['app', 'lib'], $configuration->paths);
34 self::assertSame('8.4', $configuration->phpVersion);
35 self::assertSame(-1, $configuration->floatPrecision);
36 self::assertSame(['APP_ENV' => 'test', '$_GET' => ['page' => 2]], $configuration->environment);
37 self::assertFalse($configuration->standardEvaluators);
38 self::assertSame(ReportFormat::Json, $configuration->format);
39 }
40
41 /**
42 * @param array<string, mixed> $settings
43 */
44 #[DataProvider('providerInvalidSettings')]
45 public function testFromArrayRejectsInvalidSettings(array $settings): void
46 {
47 $this->expectException(ConfigurationException::class);
48 Configuration::fromArray($settings);
49 }
50
51 /**
52 * @return array<string, array{array<string, mixed>}>
53 */
54 public static function providerInvalidSettings(): array
55 {
56 return [
57 'unknown key' => [['includes' => ['*.php']]],
58 'scalar roots' => [['paths' => 'src']],
59 'mapping roots' => [['paths' => ['root' => 'src']]],
60 'no roots' => [['paths' => []]],
61 'no includes' => [['include' => []]],
62 'empty pattern' => [['exclude' => ['']]],
63 'null byte' => [['include' => ["a\0b"]]],
64 'wrong pattern type' => [['include' => [42]]],
65 'numeric version' => [['phpVersion' => 8.4]],
66 'version patch' => [['phpVersion' => '8.4.1']],
67 'integer width' => [['integerBits' => 32]],
68 'precision type' => [['floatPrecision' => '14']],
69 'precision range' => [['floatPrecision' => -2]],
70 'boolean type' => [['standardEvaluators' => 'false']],
71 'environment type' => [['environment' => 'test']],
72 'format type' => [['format' => 1]],
73 'unknown format' => [['format' => 'xml']],
74 ];
75 }
76}
77