Skip to content

Commit c90bfd9

Browse files
committed
1 parent 4802008 commit c90bfd9

File tree

1 file changed

+200
-0
lines changed

1 file changed

+200
-0
lines changed

tests/CurlUtils/CurlHandleTest.php

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
<?php
2+
/**
3+
* Class CurlHandleTest
4+
*
5+
* @filesource CurlHandleTest.php
6+
* @created 09.11.2019
7+
* @package chillerlan\HTTPTest\CurlUtils
8+
* @author smiley <smiley@chillerlan.net>
9+
* @copyright 2019 smiley
10+
* @license MIT
11+
*/
12+
13+
namespace chillerlan\HTTPTest\CurlUtils;
14+
15+
use chillerlan\HTTP\HTTPOptions;
16+
use chillerlan\HTTP\Psr17\RequestFactory;
17+
use chillerlan\HTTP\Psr18\CurlClient;
18+
use chillerlan\HTTP\Psr7\Request;
19+
use Exception;
20+
use PHPUnit\Framework\TestCase;
21+
22+
use function chillerlan\HTTP\Psr17\create_stream;
23+
use function chillerlan\HTTP\Psr7\get_json;
24+
use function strlen, strtolower;
25+
26+
class CurlHandleTest extends TestCase{
27+
28+
/**
29+
* @var \Psr\Http\Client\ClientInterface
30+
*/
31+
protected $http;
32+
33+
/**
34+
* @var \chillerlan\HTTP\Psr17\RequestFactory
35+
*/
36+
protected $requestFactory;
37+
38+
protected function setUp():void{
39+
$options = new HTTPOptions([
40+
'ca_info' => __DIR__.'/../cacert.pem',
41+
]);
42+
43+
$this->http = new CurlClient($options);
44+
$this->requestFactory = new RequestFactory;
45+
}
46+
47+
public function requestMethodProvider():array{
48+
return [
49+
'delete' => [Request::METHOD_DELETE],
50+
'get' => [Request::METHOD_GET],
51+
# 'head' => [Request::METHOD_HEAD],
52+
# 'options' => [Request::METHOD_OPTIONS],
53+
'patch' => [Request::METHOD_PATCH],
54+
'post' => [Request::METHOD_POST],
55+
'put' => [Request::METHOD_PUT],
56+
];
57+
}
58+
59+
/**
60+
* @dataProvider requestMethodProvider
61+
*
62+
* @param string $method
63+
*/
64+
public function testRequestMethods(string $method){
65+
66+
try{
67+
$url = 'https://httpbin.org/'.strtolower($method).'?foo=bar';
68+
$request = $this->requestFactory->createRequest($method, $url);
69+
$response = $this->http->sendRequest($request);
70+
$status = $response->getStatusCode();
71+
72+
if($status !== 200){
73+
throw new Exception('HTTP/'.$status.' ('.$url.')');
74+
}
75+
76+
$data = get_json($response);
77+
78+
$this->assertSame($url, $data->url);
79+
$this->assertSame('bar', $data->args->foo);
80+
}
81+
catch(Exception $e){
82+
$this->markTestSkipped('error: '.$e->getMessage());
83+
}
84+
85+
}
86+
87+
public function requestMethodWithBodyProvider():array{
88+
return [
89+
'delete' => [Request::METHOD_DELETE],
90+
'patch' => [Request::METHOD_PATCH],
91+
'post' => [Request::METHOD_POST],
92+
'put' => [Request::METHOD_PUT],
93+
];
94+
}
95+
96+
/**
97+
* @dataProvider requestMethodWithBodyProvider
98+
*
99+
* @param string $method
100+
*/
101+
public function testRequestMethodsWithFormBody(string $method){
102+
103+
try{
104+
$url = 'https://httpbin.org/'.strtolower($method);
105+
$body = 'foo=bar';
106+
107+
$request = $this->requestFactory->createRequest($method, $url)
108+
->withHeader('Content-type', 'x-www-form-urlencoded')
109+
->withHeader('Content-Length', strlen($body))
110+
->withBody(create_stream($body))
111+
;
112+
113+
$response = $this->http->sendRequest($request);
114+
$status = $response->getStatusCode();
115+
116+
if($status !== 200){
117+
throw new Exception('HTTP/'.$status);
118+
}
119+
120+
$data = get_json($response);
121+
122+
$this->assertSame($url, $data->url);
123+
$this->assertSame('x-www-form-urlencoded', $data->headers->{'Content-Type'});
124+
$this->assertSame(strlen($body), (int)$data->headers->{'Content-Length'});
125+
$this->assertSame($body, $data->data);
126+
}
127+
catch(Exception $e){
128+
$this->markTestSkipped('error: '.$e->getMessage());
129+
}
130+
131+
}
132+
133+
/**
134+
* @dataProvider requestMethodWithBodyProvider
135+
*
136+
* @param string $method
137+
*/
138+
public function testRequestMethodsWithJsonBody(string $method){
139+
140+
try{
141+
$url = 'https://httpbin.org/'.strtolower($method);
142+
$body = '{"foo":"bar"}';
143+
144+
$request = $this->requestFactory->createRequest($method, $url)
145+
->withHeader('Content-type', 'application/json')
146+
->withBody(create_stream($body))
147+
;
148+
149+
$response = $this->http->sendRequest($request);
150+
$status = $response->getStatusCode();
151+
152+
if($status !== 200){
153+
throw new Exception('HTTP/'.$status);
154+
}
155+
156+
$data = get_json($response);
157+
158+
$this->assertSame($url, $data->url);
159+
$this->assertSame('application/json', $data->headers->{'Content-Type'});
160+
$this->assertSame(strlen($body), (int)$data->headers->{'Content-Length'});
161+
$this->assertSame($body, $data->data);
162+
$this->assertSame('bar', $data->json->foo);
163+
}
164+
catch(Exception $e){
165+
$this->markTestSkipped('error: '.$e->getMessage());
166+
}
167+
168+
}
169+
170+
public function testLargeBody(){
171+
172+
try{
173+
$body = \str_repeat('*', (1 << 20) + 1);
174+
175+
$request = $this->requestFactory->createRequest('POST', 'https://httpbin.org/post')
176+
->withHeader('Content-type', 'text/plain')
177+
->withHeader('Content-Length', strlen($body))
178+
->withBody(create_stream($body))
179+
;
180+
181+
$response = $this->http->sendRequest($request);
182+
$status = $response->getStatusCode();
183+
184+
if($status !== 200){
185+
throw new Exception('HTTP/'.$status);
186+
}
187+
188+
$data = get_json($response);
189+
190+
$this->assertSame(strlen($body), (int)$data->headers->{'Content-Length'});
191+
}
192+
catch(Exception $e){
193+
// httpbin times out after 10 seconds and will most likely fail to transfer 1MB of data
194+
// so fool the code coverage if that happens, as we're only interested in request creation
195+
$this->assertTrue(true);
196+
# $this->markTestSkipped('error: '.$e->getMessage());
197+
}
198+
}
199+
200+
}

0 commit comments

Comments
 (0)