packages/requirements/tests/Unit/Model/ExcerptTest.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\Excerpt;
15
16#[CoversClass(Excerpt::class)]
17#[UsesClass(Fields::class)]
18#[Small]
19final class ExcerptTest extends TestCase
20{
21    public function testFromReadsSelectorAndQuote(): void
22    {
23        $excerpt = Excerpt::from(['selector' => '#a', 'quote' => 'Names shall start with a letter.']);
24        self::assertSame('#a', $excerpt->selector);
25        self::assertSame('Names shall start with a letter.', $excerpt->quote);
26    }
27
28    #[DataProvider('providerFromRejectsInvalidEntries')]
29    public function testFromRejectsInvalidEntries(mixed $value, string $message): void
30    {
31        $this->expectException(InvalidInputException::class);
32        $this->expectExceptionMessage($message);
33        Excerpt::from($value);
34    }
35
36    /**
37     * @return array<string, array{mixed, string}>
38     */
39    public static function providerFromRejectsInvalidEntries(): array
40    {
41        return [
42            'not a mapping' => ['#a', 'evidence must be a mapping.'],
43            'unknown field' => [['selector' => '#a', 'quote' => 'q', 'note' => 'n'], "evidence: unknown field 'note'."],
44            'missing selector' => [['quote' => 'q'], 'selector must be a nonempty string.'],
45            'blank quote' => [['selector' => '#a', 'quote' => ' '], 'quote must be a nonempty string.'],
46        ];
47    }
48}
49