Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/tests/Integration/Api/Client/ClientApiIntegrationTestCase.php
7459 views
1
<?php
2
3
namespace Pterodactyl\Tests\Integration\Api\Client;
4
5
use Pterodactyl\Models\Node;
6
use Pterodactyl\Models\Task;
7
use Pterodactyl\Models\User;
8
use Pterodactyl\Models\Model;
9
use Pterodactyl\Models\Backup;
10
use Pterodactyl\Models\Server;
11
use Pterodactyl\Models\Database;
12
use Pterodactyl\Models\Location;
13
use Pterodactyl\Models\Schedule;
14
use Illuminate\Support\Collection;
15
use Pterodactyl\Models\Allocation;
16
use Pterodactyl\Models\DatabaseHost;
17
use Pterodactyl\Tests\Integration\TestResponse;
18
use Pterodactyl\Tests\Integration\IntegrationTestCase;
19
use Illuminate\Database\Eloquent\Model as EloquentModel;
20
use Pterodactyl\Transformers\Api\Client\BaseClientTransformer;
21
22
abstract class ClientApiIntegrationTestCase extends IntegrationTestCase
23
{
24
/**
25
* Cleanup after running tests.
26
*/
27
protected function tearDown(): void
28
{
29
Database::query()->forceDelete();
30
DatabaseHost::query()->forceDelete();
31
Backup::query()->forceDelete();
32
Server::query()->forceDelete();
33
Node::query()->forceDelete();
34
Location::query()->forceDelete();
35
User::query()->forceDelete();
36
37
parent::tearDown();
38
}
39
40
/**
41
* Override the default createTestResponse from Illuminate so that we can
42
* just dump 500-level errors to the screen in the tests without having
43
* to keep re-assigning variables.
44
*
45
* @param \Illuminate\Http\Response $response
46
* @param \Illuminate\Http\Request $request
47
*
48
* @return \Illuminate\Testing\TestResponse
49
*/
50
protected function createTestResponse($response, $request)
51
{
52
return TestResponse::fromBaseResponse($response, $request);
53
}
54
55
/**
56
* Returns a link to the specific resource using the client API.
57
*/
58
protected function link(mixed $model, ?string $append = null): string
59
{
60
switch (get_class($model)) {
61
case Server::class:
62
$link = "/api/client/servers/$model->uuid";
63
break;
64
case Schedule::class:
65
$link = "/api/client/servers/{$model->server->uuid}/schedules/$model->id";
66
break;
67
case Task::class:
68
$link = "/api/client/servers/{$model->schedule->server->uuid}/schedules/{$model->schedule->id}/tasks/$model->id";
69
break;
70
case Allocation::class:
71
$link = "/api/client/servers/{$model->server->uuid}/network/allocations/$model->id";
72
break;
73
case Backup::class:
74
$link = "/api/client/servers/{$model->server->uuid}/backups/$model->uuid";
75
break;
76
default:
77
throw new \InvalidArgumentException(sprintf('Cannot create link for Model of type %s', class_basename($model)));
78
}
79
80
return $link . ($append ? '/' . ltrim($append, '/') : '');
81
}
82
83
/**
84
* Asserts that the data passed through matches the output of the data from the transformer. This
85
* will remove the "relationships" key when performing the comparison.
86
*/
87
protected function assertJsonTransformedWith(array $data, Model|EloquentModel $model)
88
{
89
$reflect = new \ReflectionClass($model);
90
$transformer = sprintf('\\Pterodactyl\\Transformers\\Api\\Client\\%sTransformer', $reflect->getShortName());
91
92
$transformer = new $transformer();
93
$this->assertInstanceOf(BaseClientTransformer::class, $transformer);
94
95
$this->assertSame(
96
$transformer->transform($model),
97
Collection::make($data)->except(['relationships'])->toArray()
98
);
99
}
100
}
101
102