Failed Conditions
Pull Request — master (#3)
by Arnold
04:09
created

src/Connector.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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\GlobalEnvironmentInterface;
10
use Jasny\HttpMessage\OutputBufferStream;
11
use Jasny\RouterInterface;
12
use Jasny\Codeception\RequestConvertor;
13
use Jasny\Codeception\ResponseConvertor;
14
use Symfony\Component\BrowserKit\Client;
15
use Symfony\Component\BrowserKit\Request as BrowserKitRequest;
16
use Symfony\Component\BrowserKit\Response as BrowserKitResponse;
17
18
/**
19
 * Codeception connector for Jasny\MVC
20
 */
21
class Connector extends Client
22
{
23
    /**
24
     * @var Router
25
     */
26
    protected $router;
27
    
28
    /**
29
     * Request with the current global environent
30
     * @var ServerRequestInterface
31
     */
32
    protected $baseRequest;
33
    
34
    /**
35
     * Request with the current global environent
36
     * @var ResponseInterface
37
     */
38
    protected $baseResponse;
39
    
40
    /**
41
     * @var RequestConvertor
42
     */
43
    protected $requestConvertor;
44
    
45
    /**
46
     * @var ResponseConvertor
47
     */
48
    protected $responseConvertor;
49
    
50
    
51
    /**
52
     * Set the router
53
     * 
54
     * @param RouterInterface $router
55
     */
56 3
    public function setRouter(RouterInterface $router)
57
    {
58 3
        $this->router = $router;
0 ignored issues
show
Documentation Bug introduced by
It seems like $router of type object<Jasny\RouterInterface> is incompatible with the declared type object<Jasny\Codeception\Router> of property $router.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
59 3
    }
60
    
61
    /**
62
     * Get the router
63
     * 
64
     * @return RouterInterface
65
     */
66 4
    public function getRouter()
67
    {
68 4
        return $this->router;
69
    }
70
    
71
    
72
    /**
73
     * Set the base request
74
     * 
75
     * @param ServerRequestInterface $request
76
     */
77 5
    public function setBaseRequest(ServerRequestInterface $request)
78
    {
79 5
        if ($request instanceof GlobalEnvironmentInterface && $request->isStale()) {
80 1
            throw new \RuntimeException("Unable to set base request: ServerRequest is stale");
81
        }
82
        
83 4
        $this->baseRequest = $request;
84 4
    }
85
    
86
    /**
87
     * Get the base request
88
     * 
89
     * @return ServerRequestInterface
90
     */
91 5
    public function getBaseRequest()
92
    {
93 5
        if (!isset($this->baseRequest)) {
94 1
            $this->baseRequest = new ServerRequest();
95
        }
96
        
97 5
        return $this->baseRequest;
98
    }
99
    
100
    
101
    /**
102
     * Set the base response
103
     * 
104
     * @param ResponseInterface $response
105
     */
106 5
    public function setBaseResponse(ResponseInterface $response)
107
    {
108 5
        if ($response instanceof GlobalEnvironmentInterface && $response->isStale()) {
109 1
            throw new \RuntimeException("Unable to set base response: Response is stale");
110
        }
111
        
112 4
        $this->baseResponse = $response;
113 4
    }
114
    
115
    /**
116
     * Get the base response
117
     * 
118
     * @return ResponseInterface
119
     */
120 5
    public function getBaseResponse()
121
    {
122 5
        if (!isset($this->baseResponse)) {
123 1
            $this->baseResponse = new Response();
124
        }
125
        
126 5
        return $this->baseResponse;
127
    }
128
    
129
130
    /**
131
     * Reset the request
132
     */
133 3
    protected function resetInput()
134
    {
135 3
        if ($this->baseRequest instanceof GlobalEnvironmentInterface && $this->baseRequest->isStale()) {
136 1
            $this->baseRequest = $this->baseRequest->revive();
137
        }
138 3
    }
139
140
    /**
141
     * Reset the response
142
     */
143 3
    protected function resetOutput()
144
    {
145 3
        if ($this->baseResponse instanceof GlobalEnvironmentInterface && $this->baseResponse->isStale()) {
146 1
            $this->baseResponse = $this->baseResponse->revive();
147
        }
148
        
149
        // Clear output buffer
150 3
        if (isset($this->baseResponse) && $this->baseResponse->getBody() instanceof OutputBufferStream) {
151 1
            $this->baseResponse = $this->baseResponse->withBody(clone $this->baseResponse->getBody());
152
        }
153 3
    }
154
    
155
    /**
156
     * Reset the request and response.
157
     * This is only required when the request and/or response are bound to the global environment.
158
     */
159 3
    public function reset()
160
    {
161 3
        $this->resetInput();
162 3
        $this->resetOutput();
163 3
    }
164
165
    
166
    /**
167
     * Set the request convertor
168
     * 
169
     * @param RequestConvertor $convertor
170
     */
171 3
    public function setRequestConvertor(RequestConvertor $convertor)
172
    {
173 3
        $this->requestConvertor = $convertor;
174 3
    }
175
    
176
    /**
177
     * Get the request convertor
178
     * 
179
     * @return RequestConvertor
180
     */
181 4
    public function getRequestConvertor()
182
    {
183 4
        if (!isset($this->requestConvertor)) {
184 1
            $this->requestConvertor = new RequestConvertor();
185
        }
186
        
187 4
        return $this->requestConvertor;
188
    }
189
    
190
    
191
    /**
192
     * Set the response convertor
193
     * 
194
     * @param ResponseConvertor $convertor
195
     */
196 3
    public function setResponseConvertor(ResponseConvertor $convertor)
197
    {
198 3
        $this->responseConvertor = $convertor;
199 3
    }
200
    
201
    /**
202
     * Get the response convertor
203
     * 
204
     * @return ResponseConvertor
205
     */
206 4
    public function getResponseConvertor()
207
    {
208 4
        if (!isset($this->responseConvertor)) {
209 1
            $this->responseConvertor = new ResponseConvertor();
210
        }
211
        
212 4
        return $this->responseConvertor;
213
    }
214
    
215
    
216
    /**
217
     * Makes a request.
218
     * 
219
     * @param BrowserKitRequest $request
220
     * @return BrowserKitResponse
221
     */
222 3
    protected function doRequest($request)
223
    {
224 3
        if ($this->getRouter() === null) {
225 1
            throw new \BadMethodCallException("Router not set");
226
        }
227
        
228 2
        $this->reset(); // Reset before each HTTP request
229
        
230 2
        $psrRequest = $this->getRequestConvertor()->convert($request, $this->getBaseRequest());
231
        
232 2
        $router = $this->getRouter();
233 2
        $psrResponse = $router->handle($psrRequest, $this->getBaseResponse());
234
        
235 2
        return $this->getResponseConvertor()->convert($psrResponse);
236
    }
237
}
238