Completed
Push — master ( c8d98f...994181 )
by Arnold
12s
created

Connector::setBaseResponse()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 4
nc 2
nop 1
crap 3
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 RouterInterface
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;
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 6
    public function setBaseRequest(ServerRequestInterface $request)
78
    {
79 6
        if ($request instanceof GlobalEnvironmentInterface && $request->isStale()) {
80 1
            throw new \RuntimeException("Unable to set base request: ServerRequest is stale");
81
        }
82
        
83 5
        $this->baseRequest = $request;
84 5
    }
85
    
86
    /**
87
     * Get the base request
88
     * 
89
     * @return ServerRequestInterface
90
     */
91 5 View Code Duplication
    public function getBaseRequest()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
92
    {
93 5
        if (!isset($this->baseRequest)) {
94 1
            $this->baseRequest = new ServerRequest();
95
        }
96
        
97 5
        $request = $this->baseRequest;
98
        
99 5
        if ($request instanceof GlobalEnvironmentInterface && $request->isStale() === false) {
100 1
            $request = $request->withGlobalEnvironment(true); // Make sure base request is stale
101
        }
102
        
103 5
        return $request;
104
    }
105
    
106
    
107
    /**
108
     * Set the base response
109
     * 
110
     * @param ResponseInterface $response
111
     */
112 6
    public function setBaseResponse(ResponseInterface $response)
113
    {
114 6
        if ($response instanceof GlobalEnvironmentInterface && $response->isStale()) {
115 1
            throw new \RuntimeException("Unable to set base response: Response is stale");
116
        }
117
        
118 5
        $this->baseResponse = $response;
119 5
    }
120
    
121
    /**
122
     * Get the base response
123
     * 
124
     * @return ResponseInterface
125
     */
126 5 View Code Duplication
    public function getBaseResponse()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
127
    {
128 5
        if (!isset($this->baseResponse)) {
129 1
            $this->baseResponse = new Response();
130
        }
131
        
132 5
        $response = $this->baseResponse;
133
        
134 5
        if ($response instanceof GlobalEnvironmentInterface && $response->isStale() === false) {
135 1
            $response = $response->withGlobalEnvironment(true); // Make sure base response is stale
136
        }
137
        
138 5
        return $response;
139
    }
140
    
141
142
    /**
143
     * Reset the request
144
     */
145 3
    protected function resetInput()
146
    {
147 3
        if ($this->baseRequest instanceof GlobalEnvironmentInterface) {
148 1
            $this->baseRequest = $this->baseRequest->revive();
149
        }
150 3
    }
151
152
    /**
153
     * Reset the response
154
     */
155 3
    protected function resetOutput()
156
    {
157 3
        if ($this->baseResponse instanceof GlobalEnvironmentInterface) {
158 1
            $this->baseResponse = $this->baseResponse->revive();
159
        }
160
        
161
        // Clear output buffer
162 3
        if (isset($this->baseResponse) && $this->baseResponse->getBody() instanceof OutputBufferStream) {
163 1
            $this->baseResponse = $this->baseResponse->withBody(clone $this->baseResponse->getBody());
164
        }
165 3
    }
166
    
167
    /**
168
     * Reset the request and response.
169
     * This is only required when the request and/or response are bound to the global environment.
170
     */
171 3
    public function reset()
172
    {
173 3
        $this->resetInput();
174 3
        $this->resetOutput();
175 3
    }
176
177
    
178
    /**
179
     * Set the request convertor
180
     * 
181
     * @param RequestConvertor $convertor
182
     */
183 3
    public function setRequestConvertor(RequestConvertor $convertor)
184
    {
185 3
        $this->requestConvertor = $convertor;
186 3
    }
187
    
188
    /**
189
     * Get the request convertor
190
     * 
191
     * @return RequestConvertor
192
     */
193 4
    public function getRequestConvertor()
194
    {
195 4
        if (!isset($this->requestConvertor)) {
196 1
            $this->requestConvertor = new RequestConvertor();
197
        }
198
        
199 4
        return $this->requestConvertor;
200
    }
201
    
202
    
203
    /**
204
     * Set the response convertor
205
     * 
206
     * @param ResponseConvertor $convertor
207
     */
208 3
    public function setResponseConvertor(ResponseConvertor $convertor)
209
    {
210 3
        $this->responseConvertor = $convertor;
211 3
    }
212
    
213
    /**
214
     * Get the response convertor
215
     * 
216
     * @return ResponseConvertor
217
     */
218 4
    public function getResponseConvertor()
219
    {
220 4
        if (!isset($this->responseConvertor)) {
221 1
            $this->responseConvertor = new ResponseConvertor();
222
        }
223
        
224 4
        return $this->responseConvertor;
225
    }
226
    
227
    
228
    /**
229
     * Makes a request.
230
     * 
231
     * @param BrowserKitRequest $request
232
     * @return BrowserKitResponse
233
     */
234 3
    protected function doRequest($request)
235
    {
236 3
        if ($this->getRouter() === null) {
237 1
            throw new \BadMethodCallException("Router not set");
238
        }
239
        
240 2
        $this->reset(); // Reset before each HTTP request
241
        
242 2
        $psrRequest = $this->getRequestConvertor()->convert($request, $this->getBaseRequest());
243
        
244 2
        $router = $this->getRouter();
245 2
        $psrResponse = $router->handle($psrRequest, $this->getBaseResponse());
246
        
247 2
        return $this->getResponseConvertor()->convert($psrResponse);
248
    }
249
}
250