Completed
Push — master ( e91cdf...4daf57 )
by Arnold
9s
created

Connector::getResponseConvertor()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 0
crap 2
1
<?php
2
3
namespace Jasny\Codeception;
4
5
use Psr\Http\Message\ServerRequestInterface;
6
use Psr\Http\Message\ResponseInterface;
7
use Jasny\HttpMessage\Response;
8
use Jasny\HttpMessage\ServerRequest;
9
use Jasny\HttpMessage\OutputBufferStream;
10
use Jasny\Router;
11
use Jasny\Codeception\RequestConvertor;
12
use Jasny\Codeception\ResponseConvertor;
13
use Symfony\Component\BrowserKit\Client;
14
use Symfony\Component\BrowserKit\Request as BrowserKitRequest;
15
use Symfony\Component\BrowserKit\Response as BrowserKitResponse;
16
17
/**
18
 * Codeception connector for Jasny\MVC
19
 */
20
class Connector extends Client
21
{
22
    /**
23
     * @var Router
24
     */
25
    protected $router;
26
    
27
    /**
28
     * Request with the current global environent
29
     * @var ServerRequestInterface
30
     */
31
    protected $baseRequest;
32
    
33
    /**
34
     * Request with the current global environent
35
     * @var ResponseInterface
36
     */
37
    protected $baseResponse;
38
    
39
    /**
40
     * @var RequestConvertor
41
     */
42
    protected $requestConvertor;
43
    
44
    /**
45
     * @var ResponseConvertor
46
     */
47
    protected $responseConvertor;
48
    
49
    
50
    /**
51
     * Set the router
52
     * 
53
     * @param Router $router
54
     */
55 3
    public function setRouter(Router $router)
56
    {
57 3
        $this->router = $router;
58 3
    }
59
    
60
    /**
61
     * Get the router
62
     * 
63
     * @return Router
64
     */
65 4
    public function getRouter()
66
    {
67 4
        return $this->router;
68
    }
69
    
70
    
71
    /**
72
     * Set the base request
73
     * 
74
     * @param ServerRequestInterface $request
75
     */
76 5
    public function setBaseRequest(ServerRequestInterface $request)
77
    {
78 5
        if ($request instanceof ServerRequest && $request->isStale()) {
79 1
            throw new \RuntimeException("Unable to set base request: ServerRequest is stale");
80
        }
81
        
82 4
        $this->baseRequest = $request;
83 4
    }
84
    
85
    /**
86
     * Get the base request
87
     * 
88
     * @return ServerRequestInterface
89
     */
90 5
    public function getBaseRequest()
91
    {
92 5
        if (!isset($this->baseRequest)) {
93 1
            $this->baseRequest = new ServerRequest();
94
        }
95
        
96 5
        return $this->baseRequest;
97
    }
98
    
99
    
100
    /**
101
     * Set the base response
102
     * 
103
     * @param ResponseInterface $response
104
     */
105 5
    public function setBaseResponse(ResponseInterface $response)
106
    {
107 5
        if ($response instanceof Response && $response->isStale()) {
108 1
            throw new \RuntimeException("Unable to set base response: Response is stale");
109
        }
110
        
111 4
        $this->baseResponse = $response;
112 4
    }
113
    
114
    /**
115
     * Get the base response
116
     * 
117
     * @return ResponseInterface
118
     */
119 5
    public function getBaseResponse()
120
    {
121 5
        if (!isset($this->baseResponse)) {
122 1
            $this->baseResponse = new Response();
123
        }
124
        
125 5
        return $this->baseResponse;
126
    }
127
    
128
129
    /**
130
     * Reset the request
131
     */
132 3
    protected function resetInput()
133
    {
134 3
        if (isset($this->baseRequest) && $this->baseRequest instanceof ServerRequest && $this->baseRequest->isStale()) {
135 1
            $this->baseRequest = $this->baseRequest->revive();
136
        }
137 3
    }
138
139
    /**
140
     * Reset the response
141
     */
142 3
    protected function resetOutput()
143
    {
144 3
        if (isset($this->baseResponse) && $this->baseResponse instanceof Response && $this->baseResponse->isStale()) {
145 1
            $this->baseResponse = $this->baseResponse->revive();
146
        }
147
        
148
        // Clear output buffer
149 3
        if (isset($this->baseResponse) && $this->baseResponse->getBody() instanceof OutputBufferStream) {
150 1
            $this->baseResponse = $this->baseResponse->withBody(clone $this->baseResponse->getBody());
151
        }
152 3
    }
153
    
154
    /**
155
     * Reset the request and response.
156
     * This is only required when the request and/or response are bound to the global environment.
157
     */
158 3
    public function reset()
159
    {
160 3
        $this->resetInput();
161 3
        $this->resetOutput();
162 3
    }
163
164
    
165
    /**
166
     * Set the request convertor
167
     * 
168
     * @param RequestConvertor $convertor
169
     */
170 3
    public function setRequestConvertor(RequestConvertor $convertor)
171
    {
172 3
        $this->requestConvertor = $convertor;
173 3
    }
174
    
175
    /**
176
     * Get the request convertor
177
     * 
178
     * @return RequestConvertor
179
     */
180 4
    public function getRequestConvertor()
181
    {
182 4
        if (!isset($this->requestConvertor)) {
183 1
            $this->requestConvertor = new RequestConvertor();
184
        }
185
        
186 4
        return $this->requestConvertor;
187
    }
188
    
189
    
190
    /**
191
     * Set the response convertor
192
     * 
193
     * @param ResponseConvertor $convertor
194
     */
195 3
    public function setResponseConvertor(ResponseConvertor $convertor)
196
    {
197 3
        $this->responseConvertor = $convertor;
198 3
    }
199
    
200
    /**
201
     * Get the response convertor
202
     * 
203
     * @return ResponseConvertor
204
     */
205 4
    public function getResponseConvertor()
206
    {
207 4
        if (!isset($this->responseConvertor)) {
208 1
            $this->responseConvertor = new ResponseConvertor();
209
        }
210
        
211 4
        return $this->responseConvertor;
212
    }
213
    
214
    
215
    /**
216
     * Makes a request.
217
     * 
218
     * @param BrowserKitRequest $request
219
     * @return BrowserKitResponse
220
     */
221 3
    protected function doRequest($request)
222
    {
223 3
        if ($this->getRouter() === null) {
224 1
            throw new \BadMethodCallException("Router not set");
225
        }
226
        
227 2
        $this->reset(); // Reset before each HTTP request
228
        
229 2
        $psrRequest = $this->getRequestConvertor()->convert($request, $this->getBaseRequest());
230
        
231 2
        $router = $this->getRouter();
232 2
        $psrResponse = $router->handle($psrRequest, $this->getBaseResponse());
233
        
234 2
        return $this->getResponseConvertor()->convert($psrResponse);
235
    }
236
}
237