CreateinvalidnumericidparameterfilterTest   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 40
dl 0
loc 87
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A testFactoryMethodAcceptsOptions() 0 11 1
A testInvokeReturnsTrueIfTheValueOfAParameterIsInvalid() 0 9 1
A providesFactoryMethodArgs() 0 8 1
A providesRequestsContainingAnInvalidParameter() 0 28 1
A testFactoryMethodCreatesAnInvalidparameterfilter() 0 9 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace DanBettles\Defence\Tests\Factory;
6
7
use Psr\Log\LogLevel;
8
use DanBettles\Defence\Envelope;
9
use DanBettles\Defence\Factory\FilterFactory;
10
use DanBettles\Defence\Filter\InvalidParameterFilter;
11
use DanBettles\Defence\Logger\NullLogger;
12
use DanBettles\Defence\Tests\AbstractTestCase;
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 CreateinvalidnumericidparameterfilterTest extends AbstractTestCase
23
{
24
    /** @return array<mixed[]> */
25
    public function providesFactoryMethodArgs(): array
26
    {
27
        return [[
28
            'selector' => ['blog_id', 'post_id'],
29
            'validator' => '/^\d*$/',
30
        ], [
31
            'selector' => '/_id$/',
32
            'validator' => '/^\d*$/',
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())->createInvalidNumericIdParameterFilter($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())->createInvalidNumericIdParameterFilter(['id'], [
54
            'quux' => 'quz',
55
        ]);
56
57
        $this->assertSame([
58
            'log_level' => LogLevel::WARNING,
59
            'type' => null,
60
            'quux' => 'quz',
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
            ['post_id'],
72
            $requestFactory->createGet(['post_id' => '123']),
73
        ], [
74
            false,
75
            ['post_id'],
76
            $requestFactory->createGet(['post_id' => '0']),
77
        ], [
78
            false,
79
            ['post_id'],
80
            $requestFactory->createGet(['post_id' => '']),
81
        ], [
82
            true,
83
            ['post_id'],
84
            $requestFactory->createGet(['post_id' => "71094'A=0"]),
85
        ], [
86
            true,
87
            ['post_id'],
88
            $requestFactory->createGet(['post_id' => '-123']),
89
        ], [
90
            true,
91
            ['post_id'],
92
            $requestFactory->createGet(['post_id' => ' ']),
93
        ]];
94
    }
95
96
    /**
97
     * @dataProvider providesRequestsContainingAnInvalidParameter
98
     * @phpstan-param Selector $selector
99
     */
100
    public function testInvokeReturnsTrueIfTheValueOfAParameterIsInvalid(
101
        bool $requestIsSuspicious,
102
        $selector,
103
        Request $request
104
    ): void {
105
        $filter = (new FilterFactory())->createInvalidNumericIdParameterFilter($selector);
106
        $envelope = new Envelope($request, new NullLogger());
107
108
        $this->assertSame($requestIsSuspicious, $filter($envelope));
109
    }
110
}
111