Skip to content

Commit 54228e8

Browse files
committed
Fix multiple controller unit test failures
1 parent 7b3393a commit 54228e8

File tree

9 files changed

+402
-315
lines changed

9 files changed

+402
-315
lines changed

app/Http/Controllers/Server/SubuserController.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public function view(Request $request): View
128128
*/
129129
public function update(SubuserUpdateFormRequest $request, string $uuid, string $hash): RedirectResponse
130130
{
131-
$this->subuserUpdateService->handle($request->attributes->get('subuser'), $request->input('permissions'));
131+
$this->subuserUpdateService->handle($request->attributes->get('subuser'), $request->input('permissions', []));
132132
$this->alert->success(trans('server.users.user_updated'))->flash();
133133

134134
return redirect()->route('server.subusers.view', ['uuid' => $uuid, 'subuser' => $hash]);
@@ -154,7 +154,6 @@ public function create(Request $request): View
154154
* Handles creating a new subuser.
155155
*
156156
* @param \Pterodactyl\Http\Requests\Server\Subuser\SubuserStoreFormRequest $request
157-
* @param string $uuid
158157
* @return \Illuminate\Http\RedirectResponse
159158
*
160159
* @throws \Exception
@@ -164,15 +163,15 @@ public function create(Request $request): View
164163
* @throws \Pterodactyl\Exceptions\Service\Subuser\ServerSubuserExistsException
165164
* @throws \Pterodactyl\Exceptions\Service\Subuser\UserIsServerOwnerException
166165
*/
167-
public function store(SubuserStoreFormRequest $request, $uuid): RedirectResponse
166+
public function store(SubuserStoreFormRequest $request): RedirectResponse
168167
{
169168
$server = $request->attributes->get('server');
170169

171-
$subuser = $this->subuserCreationService->handle($server, $request->input('email'), $request->input('permissions'));
170+
$subuser = $this->subuserCreationService->handle($server, $request->input('email'), $request->input('permissions', []));
172171
$this->alert->success(trans('server.users.user_assigned'))->flash();
173172

174173
return redirect()->route('server.subusers.view', [
175-
'uuid' => $uuid,
174+
'uuid' => $server->uuid,
176175
'id' => $subuser->id,
177176
]);
178177
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
namespace Tests\Traits\Http;
4+
5+
use Mockery as m;
6+
use Illuminate\Http\Request;
7+
use Pterodactyl\Models\User;
8+
use InvalidArgumentException;
9+
use Symfony\Component\HttpFoundation\ParameterBag;
10+
11+
trait RequestMockHelpers
12+
{
13+
/**
14+
* @var string
15+
*/
16+
private $requestMockClass = Request::class;
17+
18+
/**
19+
* @var \Illuminate\Http\Request|\Mockery\Mock
20+
*/
21+
protected $request;
22+
23+
/**
24+
* Set the class to mock for requests.
25+
*
26+
* @param string $class
27+
*/
28+
public function setRequestMockClass(string $class)
29+
{
30+
$this->requestMockClass = $class;
31+
32+
$this->buildRequestMock();
33+
}
34+
35+
/**
36+
* Set the active request object to be an instance of a mocked request.
37+
*/
38+
protected function buildRequestMock()
39+
{
40+
$this->request = m::mock($this->requestMockClass);
41+
if (! $this->request instanceof Request) {
42+
throw new InvalidArgumentException('First argument passed to buildRequestMock must be an instance of \Illuminate\Http\Request when mocked.');
43+
}
44+
45+
$this->request->attributes = new ParameterBag();
46+
}
47+
48+
/**
49+
* Set a request attribute on the mock object.
50+
*
51+
* @param string $attribute
52+
* @param mixed $value
53+
*/
54+
protected function setRequestAttribute(string $attribute, $value)
55+
{
56+
$this->request->attributes->set($attribute, $value);
57+
}
58+
59+
/**
60+
* Sets the mocked request user. If a user model is not provided, a factory model
61+
* will be created and returned.
62+
*
63+
* @param \Pterodactyl\Models\User|null $user
64+
* @return \Pterodactyl\Models\User
65+
*/
66+
protected function setRequestUser(User $user = null): User
67+
{
68+
$user = $user instanceof User ? $user : factory(User::class)->make();
69+
$this->request->shouldReceive('user')->withNoArgs()->andReturn($user);
70+
71+
return $user;
72+
}
73+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
namespace Tests\Unit\Http\Controllers;
4+
5+
use Mockery as m;
6+
use Tests\TestCase;
7+
use Tests\Traits\Http\RequestMockHelpers;
8+
use Tests\Assertions\ControllerAssertionsTrait;
9+
10+
abstract class ControllerTestCase extends TestCase
11+
{
12+
use ControllerAssertionsTrait, RequestMockHelpers;
13+
14+
/**
15+
* @var \Pterodactyl\Http\Controllers\Controller|\Mockery\Mock
16+
*/
17+
private $controller;
18+
19+
/**
20+
* Setup tests.
21+
*/
22+
public function setUp()
23+
{
24+
parent::setUp();
25+
26+
$this->buildRequestMock();
27+
}
28+
29+
/**
30+
* Set an instance of the controller.
31+
*
32+
* @param \Pterodactyl\Http\Controllers\Controller|\Mockery\Mock $controller
33+
*/
34+
public function setControllerInstance($controller)
35+
{
36+
$this->controller = $controller;
37+
}
38+
39+
/**
40+
* Return an instance of the controller.
41+
*
42+
* @return \Mockery\Mock|\Pterodactyl\Http\Controllers\Controller
43+
*/
44+
public function getControllerInstance()
45+
{
46+
return $this->controller;
47+
}
48+
49+
/**
50+
* Helper function to mock injectJavascript requests.
51+
*
52+
* @param array|null $args
53+
* @param bool $subset
54+
*/
55+
protected function mockInjectJavascript(array $args = null, bool $subset = false)
56+
{
57+
$controller = $this->getControllerInstance();
58+
59+
$controller->shouldReceive('setRequest')->with($this->request)->once()->andReturnSelf();
60+
if (is_null($args)) {
61+
$controller->shouldReceive('injectJavascript')->withAnyArgs()->once()->andReturnNull();
62+
} else {
63+
$with = $subset ? m::subset($args) : $args;
64+
65+
$controller->shouldReceive('injectJavascript')->with($with)->once()->andReturnNull();
66+
}
67+
}
68+
69+
/**
70+
* Build and return a mocked controller instance to use for testing.
71+
*
72+
* @param string $class
73+
* @param array $args
74+
* @return \Mockery\Mock|\Pterodactyl\Http\Controllers\Controller
75+
*/
76+
protected function buildMockedController(string $class, array $args = [])
77+
{
78+
$controller = m::mock($class, $args)->makePartial();
79+
80+
if (is_null($this->getControllerInstance())) {
81+
$this->setControllerInstance($controller);
82+
}
83+
84+
return $this->getControllerInstance();
85+
}
86+
}

tests/Unit/Http/Controllers/Server/ConsoleControllerTest.php

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,18 @@
1010
namespace Tests\Unit\Http\Controllers\Server;
1111

1212
use Mockery as m;
13-
use Tests\TestCase;
1413
use Pterodactyl\Models\Server;
15-
use Illuminate\Contracts\Session\Session;
1614
use Illuminate\Contracts\Config\Repository;
17-
use Tests\Assertions\ControllerAssertionsTrait;
15+
use Tests\Unit\Http\Controllers\ControllerTestCase;
1816
use Pterodactyl\Http\Controllers\Server\ConsoleController;
1917

20-
class ConsoleControllerTest extends TestCase
18+
class ConsoleControllerTest extends ControllerTestCase
2119
{
22-
use ControllerAssertionsTrait;
23-
2420
/**
25-
* @var \Illuminate\Contracts\Config\Repository
21+
* @var \Illuminate\Contracts\Config\Repository|\Mockery\Mock
2622
*/
2723
protected $config;
2824

29-
/**
30-
* @var \Pterodactyl\Http\Controllers\Server\ConsoleController
31-
*/
32-
protected $controller;
33-
34-
/**
35-
* @var \Illuminate\Contracts\Session\Session
36-
*/
37-
protected $session;
38-
3925
/**
4026
* Setup tests.
4127
*/
@@ -44,9 +30,6 @@ public function setUp()
4430
parent::setUp();
4531

4632
$this->config = m::mock(Repository::class);
47-
$this->session = m::mock(Session::class);
48-
49-
$this->controller = m::mock(ConsoleController::class, [$this->config, $this->session])->makePartial();
5033
}
5134

5235
/**
@@ -56,16 +39,15 @@ public function setUp()
5639
*/
5740
public function testAllControllers($function, $view)
5841
{
42+
$controller = $this->getController();
5943
$server = factory(Server::class)->make();
44+
$this->setRequestAttribute('server', $server);
45+
$this->mockInjectJavascript();
6046

61-
if ($function === 'index') {
62-
$this->session->shouldReceive('get')->with('server_data.model')->once()->andReturn($server);
63-
}
6447
$this->config->shouldReceive('get')->with('pterodactyl.console.count')->once()->andReturn(100);
6548
$this->config->shouldReceive('get')->with('pterodactyl.console.frequency')->once()->andReturn(10);
66-
$this->controller->shouldReceive('injectJavascript')->once()->andReturnNull();
6749

68-
$response = $this->controller->$function();
50+
$response = $controller->$function($this->request);
6951
$this->assertIsViewResponse($response);
7052
$this->assertViewNameEquals($view, $response);
7153
}
@@ -82,4 +64,14 @@ public function controllerDataProvider()
8264
['console', 'server.console'],
8365
];
8466
}
67+
68+
/**
69+
* Return a mocked instance of the controller to allow access to authorization functionality.
70+
*
71+
* @return \Pterodactyl\Http\Controllers\Server\ConsoleController|\Mockery\Mock
72+
*/
73+
private function getController()
74+
{
75+
return $this->buildMockedController(ConsoleController::class, [$this->config]);
76+
}
8577
}

tests/Unit/Http/Controllers/Server/Files/DownloadControllerTest.php

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,22 @@
1010
namespace Tests\Unit\Http\Controllers\Server\Files;
1111

1212
use Mockery as m;
13-
use Tests\TestCase;
1413
use phpmock\phpunit\PHPMock;
1514
use Pterodactyl\Models\Node;
1615
use Pterodactyl\Models\Server;
1716
use Illuminate\Cache\Repository;
18-
use Illuminate\Contracts\Session\Session;
19-
use Tests\Assertions\ControllerAssertionsTrait;
17+
use Tests\Unit\Http\Controllers\ControllerTestCase;
2018
use Pterodactyl\Http\Controllers\Server\Files\DownloadController;
2119

22-
class DownloadControllerTest extends TestCase
20+
class DownloadControllerTest extends ControllerTestCase
2321
{
24-
use ControllerAssertionsTrait, PHPMock;
22+
use PHPMock;
2523

2624
/**
27-
* @var \Illuminate\Cache\Repository
25+
* @var \Illuminate\Cache\Repository|\Mockery\Mock
2826
*/
2927
protected $cache;
3028

31-
/**
32-
* @var \Pterodactyl\Http\Controllers\Server\Files\DownloadController
33-
*/
34-
protected $controller;
35-
36-
/**
37-
* @var \Illuminate\Contracts\Session\Session
38-
*/
39-
protected $session;
40-
4129
/**
4230
* Setup tests.
4331
*/
@@ -46,32 +34,40 @@ public function setUp()
4634
parent::setUp();
4735

4836
$this->cache = m::mock(Repository::class);
49-
$this->session = m::mock(Session::class);
50-
51-
$this->controller = m::mock(DownloadController::class, [$this->cache, $this->session])->makePartial();
5237
}
5338

5439
/**
5540
* Test the download controller redirects correctly.
5641
*/
5742
public function testIndexController()
5843
{
44+
$controller = $this->getController();
5945
$server = factory(Server::class)->make();
60-
$node = factory(Node::class)->make();
61-
$server->node = $node;
46+
$server->setRelation('node', factory(Node::class)->make());
6247

63-
$this->session->shouldReceive('get')->with('server_data.model')->once()->andReturn($server);
64-
$this->controller->shouldReceive('authorize')->with('download-files', $server)->once()->andReturnNull();
48+
$this->setRequestAttribute('server', $server);
49+
50+
$controller->shouldReceive('authorize')->with('download-files', $server)->once()->andReturnNull();
6551
$this->getFunctionMock('\\Pterodactyl\\Http\\Controllers\\Server\\Files', 'str_random')
6652
->expects($this->once())->willReturn('randomString');
6753

68-
$this->cache->shouldReceive('tags')->with(['Server:Downloads'])->once()->andReturnSelf()
69-
->shouldReceive('put')->with('randomString', ['server' => $server->uuid, 'path' => '/my/file.txt'], 5)->once()->andReturnNull();
54+
$this->cache->shouldReceive('tags')->with(['Server:Downloads'])->once()->andReturnSelf();
55+
$this->cache->shouldReceive('put')->with('randomString', ['server' => $server->uuid, 'path' => '/my/file.txt'], 5)->once()->andReturnNull();
7056

71-
$response = $this->controller->index('1234', '/my/file.txt');
57+
$response = $controller->index($this->request, $server->uuidShort, '/my/file.txt');
7258
$this->assertIsRedirectResponse($response);
7359
$this->assertRedirectUrlEquals(sprintf(
7460
'%s://%s:%s/v1/server/file/download/%s', $server->node->scheme, $server->node->fqdn, $server->node->daemonListen, 'randomString'
7561
), $response);
7662
}
63+
64+
/**
65+
* Return a mocked instance of the controller to allow access to authorization functionality.
66+
*
67+
* @return \Pterodactyl\Http\Controllers\Server\Files\DownloadController|\Mockery\Mock
68+
*/
69+
private function getController()
70+
{
71+
return $this->buildMockedController(DownloadController::class, [$this->cache]);
72+
}
7773
}

0 commit comments

Comments
 (0)