Skip to content

Commit 62eba76

Browse files
committed
Merge pull request #1 from php-http/message_decorators
Add message decorators
2 parents 82b31e4 + 2dec061 commit 62eba76

File tree

6 files changed

+612
-0
lines changed

6 files changed

+612
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
<?php
2+
3+
namespace spec\Http\Message\Decorator;
4+
5+
use Http\Message\Decorator\MessageDecorator;
6+
use Psr\Http\Message\MessageInterface;
7+
use Psr\Http\Message\StreamInterface;
8+
use Psr\Http\Message\UriInterface;
9+
use PhpSpec\ObjectBehavior;
10+
11+
class MessageDecoratorSpec extends ObjectBehavior
12+
{
13+
function let(MessageInterface $message)
14+
{
15+
$this->beAnInstanceOf('spec\Http\Message\Decorator\MessageDecoratorStub', [$message]);
16+
}
17+
18+
function it_is_initializable()
19+
{
20+
$this->shouldHaveType('spec\Http\Message\Decorator\MessageDecoratorStub');
21+
}
22+
23+
function it_is_a_message()
24+
{
25+
$this->shouldImplement('Psr\Http\Message\MessageInterface');
26+
}
27+
28+
function it_is_a_message_decorator()
29+
{
30+
$this->shouldUseTrait('Http\Message\Decorator\MessageDecorator');
31+
}
32+
33+
function it_has_a_message()
34+
{
35+
$this->getMessage()->shouldImplement('Psr\Http\Message\MessageInterface');
36+
}
37+
38+
function it_has_a_protocol_version(MessageInterface $message)
39+
{
40+
$message->getProtocolVersion()->willReturn('1.1');
41+
42+
$this->getProtocolVersion()->shouldReturn('1.1');
43+
}
44+
45+
function it_accepts_a_protocol_version(MessageInterface $message, MessageInterface $newMessage)
46+
{
47+
$message->withProtocolVersion('1.1')->willReturn($newMessage);
48+
49+
$new = $this->withProtocolVersion('1.1');
50+
$new->getMessage()->shouldReturn($newMessage);
51+
}
52+
53+
function it_has_headers(MessageInterface $message)
54+
{
55+
$headers = [
56+
'Content-Type' => 'application/xml'
57+
];
58+
59+
$message->getHeaders()->willReturn($headers);
60+
61+
$this->getHeaders()->shouldReturn($headers);
62+
}
63+
64+
function it_can_check_a_header(MessageInterface $message)
65+
{
66+
$message->hasHeader('Content-Type')->willReturn(true);
67+
68+
$this->hasHeader('Content-Type')->shouldReturn(true);
69+
}
70+
71+
function it_has_a_header(MessageInterface $message)
72+
{
73+
$message->getHeader('Content-Type')->willReturn('application/xml');
74+
75+
$this->getHeader('Content-Type')->shouldReturn('application/xml');
76+
}
77+
78+
function it_has_a_header_line(MessageInterface $message)
79+
{
80+
$message->getHeaderLine('Accept-Encoding')->willReturn('gzip, deflate');
81+
82+
$this->getHeaderLine('Accept-Encoding')->shouldReturn('gzip, deflate');
83+
}
84+
85+
function it_accepts_a_header(MessageInterface $message, MessageInterface $newMessage)
86+
{
87+
$message->withHeader('Content-Type', 'application/xml')->willReturn($newMessage);
88+
89+
$new = $this->withHeader('Content-Type', 'application/xml');
90+
$new->getMessage()->shouldReturn($newMessage);
91+
}
92+
93+
function it_accepts_added_headers(MessageInterface $message, MessageInterface $newMessage)
94+
{
95+
$message->withAddedHeader('Content-Type', 'application/xml')->willReturn($newMessage);
96+
97+
$new = $this->withAddedHeader('Content-Type', 'application/xml');
98+
$new->getMessage()->shouldReturn($newMessage);
99+
}
100+
101+
function it_removes_a_header(MessageInterface $message, MessageInterface $newMessage)
102+
{
103+
$message->withoutHeader('Content-Type')->willReturn($newMessage);
104+
105+
$new = $this->withoutHeader('Content-Type');
106+
$new->getMessage()->shouldReturn($newMessage);
107+
}
108+
109+
function it_has_a_body(MessageInterface $message, StreamInterface $body)
110+
{
111+
$message->getBody()->willReturn($body);
112+
113+
$this->getBody()->shouldReturn($body);
114+
}
115+
116+
function it_accepts_a_body(MessageInterface $message, MessageInterface $newMessage, StreamInterface $body)
117+
{
118+
$message->withBody($body)->willReturn($newMessage);
119+
120+
$new = $this->withBody($body);
121+
$new->getMessage()->shouldReturn($newMessage);
122+
}
123+
124+
function getMatchers()
125+
{
126+
return [
127+
'useTrait' => function ($subject, $trait) {
128+
return class_uses($subject, $trait);
129+
}
130+
];
131+
}
132+
}
133+
134+
class MessageDecoratorStub implements MessageInterface
135+
{
136+
use MessageDecorator;
137+
138+
public function __construct(MessageInterface $message)
139+
{
140+
$this->message = $message;
141+
}
142+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
3+
namespace spec\Http\Message\Decorator;
4+
5+
use Http\Message\Decorator\RequestDecorator;
6+
use Psr\Http\Message\RequestInterface;
7+
use Psr\Http\Message\StreamInterface;
8+
use Psr\Http\Message\UriInterface;
9+
use PhpSpec\ObjectBehavior;
10+
11+
class RequestDecoratorSpec extends ObjectBehavior
12+
{
13+
function let(RequestInterface $request)
14+
{
15+
$this->beAnInstanceOf('spec\Http\Message\Decorator\RequestDecoratorStub', [$request]);
16+
}
17+
18+
function it_is_initializable()
19+
{
20+
$this->shouldHaveType('spec\Http\Message\Decorator\RequestDecoratorStub');
21+
}
22+
23+
function it_is_a_request()
24+
{
25+
$this->shouldImplement('Psr\Http\Message\RequestInterface');
26+
}
27+
28+
function it_is_a_request_decorator()
29+
{
30+
$this->shouldUseTrait('Http\Message\Decorator\RequestDecorator');
31+
}
32+
33+
function it_has_a_request()
34+
{
35+
$this->getRequest()->shouldImplement('Psr\Http\Message\RequestInterface');
36+
}
37+
38+
function it_accepts_a_request(RequestInterface $request)
39+
{
40+
$new = $this->withRequest($request);
41+
42+
$new->getRequest()->shouldReturn($request);
43+
}
44+
45+
function it_has_a_request_target(RequestInterface $request)
46+
{
47+
$request->getRequestTarget()->willReturn('/');
48+
49+
$this->getRequestTarget()->shouldReturn('/');
50+
}
51+
52+
function it_accepts_a_request_target(RequestInterface $request, RequestInterface $newRequest)
53+
{
54+
$request->withRequestTarget('/')->willReturn($newRequest);
55+
56+
$new = $this->withRequestTarget('/');
57+
$new->getMessage()->shouldReturn($newRequest);
58+
}
59+
60+
function it_has_a_method(RequestInterface $request)
61+
{
62+
$request->getMethod()->willReturn('GET');
63+
64+
$this->getMethod()->shouldReturn('GET');
65+
}
66+
67+
function it_accepts_a_method(RequestInterface $request, RequestInterface $newRequest)
68+
{
69+
$request->withMethod('GET')->willReturn($newRequest);
70+
71+
$new = $this->withMethod('GET');
72+
$new->getMessage()->shouldReturn($newRequest);
73+
}
74+
75+
function it_has_an_uri(RequestInterface $request, UriInterface $uri)
76+
{
77+
$request->getUri()->willReturn($uri);
78+
79+
$this->getUri()->shouldReturn($uri);
80+
}
81+
82+
function it_accepts_an_uri(RequestInterface $request, RequestInterface $newRequest, UriInterface $uri)
83+
{
84+
$request->withUri($uri, false)->willReturn($newRequest);
85+
86+
$new = $this->withUri($uri);
87+
$new->getMessage()->shouldReturn($newRequest);
88+
}
89+
90+
function getMatchers()
91+
{
92+
return [
93+
'useTrait' => function ($subject, $trait) {
94+
return class_uses($subject, $trait);
95+
}
96+
];
97+
}
98+
}
99+
100+
class RequestDecoratorStub implements RequestInterface
101+
{
102+
use RequestDecorator;
103+
104+
public function __construct(RequestInterface $request)
105+
{
106+
$this->message = $request;
107+
}
108+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
namespace spec\Http\Message\Decorator;
4+
5+
use Http\Message\Decorator\ResponseDecorator;
6+
use Psr\Http\Message\ResponseInterface;
7+
use Psr\Http\Message\StreamInterface;
8+
use PhpSpec\ObjectBehavior;
9+
10+
class ResponseDecoratorSpec extends ObjectBehavior
11+
{
12+
function let(ResponseInterface $response)
13+
{
14+
$this->beAnInstanceOf('spec\Http\Message\Decorator\ResponseDecoratorStub', [$response]);
15+
}
16+
17+
function it_is_initializable()
18+
{
19+
$this->shouldHaveType('spec\Http\Message\Decorator\ResponseDecoratorStub');
20+
}
21+
22+
function it_is_a_response()
23+
{
24+
$this->shouldImplement('Psr\Http\Message\ResponseInterface');
25+
}
26+
27+
function it_is_a_response_decorator()
28+
{
29+
$this->shouldUseTrait('Http\Message\Decorator\ResponseDecorator');
30+
}
31+
32+
function it_has_a_response()
33+
{
34+
$this->getResponse()->shouldImplement('Psr\Http\Message\ResponseInterface');
35+
}
36+
37+
function it_accepts_a_response(ResponseInterface $response)
38+
{
39+
$new = $this->withResponse($response);
40+
41+
$new->getResponse()->shouldReturn($response);
42+
}
43+
44+
function it_has_a_status_code(ResponseInterface $response)
45+
{
46+
$response->getStatusCode()->willReturn(200);
47+
48+
$this->getStatusCode()->shouldReturn(200);
49+
}
50+
51+
function it_accepts_a_status(ResponseInterface $response, ResponseInterface $newResponse)
52+
{
53+
$response->withStatus(200, 'OK')->willReturn($newResponse);
54+
55+
$new = $this->withStatus(200, 'OK');
56+
$new->getMessage()->shouldReturn($newResponse);
57+
}
58+
59+
function it_has_a_reason_phrase(ResponseInterface $response)
60+
{
61+
$response->getReasonPhrase()->willReturn('OK');
62+
63+
$this->getReasonPhrase()->shouldReturn('OK');
64+
}
65+
66+
function getMatchers()
67+
{
68+
return [
69+
'useTrait' => function ($subject, $trait) {
70+
return class_uses($subject, $trait);
71+
}
72+
];
73+
}
74+
}
75+
76+
class ResponseDecoratorStub implements ResponseInterface
77+
{
78+
use ResponseDecorator;
79+
80+
public function __construct(ResponseInterface $response)
81+
{
82+
$this->message = $response;
83+
}
84+
}

0 commit comments

Comments
 (0)