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