Passed
Push — master ( 4b2c1a...a53d55 )
by Maximilian
02:53
created

testWrongSignatureCertChainUrl()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 22
c 1
b 0
f 0
dl 0
loc 27
rs 9.568
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MaxBeckers\AmazonAlexa\Test\Validation;
6
7
use GuzzleHttp\Client;
8
use MaxBeckers\AmazonAlexa\Exception\RequestInvalidSignatureException;
9
use MaxBeckers\AmazonAlexa\Exception\RequestInvalidTimestampException;
10
use MaxBeckers\AmazonAlexa\Request\Request;
11
use MaxBeckers\AmazonAlexa\Request\Request\Standard\IntentRequest;
12
use MaxBeckers\AmazonAlexa\Validation\RequestValidator;
13
use PHPUnit\Framework\TestCase;
14
use Psr\Http\Message\ResponseInterface;
15
use Psr\Http\Message\StreamInterface;
16
17
class RequestValidatorTest extends TestCase
18
{
19
    public function testInvalidRequestTime(): void
20
    {
21
        $requestValidator = new RequestValidator();
22
23
        $intentRequest = new IntentRequest();
24
        $intentRequest->type = 'test';
25
        $intentRequest->timestamp = new \DateTime('-1 hour');
26
        $request = new Request();
27
        $request->request = $intentRequest;
28
29
        $this->expectException(RequestInvalidTimestampException::class);
30
        $requestValidator->validate($request);
31
    }
32
33
    public function testInvalidSignatureCertChainUrl(): void
34
    {
35
        $requestValidator = new RequestValidator();
36
37
        $intentRequest = new IntentRequest();
38
        $intentRequest->type = 'test';
39
        $intentRequest->timestamp = new \DateTime();
40
        $request = new Request();
41
        $request->request = $intentRequest;
42
        $request->signatureCertChainUrl = 'wrong path';
43
        $request->signature = 'none';
44
45
        $this->expectException(RequestInvalidSignatureException::class);
46
        $requestValidator->validate($request);
47
    }
48
49
    public function testWrongSignatureCertChainUrl(): void
50
    {
51
        $client = $this->createMock(Client::class);
52
        $apiResponse = $this->createMock(ResponseInterface::class);
53
        $apiResponseBody = $this->createMock(StreamInterface::class);
54
        $requestValidator = new RequestValidator(RequestValidator::TIMESTAMP_VALID_TOLERANCE_SECONDS, $client);
55
56
        $client->method('request')
57
               ->willReturn($apiResponse);
58
        $apiResponse->method('getStatusCode')
59
                    ->willReturn(200);
60
        $apiResponse->method('getBody')
61
                    ->willReturn($apiResponseBody);
62
        $apiResponseBody->method('getContents')
63
                        ->willReturn('cert content');
64
65
        $intentRequest = new IntentRequest();
66
        $intentRequest->type = 'test';
67
        $intentRequest->timestamp = new \DateTime();
68
        $request = new Request();
69
        $request->request = $intentRequest;
70
        $request->signatureCertChainUrl = 'https://s3.amazonaws.com/echo.api/test.pem';
71
        $request->signature = 'none';
72
        $request->amazonRequestBody = '';
73
74
        $this->expectException(RequestInvalidSignatureException::class);
75
        $requestValidator->validate($request);
76
    }
77
78
    public function testWrongSignatureCertChainUrlCallError(): void
79
    {
80
        $client = $this->createMock(Client::class);
81
        $apiResponse = $this->createMock(ResponseInterface::class);
82
        $requestValidator = new RequestValidator(RequestValidator::TIMESTAMP_VALID_TOLERANCE_SECONDS, $client);
83
84
        $client->method('request')
85
               ->willReturn($apiResponse);
86
        $apiResponse->method('getStatusCode')
87
                    ->willReturn(400);
88
89
        $intentRequest = new IntentRequest();
90
        $intentRequest->type = 'test';
91
        $intentRequest->timestamp = new \DateTime();
92
        $request = new Request();
93
        $request->request = $intentRequest;
94
        $request->signatureCertChainUrl = 'https://s3.amazonaws.com/echo.api/test.pem';
95
        $request->signature = 'none';
96
        $request->amazonRequestBody = '';
97
98
        $this->expectException(RequestInvalidSignatureException::class);
99
        $requestValidator->validate($request);
100
    }
101
}
102