providesRequestsContainingAnInvalidParameter()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 36
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 36
rs 9.504
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DanBettles\Defence\Tests\Factory;
6
7
use DanBettles\Defence\Envelope;
8
use DanBettles\Defence\Factory\FilterFactory;
9
use DanBettles\Defence\Filter\InvalidParameterFilter;
10
use DanBettles\Defence\Logger\NullLogger;
11
use DanBettles\Defence\Tests\AbstractTestCase;
12
use Psr\Log\LogLevel;
13
use Symfony\Component\HttpFoundation\Request;
14
15
use const false;
16
use const null;
17
use const true;
18
19
/**
20
 * @phpstan-import-type Selector from InvalidParameterFilter
21
 */
22
class Createinvalidiso8601dateparameterfilterTest extends AbstractTestCase
23
{
24
    /** @return array<mixed[]> */
25
    public function providesFactoryMethodArgs(): array
26
    {
27
        return [[
28
            'selector' => ['starts_on', 'ends_on'],
29
            'validator' => '/^(\d{4}-\d{2}-\d{2}|)$/',
30
        ], [
31
            'selector' => '/_on$/',
32
            'validator' => '/^(\d{4}-\d{2}-\d{2}|)$/',
33
        ]];
34
    }
35
36
    /**
37
     * @dataProvider providesFactoryMethodArgs
38
     * @phpstan-param Selector $selector
39
     */
40
    public function testFactoryMethodCreatesAnInvalidparameterfilter(
41
        $selector,
42
        string $validator
43
    ): void {
44
        $filter = (new FilterFactory())->createInvalidIso8601DateParameterFilter($selector);
45
46
        $this->assertInstanceOf(InvalidParameterFilter::class, $filter);
47
        $this->assertSame($selector, $filter->getSelector());
48
        $this->assertSame($validator, $filter->getValidator());
49
    }
50
51
    public function testFactoryMethodAcceptsOptions(): void
52
    {
53
        $filter = (new FilterFactory())->createInvalidIso8601DateParameterFilter(['starts_on'], [
54
            'foo' => 'bar',
55
        ]);
56
57
        $this->assertSame([
58
            'log_level' => LogLevel::WARNING,
59
            'type' => null,
60
            'foo' => 'bar',
61
        ], $filter->getOptions());
62
    }
63
64
    /** @return array<mixed[]> */
65
    public function providesRequestsContainingAnInvalidParameter(): array
66
    {
67
        $requestFactory = $this->getRequestFactory();
68
69
        return [[
70
            false,
71
            ['starts_on'],
72
            $requestFactory->createGet(['starts_on' => '2020-03-12']),
73
        ], [
74
            false,
75
            ['starts_on'],
76
            $requestFactory->createGet(['starts_on' => '0000-00-00']),
77
        ], [
78
            false,
79
            ['starts_on'],
80
            $requestFactory->createGet(['starts_on' => '']),
81
        ], [
82
            true,
83
            ['starts_on'],
84
            $requestFactory->createGet(['starts_on' => "71094'A=0"]),
85
        ], [
86
            true,
87
            ['starts_on'],
88
            $requestFactory->createGet(['starts_on' => "'"]),
89
        ], [
90
            true,
91
            ['starts_on'],
92
            $requestFactory->createGet(['starts_on' => '12-03-2020']),
93
        ], [
94
            true,
95
            ['starts_on'],
96
            $requestFactory->createGet(['starts_on' => ' 2020-03-12 ']),
97
        ], [
98
            true,
99
            ['starts_on'],
100
            $requestFactory->createGet(['starts_on' => ' ']),
101
        ]];
102
    }
103
104
    /**
105
     * @dataProvider providesRequestsContainingAnInvalidParameter
106
     * @phpstan-param Selector $selector
107
     */
108
    public function testInvokeReturnsTrueIfTheValueOfAParameterIsInvalid(
109
        bool $requestIsSuspicious,
110
        $selector,
111
        Request $request
112
    ): void {
113
        $filter = (new FilterFactory())->createInvalidIso8601DateParameterFilter($selector);
114
        $envelope = new Envelope($request, new NullLogger());
115
116
        $this->assertSame($requestIsSuspicious, $filter($envelope));
117
    }
118
}
119