Passed
Push — main ( d1c8bb...2cd0ba )
by Daniel
12:40
created

testIsAnAbstractfilter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
rs 10
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\Filter;
6
7
use Symfony\Component\HttpFoundation\Request;
8
use DanBettles\Defence\Filter\SuspiciousUserAgentHeaderFilter;
9
use DanBettles\Defence\Filter\AbstractFilter;
10
use DanBettles\Defence\Logger\NullLogger;
11
use DanBettles\Defence\Envelope;
12
use DanBettles\Defence\Tests\AbstractTestCase;
13
14
use const false;
15
use const true;
16
17
class SuspiciousUserAgentHeaderFilterTest extends AbstractTestCase
18
{
19
    public function testIsAFilter(): void
20
    {
21
        $this->assertSubclassOf(AbstractFilter::class, SuspiciousUserAgentHeaderFilter::class);
22
    }
23
24
    /** @return array<mixed[]> */
25
    public function providesRequestsWithSuspiciousUserAgentHeader(): array
26
    {
27
        $requestFactory = $this->getRequestFactory();
28
29
        return [[
30
            true,
31
            $requestFactory->createWithHeaders(['User-Agent' => '']),
32
        ], [
33
            false,
34
            $requestFactory->createWithHeaders(['User-Agent' => 'Something']),
35
        ], [
36
            true,
37
            $requestFactory->createWithHeaders(['user-agent' => '']),
38
        ], [
39
            false,
40
            $requestFactory->createWithHeaders(['user-agent' => 'Something']),
41
        ], [
42
            true,
43
            $requestFactory->createWithHeaders(['user-agent' => ' ']),
44
        ], [
45
            true,
46
            $requestFactory->createWithHeaders(['user-agent' => '   ']),  //Much whitespace.
47
        ], [
48
            true,
49
            Request::createFromGlobals(),  //No `User-Agent` header at all.
50
        ], [
51
            true,
52
            $requestFactory->createWithHeaders(['User-Agent' => '-']),
53
        ], [
54
            true,
55
            $requestFactory->createWithHeaders(['User-Agent' => ' - ']),
56
        ]];
57
    }
58
59
    /** @dataProvider providesRequestsWithSuspiciousUserAgentHeader */
60
    public function testInvokeReturnsTrueIfTheUserAgentHeaderIsSuspicious(bool $expected, Request $request): void
61
    {
62
        $envelope = new Envelope($request, new NullLogger());
63
        $filter = new SuspiciousUserAgentHeaderFilter();
64
65
        $this->assertSame($expected, $filter($envelope));
66
    }
67
68
    public function testInvokeWillAddALogEntryIfTheRequestIsSuspicious(): void
69
    {
70
        $completeEnvelope = new Envelope(
71
            $this->getRequestFactory()->createWithHeaders(['User-Agent' => '']),  // Existent, but blank, UA header
72
            new NullLogger()
73
        );
74
75
        $filterMock = $this
76
            ->getMockBuilder(SuspiciousUserAgentHeaderFilter::class)
77
            ->onlyMethods(['envelopeAddLogEntry'])
78
            ->getMock()
79
        ;
80
81
        $filterMock
82
            ->expects($this->once())
83
            ->method('envelopeAddLogEntry')
84
            ->with($completeEnvelope, 'The request has a suspicious UA string.')
85
        ;
86
87
        $this->assertTrue($filterMock($completeEnvelope));
88
89
        $incompleteEnvelope = new Envelope(
90
            Request::createFromGlobals(),  //No UA header.
91
            new NullLogger()
92
        );
93
94
        $filterMock = $this
95
            ->getMockBuilder(SuspiciousUserAgentHeaderFilter::class)
96
            ->onlyMethods(['envelopeAddLogEntry'])
97
            ->getMock()
98
        ;
99
100
        $filterMock
101
            ->expects($this->once())
102
            ->method('envelopeAddLogEntry')
103
            ->with($incompleteEnvelope, 'The request has no UA string.')
104
        ;
105
106
        $this->assertTrue($filterMock($incompleteEnvelope));
107
    }
108
}
109