packages/requirements/tests/Unit/Model/TestReferenceTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Model;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\Small;
10use PHPUnit\Framework\Attributes\UsesClass;
11use PHPUnit\Framework\TestCase;
12use Requirements\Input\Fields;
13use Requirements\Input\InvalidInputException;
14use Requirements\Model\TestReference;
15
16#[CoversClass(TestReference::class)]
17#[UsesClass(Fields::class)]
18#[Small]
19final class TestReferenceTest extends TestCase
20{
21    public function testFromReadsRunnerAndTarget(): void
22    {
23        $reference = TestReference::from(['runner' => 'unit', 'target' => 'Sample\PassingTest::testPass']);
24        self::assertSame('unit', $reference->runner);
25        self::assertSame('auto', $reference->run);
26        self::assertSame('Sample\PassingTest::testPass', $reference->target);
27    }
28
29    #[DataProvider('providerFromRejectsInvalidEntries')]
30    public function testFromRejectsInvalidEntries(mixed $value, string $message): void
31    {
32        $this->expectException(InvalidInputException::class);
33        $this->expectExceptionMessage($message);
34        TestReference::from($value);
35    }
36
37    /**
38     * @return array<string, array{mixed, string}>
39     */
40    public static function providerFromRejectsInvalidEntries(): array
41    {
42        return [
43            'not a mapping' => ['unit', 'test must be a mapping.'],
44            'unknown field' => [['runner' => 'unit', 'target' => 't', 'name' => 'n'], "test: unknown field 'name'."],
45            'unknown policy' => [['runner' => 'unit', 'target' => 't', 'run' => 'never'], 'Test run must be auto or manual.'],
46            'boolean policy' => [['runner' => 'unit', 'target' => 't', 'run' => false], 'run must be a nonempty string.'],
47            'missing runner' => [['target' => 't'], 'runner must be a nonempty string.'],
48            'missing target' => [['runner' => 'unit'], 'target must be a nonempty string.'],
49        ];
50    }
51    public function testFromRetainsManualExecutionPolicy(): void
52    {
53        self::assertSame('manual', TestReference::from(['runner' => 'unit', 'target' => 'slow', 'run' => 'manual'])->run);
54    }
55}
56