Completed
Push — tests_improvements ( 8c6b99...667d50 )
by Vitaliy
04:19
created

ServerTest::testResponse()   B

Complexity

Conditions 4
Paths 8

Size

Total Lines 30
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 2 Features 0
Metric Value
c 4
b 2
f 0
dl 0
loc 30
rs 8.5806
cc 4
eloc 25
nc 8
nop 5
1
<?php
2
3
namespace Xsolla\SDK\Tests\Integration\Webhook;
4
5
use Guzzle\Http\Client;
6
use Guzzle\Http\Exception\BadResponseException;
7
use Symfony\Component\HttpFoundation\Response;
8
use Symfony\Component\Process\Process;
9
use Xsolla\SDK\API\XsollaClient;
10
use Xsolla\SDK\Tests\Helper\DebugHelper;
11
use Xsolla\SDK\Version;
12
13
/**
14
 * @group php-built-in-web-server
15
 */
16
class ServerTest extends \PHPUnit_Framework_TestCase
17
{
18
    const PROJECT_SECRET_KEY = 'PROJECT_SECRET_KEY';
19
20
    /**
21
     * @var Process
22
     */
23
    protected static $process;
24
25
    /**
26
     * @var Client
27
     */
28
    protected static $httpClient;
29
30
    public static function setUpBeforeClass()
31
    {
32
        self::setUpPhpServer();
33
        self::setUpHttpClient();
34
    }
35
36
    private static function setUpPhpServer()
37
    {
38
        self::$process = new Process('php -S [::1]:8999', __DIR__.'/../Resources');
39
        self::$process->setTimeout(1);
40
        self::$process->start();
41
        usleep(100000);
42
    }
43
44
    private static function setUpHttpClient()
45
    {
46
        self::$httpClient = new Client('http://[::1]:8999');
47
        if (DebugHelper::isDebug()) {
48
            DebugHelper::addDebugOptionsToHttpClient(self::$httpClient);
49
        }
50
    }
51
52
    public static function tearDownAfterClass()
53
    {
54
        self::$process->stop(0);
55
    }
56
57
    /**
58
     * @dataProvider cbProvider
59
     */
60
    public function testResponse(
61
        $expectedStatusCode,
62
        $expectedResponseContent,
63
        $request,
64
        $testCase,
65
        $testHeaders
66
    ) {
67
        $signature = sha1($request.self::PROJECT_SECRET_KEY);
68
        if ($testHeaders) {
69
            $headers = $testHeaders;
70
        } else {
71
            $headers = array('Authorization' => 'Signature '.$signature);
72
        }
73
        $request = self::$httpClient->post('/webhook_server.php?test_case='.$testCase, $headers, $request);
74
        try {
75
            $response = $request->send();
76
        } catch (BadResponseException $e) {
77
            $response = $e->getResponse();
78
        }
79
        static::assertSame($expectedResponseContent, $response->getBody(true));
80
        static::assertSame($expectedStatusCode, $response->getStatusCode());
81
        static::assertArrayHasKey('x-xsolla-sdk', $response->getHeaders());
82
        static::assertSame(Version::getVersion(), (string) $response->getHeader('x-xsolla-sdk'));
83
        static::assertArrayHasKey('content-type', $response->getHeaders());
84
        if (Response::HTTP_NO_CONTENT === $response->getStatusCode()) {
85
            static::assertStringStartsWith('text/plain', (string) $response->getHeader('content-type'));
86
        } else {
87
            static::assertStringStartsWith('application/json', (string) $response->getHeader('content-type'));
88
        }
89
    }
90
91
    public function cbProvider()
92
    {
93
        return array(
94
            array(
95
                'expectedStatusCode' => 204,
96
                'expectedResponseContent' => '',
97
                'request' => '{"notification_type": "payment"}',
98
                'testCase' => 'success',
99
                'testHeaders' => null,
100
            ),
101
            array(
102
                'expectedStatusCode' => 422,
103
                'expectedResponseContent' => XsollaClient::jsonEncode(
104
                    array(
105
                        'error' => array(
106
                            'code' => 'INVALID_PARAMETER',
107
                            'message' => 'notification_type key not found in Xsolla webhook request',
108
                        ),
109
                    )
110
                ),
111
                'request' => '{"foo": "bar"}',
112
                'testCase' => 'empty_request',
113
                'testHeaders' => null,
114
            ),
115
            array(
116
                'expectedStatusCode' => 422,
117
                'expectedResponseContent' => XsollaClient::jsonEncode(
118
                    array(
119
                        'error' => array(
120
                            'code' => 'INVALID_PARAMETER',
121
                            'message' => 'Unknown notification_type in Xsolla webhook request: unknown',
122
                        ),
123
                    )
124
                ),
125
                'request' => '{"notification_type": "unknown"}',
126
                'testCase' => 'unknown_notification_type',
127
                'testHeaders' => null,
128
            ),
129
            array(
130
                'expectedStatusCode' => 401,
131
                'expectedResponseContent' => XsollaClient::jsonEncode(
132
                    array(
133
                        'error' => array(
134
                            'code' => 'INVALID_SIGNATURE',
135
                            'message' => 'Invalid Signature. Signature provided in "Authorization" header (78143a5ac4b892a68ce8b0b8b49e26667db0fa00) does not match with expected',
136
                        ),
137
                    )
138
                ),
139
                'request' => null,
140
                'testCase' => 'invalid_signature',
141
                'testHeaders' => array('Authorization' => 'Signature 78143a5ac4b892a68ce8b0b8b49e26667db0fa00'),
142
            ),
143
            array(
144
                'expectedStatusCode' => 401,
145
                'expectedResponseContent' => XsollaClient::jsonEncode(
146
                    array(
147
                        'error' => array(
148
                            'code' => 'INVALID_SIGNATURE',
149
                            'message' => '"Authorization" header not found in Xsolla webhook request. Please check troubleshooting section in README.md https://github.com/xsolla/xsolla-sdk-php#troubleshooting',
150
                        ),
151
                    )
152
                ),
153
                'request' => null,
154
                'testCase' => 'authorization_header_not_found',
155
                'testHeaders' => array('foo' => 'bar'),
156
            ),
157
            array(
158
                'expectedStatusCode' => 401,
159
                'expectedResponseContent' => XsollaClient::jsonEncode(
160
                    array(
161
                        'error' => array(
162
                            'code' => 'INVALID_SIGNATURE',
163
                            'message' => 'Signature not found in "Authorization" header from Xsolla webhook request: INVALID_FORMAT',
164
                        ),
165
                    )
166
                ),
167
                'request' => null,
168
                'testCase' => 'invalid_signature_format',
169
                'testHeaders' => array('Authorization' => 'INVALID_FORMAT'),
170
            ),
171
            array(
172
                'expectedStatusCode' => 422,
173
                'expectedResponseContent' => XsollaClient::jsonEncode(
174
                    array(
175
                        'error' => array(
176
                            'code' => 'INVALID_PARAMETER',
177
                            'message' => 'Unable to parse Xsolla webhook request into JSON: Syntax error.',
178
                        ),
179
                    )
180
                ),
181
                'request' => 'INVALID_REQUEST_CONTENT',
182
                'testCase' => 'invalid_request_content',
183
                'testHeaders' => null,
184
            ),
185
            array(
186
                'expectedStatusCode' => 401,
187
                'expectedResponseContent' => XsollaClient::jsonEncode(
188
                    array(
189
                        'error' => array(
190
                            'code' => 'INVALID_CLIENT_IP',
191
                            'message' => 'Client IP address (::1) not found in allowed IP addresses whitelist (159.255.220.240/28, 185.30.20.16/29, 185.30.21.0/24, 185.30.21.16/29). Please check troubleshooting section in README.md https://github.com/xsolla/xsolla-sdk-php#troubleshooting',
192
                        ),
193
                    )
194
                ),
195
                'request' => null,
196
                'testCase' => 'invalid_ip',
197
                'testHeaders' => null,
198
            ),
199
            array(
200
                'expectedStatusCode' => 500,
201
                'expectedResponseContent' => XsollaClient::jsonEncode(
202
                    array(
203
                        'error' => array(
204
                            'code' => 'SERVER_ERROR',
205
                            'message' => 'callback_server_error',
206
                        ),
207
                    )
208
                ),
209
                'request' => '{"notification_type": "payment"}',
210
                'testCase' => 'callback_server_error',
211
                'testHeaders' => null,
212
            ),
213
            array(
214
                'expectedStatusCode' => 400,
215
                'expectedResponseContent' => XsollaClient::jsonEncode(
216
                    array(
217
                        'error' => array(
218
                            'code' => 'CLIENT_ERROR',
219
                            'message' => 'callback_client_error',
220
                        ),
221
                    )
222
                ),
223
                'request' => '{"notification_type": "payment"}',
224
                'testCase' => 'callback_client_error',
225
                'testHeaders' => null,
226
            ),
227
        );
228
    }
229
}
230