Skip to content

Commit 7b07c4e

Browse files
committed
Application: fixed empty $requests when createInitialRequest() failed, thx to @vlastavesely [Closes #163]
1 parent 5c84a11 commit 7b07c4e

File tree

2 files changed

+24
-28
lines changed

2 files changed

+24
-28
lines changed

src/Application/Application.php

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,21 +112,9 @@ public function run()
112112
public function createInitialRequest()
113113
{
114114
$request = $this->router->match($this->httpRequest);
115-
116115
if (!$request instanceof Request) {
117116
throw new BadRequestException('No route for HTTP request.');
118-
119-
} elseif (strcasecmp($request->getPresenterName(), $this->errorPresenter) === 0) {
120-
throw new BadRequestException('Invalid request. Presenter is not achievable.');
121-
}
122-
123-
try {
124-
$name = $request->getPresenterName();
125-
$this->presenterFactory->getPresenterClass($name);
126-
} catch (InvalidPresenterException $e) {
127-
throw new BadRequestException($e->getMessage(), 0, $e);
128117
}
129-
130118
return $request;
131119
}
132120

@@ -144,7 +132,15 @@ public function processRequest(Request $request)
144132
$this->requests[] = $request;
145133
$this->onRequest($this, $request);
146134

147-
$this->presenter = $this->presenterFactory->createPresenter($request->getPresenterName());
135+
if (!$request->isMethod($request::FORWARD) && !strcasecmp($request->getPresenterName(), $this->errorPresenter)) {
136+
throw new BadRequestException('Invalid request. Presenter is not achievable.');
137+
}
138+
139+
try {
140+
$this->presenter = $this->presenterFactory->createPresenter($request->getPresenterName());
141+
} catch (InvalidPresenterException $e) {
142+
throw count($this->requests) > 1 ? $e : new BadRequestException($e->getMessage(), 0, $e);
143+
}
148144
$this->onPresenter($this, $this->presenter);
149145
$response = $this->presenter->run(clone $request);
150146

tests/Application/Application.run.phpt

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,22 @@ test(function () use ($httpRequest, $httpResponse) {
109109
$app->run();
110110

111111
$requests = $app->getRequests();
112-
Assert::count(1, $requests);
113-
Assert::same(Request::FORWARD, $requests[0]->getMethod());
112+
Assert::count(2, $requests);
113+
Assert::same('GET', $requests[0]->getMethod());
114114
Assert::same('Error', $requests[0]->getPresenterName());
115+
Assert::same(Request::FORWARD, $requests[1]->getMethod());
116+
Assert::same('Error', $requests[1]->getPresenterName());
115117

116-
Assert::equal($requests[0], $errorPresenter->request);
117-
Assert::null($errorPresenter->request->getParameter('request'));
118+
Assert::equal($requests[1], $errorPresenter->request);
119+
Assert::equal($requests[0], $errorPresenter->request->getParameter('request'));
118120
Assert::type(BadRequestException::class, $errorPresenter->request->getParameter('exception'));
119121
});
120122

121123

122124
// missing presenter without error presenter
123125
Assert::exception(function () use ($httpRequest, $httpResponse) {
124126
$presenterFactory = Mockery::mock(IPresenterFactory::class);
125-
$presenterFactory->shouldReceive('getPresenterClass')->with('Missing')->andThrow(Nette\Application\InvalidPresenterException::class);
127+
$presenterFactory->shouldReceive('createPresenter')->with('Missing')->andThrow(Nette\Application\InvalidPresenterException::class);
126128

127129
$router = Mockery::mock(IRouter::class);
128130
$router->shouldReceive('match')->andReturn(new Request('Missing', 'GET'));
@@ -137,7 +139,7 @@ test(function () use ($httpRequest, $httpResponse) {
137139
$errorPresenter = new ErrorPresenter;
138140

139141
$presenterFactory = Mockery::mock(IPresenterFactory::class);
140-
$presenterFactory->shouldReceive('getPresenterClass')->with('Missing')->andThrow(Nette\Application\InvalidPresenterException::class);
142+
$presenterFactory->shouldReceive('createPresenter')->with('Missing')->andThrow(Nette\Application\InvalidPresenterException::class);
141143
$presenterFactory->shouldReceive('createPresenter')->with('Error')->andReturn($errorPresenter);
142144

143145
$router = Mockery::mock(IRouter::class);
@@ -149,20 +151,21 @@ test(function () use ($httpRequest, $httpResponse) {
149151
$app->run();
150152

151153
$requests = $app->getRequests();
152-
Assert::count(1, $requests);
153-
Assert::same(Request::FORWARD, $requests[0]->getMethod());
154-
Assert::same('Error', $requests[0]->getPresenterName());
154+
Assert::count(2, $requests);
155+
Assert::same('GET', $requests[0]->getMethod());
156+
Assert::same('Missing', $requests[0]->getPresenterName());
157+
Assert::same(Request::FORWARD, $requests[1]->getMethod());
158+
Assert::same('Error', $requests[1]->getPresenterName());
155159

156-
Assert::equal($requests[0], $errorPresenter->request);
157-
Assert::null($errorPresenter->request->getParameter('request'));
160+
Assert::equal($requests[1], $errorPresenter->request);
161+
Assert::equal($requests[0], $errorPresenter->request->getParameter('request'));
158162
Assert::type(BadRequestException::class, $errorPresenter->request->getParameter('exception'));
159163
});
160164

161165

162166
// presenter error without error presenter
163167
Assert::exception(function () use ($httpRequest, $httpResponse) {
164168
$presenterFactory = Mockery::mock(IPresenterFactory::class);
165-
$presenterFactory->shouldReceive('getPresenterClass');
166169
$presenterFactory->shouldReceive('createPresenter')->with('Bad')->andReturn(new BadPresenter);
167170

168171
$router = Mockery::mock(IRouter::class);
@@ -178,7 +181,6 @@ test(function () use ($httpRequest, $httpResponse) {
178181
$errorPresenter = new ErrorPresenter;
179182

180183
$presenterFactory = Mockery::mock(IPresenterFactory::class);
181-
$presenterFactory->shouldReceive('getPresenterClass');
182184
$presenterFactory->shouldReceive('createPresenter')->with('Bad')->andReturn(new BadPresenter);
183185
$presenterFactory->shouldReceive('createPresenter')->with('Error')->andReturn($errorPresenter);
184186

@@ -208,7 +210,6 @@ Assert::noError(function () use ($httpRequest, $httpResponse) {
208210
$presenter = new GoodPresenter;
209211

210212
$presenterFactory = Mockery::mock(IPresenterFactory::class);
211-
$presenterFactory->shouldReceive('getPresenterClass');
212213
$presenterFactory->shouldReceive('createPresenter')->with('Good')->andReturn($presenter);
213214

214215
$router = Mockery::mock(IRouter::class);
@@ -232,7 +233,6 @@ Assert::noError(function () use ($httpRequest, $httpResponse) {
232233
$errorPresenter = new ErrorPresenter;
233234

234235
$presenterFactory = Mockery::mock(IPresenterFactory::class);
235-
$presenterFactory->shouldReceive('getPresenterClass');
236236
$presenterFactory->shouldReceive('createPresenter')->with('Good')->andReturn($presenter);
237237
$presenterFactory->shouldReceive('createPresenter')->with('Error')->andReturn($errorPresenter);
238238

0 commit comments

Comments
 (0)