Skip to content

Commit 79b4b29

Browse files
authored
Merge pull request #4 from farzai/add-request-decorator
Add standart request
2 parents 6d1dd15 + 09176a8 commit 79b4b29

9 files changed

Lines changed: 405 additions & 102 deletions

File tree

composer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@
1818
"guzzlehttp/guzzle": "^7.7",
1919
"guzzlehttp/psr7": "^2.5",
2020
"psr/http-client": "^1.0",
21-
"psr/http-message": "^1.0|^2.0"
21+
"psr/http-message": "^2.0"
2222
},
2323
"require-dev": {
2424
"laravel/pint": "^1.2",
25-
"mockery/mockery": "^1.5",
2625
"pestphp/pest": "^1.20",
2726
"spatie/ray": "^1.28"
2827
},

src/Contracts/ResponseInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function isSuccessfull(): bool;
3030
/**
3131
* Return the json decoded response.
3232
*/
33-
public function json(?string $key = null): mixed;
33+
public function json(string $key = null): mixed;
3434

3535
/**
3636
* Throw an exception if the response is not successfull.

src/Exceptions/ResponseExceptionFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ResponseExceptionFactory
1313
/**
1414
* Create a new exception instance.
1515
*/
16-
public static function create(ResponseInterface $response, ?Throwable $previous = null)
16+
public static function create(ResponseInterface $response, Throwable $previous = null)
1717
{
1818
$statusCode = $response->statusCode();
1919

src/Request.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Farzai\Transport;
4+
5+
use Farzai\Transport\Traits\PsrRequestTrait;
6+
use GuzzleHttp\Psr7\Request as GuzzleRequest;
7+
use Psr\Http\Message\RequestInterface as PsrRequestInterface;
8+
9+
class Request implements PsrRequestInterface
10+
{
11+
use PsrRequestTrait;
12+
13+
public function __construct(
14+
string $method,
15+
$uri,
16+
array $headers = [],
17+
$body = null,
18+
string $version = '1.1'
19+
) {
20+
$this->request = new GuzzleRequest($method, $uri, $headers, $body, $version);
21+
}
22+
}

src/Response.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public function isSuccessfull(): bool
7373
/**
7474
* Return the json decoded response.
7575
*/
76-
public function json(?string $key = null): mixed
76+
public function json(string $key = null): mixed
7777
{
7878
if (is_null($this->jsonDecoded)) {
7979
$this->jsonDecoded = @json_decode($this->body(), true) ?: false;

src/Traits/PsrRequestTrait.php

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?php
2+
3+
namespace Farzai\Transport\Traits;
4+
5+
use Psr\Http\Message\RequestInterface as PsrRequestInterface;
6+
use Psr\Http\Message\StreamInterface;
7+
use Psr\Http\Message\UriInterface;
8+
9+
trait PsrRequestTrait
10+
{
11+
protected PsrRequestInterface $request;
12+
13+
public function getRequestTarget(): string
14+
{
15+
return $this->request->getRequestTarget();
16+
}
17+
18+
public function withRequestTarget($requestTarget): PsrRequestInterface
19+
{
20+
$this->request = $this->request->withRequestTarget($requestTarget);
21+
22+
return $this;
23+
}
24+
25+
public function getMethod(): string
26+
{
27+
return $this->request->getMethod();
28+
}
29+
30+
public function withMethod($method): PsrRequestInterface
31+
{
32+
$this->request = $this->request->withMethod($method);
33+
34+
return $this;
35+
}
36+
37+
public function getUri(): UriInterface
38+
{
39+
return $this->request->getUri();
40+
}
41+
42+
public function withUri($uri, $preserveHost = false): PsrRequestInterface
43+
{
44+
$this->request = $this->request->withUri($uri, $preserveHost);
45+
46+
return $this;
47+
}
48+
49+
public function getProtocolVersion(): string
50+
{
51+
return $this->request->getProtocolVersion();
52+
}
53+
54+
public function withProtocolVersion($version): PsrRequestInterface
55+
{
56+
$this->request = $this->request->withProtocolVersion($version);
57+
58+
return $this;
59+
}
60+
61+
public function getHeaders(): array
62+
{
63+
return $this->request->getHeaders();
64+
}
65+
66+
public function hasHeader($name): bool
67+
{
68+
return $this->request->hasHeader($name);
69+
}
70+
71+
public function getHeader($name): array
72+
{
73+
return $this->request->getHeader($name);
74+
}
75+
76+
public function getHeaderLine($name): string
77+
{
78+
return $this->request->getHeaderLine($name);
79+
}
80+
81+
public function withHeader($name, $value): PsrRequestInterface
82+
{
83+
$this->request = $this->request->withHeader($name, $value);
84+
85+
return $this;
86+
}
87+
88+
public function withAddedHeader($name, $value): PsrRequestInterface
89+
{
90+
$this->request = $this->request->withAddedHeader($name, $value);
91+
92+
return $this;
93+
}
94+
95+
public function withoutHeader($name): PsrRequestInterface
96+
{
97+
$this->request = $this->request->withoutHeader($name);
98+
99+
return $this;
100+
}
101+
102+
public function getBody(): StreamInterface
103+
{
104+
return $this->request->getBody();
105+
}
106+
107+
public function withBody(StreamInterface $body): PsrRequestInterface
108+
{
109+
$this->request = $this->request->withBody($body);
110+
111+
return $this;
112+
}
113+
}

tests/RequestTest.php

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<?php
2+
3+
use Farzai\Transport\Request;
4+
use GuzzleHttp\Psr7\Uri;
5+
use Psr\Http\Message\StreamInterface;
6+
7+
it('can get the request method', function () {
8+
$request = new Request('GET', new Uri('https://example.com'));
9+
10+
expect($request->getMethod())->toBe('GET');
11+
});
12+
13+
it('can set the request method', function () {
14+
$request = new Request('GET', new Uri('https://example.com'));
15+
16+
$newRequest = $request->withMethod('POST');
17+
18+
expect($newRequest->getMethod())->toBe('POST');
19+
});
20+
21+
it('can get request target', function () {
22+
$request = new Request('GET', new Uri('https://example.com/foo'));
23+
24+
expect($request->getRequestTarget())->toBe('/foo');
25+
});
26+
27+
it('can set request target', function () {
28+
$request = new Request('GET', new Uri('https://example.com'));
29+
30+
$newRequest = $request->withRequestTarget('/foo');
31+
32+
expect($newRequest->getRequestTarget())->toBe('/foo');
33+
});
34+
35+
it('can get the request URI', function () {
36+
$uri = new Uri('https://example.com');
37+
$request = new Request('GET', $uri);
38+
39+
expect($request->getUri())->toBe($uri);
40+
});
41+
42+
it('can set the request URI', function () {
43+
$uri = new Uri('https://example.com');
44+
$request = new Request('GET', $uri);
45+
46+
$newUri = new Uri('https://example.org');
47+
$newRequest = $request->withUri($newUri);
48+
49+
expect($newRequest->getUri())->toBe($newUri);
50+
});
51+
52+
it('can get the request protocol version', function () {
53+
$request = new Request('GET', new Uri('https://example.com'));
54+
55+
expect($request->getProtocolVersion())->toBe('1.1');
56+
});
57+
58+
it('can set the request protocol version', function () {
59+
$request = new Request('GET', new Uri('https://example.com'));
60+
61+
$newRequest = $request->withProtocolVersion('2.0');
62+
63+
expect($newRequest->getProtocolVersion())->toBe('2.0');
64+
});
65+
66+
it('can get the request headers', function () {
67+
$request = new Request('GET', new Uri('https://example.com'), [
68+
'Content-Type' => 'application/json',
69+
]);
70+
71+
expect($request->getHeaders())->toBe([
72+
'Host' => ['example.com'],
73+
'Content-Type' => ['application/json'],
74+
]);
75+
});
76+
77+
it('can set a request header', function () {
78+
$request = new Request('GET', new Uri('https://example.com'));
79+
80+
$newRequest = $request->withHeader('Content-Type', 'application/json');
81+
82+
expect($newRequest->getHeaders())->toBe([
83+
'Host' => ['example.com'],
84+
'Content-Type' => ['application/json'],
85+
]);
86+
});
87+
88+
it('can add a request header', function () {
89+
$request = new Request('GET', new Uri('https://example.com'), [
90+
'Content-Type' => 'application/json',
91+
]);
92+
93+
$newRequest = $request->withAddedHeader('Accept', 'application/json');
94+
95+
expect($newRequest->getHeaders())->toBe([
96+
'Host' => ['example.com'],
97+
'Content-Type' => ['application/json'],
98+
'Accept' => ['application/json'],
99+
]);
100+
});
101+
102+
it('can check exists header', function () {
103+
$request = new Request('GET', new Uri('https://example.com'), [
104+
'Content-Type' => 'application/json',
105+
]);
106+
107+
expect($request->hasHeader('Content-Type'))->toBeTrue();
108+
expect($request->hasHeader('Accept'))->toBeFalse();
109+
});
110+
111+
it('can get header', function () {
112+
$request = new Request('GET', new Uri('https://example.com'), [
113+
'Content-Type' => 'application/json',
114+
]);
115+
116+
expect($request->getHeader('Content-Type'))->toBe(['application/json']);
117+
expect($request->getHeader('Accept'))->toBe([]);
118+
});
119+
120+
it('can remove a request header', function () {
121+
$request = new Request('GET', new Uri('https://example.com'), [
122+
'Content-Type' => 'application/json',
123+
'Accept' => 'application/json',
124+
]);
125+
126+
$newRequest = $request->withoutHeader('Accept');
127+
128+
expect($newRequest->getHeaders())->toBe([
129+
'Host' => ['example.com'],
130+
'Content-Type' => ['application/json'],
131+
]);
132+
});
133+
134+
it('can get a request header line', function () {
135+
$request = new Request('GET', new Uri('https://example.com'), [
136+
'Content-Type' => 'application/json',
137+
]);
138+
139+
expect($request->getHeaderLine('Content-Type'))->toBe('application/json');
140+
});
141+
142+
it('can set the request body', function () {
143+
$request = new Request('GET', new Uri('https://example.com'));
144+
145+
$stream = $this->createMock(StreamInterface::class);
146+
$stream->method('__toString')->willReturn('{"foo":"bar"}');
147+
148+
$newRequest = $request->withBody($stream);
149+
150+
expect((string) $newRequest->getBody())->toBe('{"foo":"bar"}');
151+
});

0 commit comments

Comments
 (0)