pelican-panel-mirror/tests/Integration/Services/Servers/VariableValidatorServiceTest.php
Boy132 c2b1a98d29
Convert variable "rules" to array (#507)
* convert variable "rules" to array

* allow importing eggs with string rules

* fix tests

* update stock eggs to rules array
2024-08-19 08:33:53 +02:00

143 lines
5.2 KiB
PHP

<?php
namespace App\Tests\Integration\Services\Servers;
use App\Models\Egg;
use App\Models\User;
use Illuminate\Support\Collection;
use Illuminate\Validation\ValidationException;
use App\Tests\Integration\IntegrationTestCase;
use App\Services\Servers\VariableValidatorService;
class VariableValidatorServiceTest extends IntegrationTestCase
{
protected Egg $egg;
protected function setUp(): void
{
parent::setUp();
/* @noinspection PhpFieldAssignmentTypeMismatchInspection */
$this->egg = Egg::query()
->where('author', 'panel@example.com')
->where('name', 'Bungeecord')
->firstOrFail();
}
/**
* Test that environment variables for a server are validated as expected.
*/
public function testEnvironmentVariablesCanBeValidated(): void
{
$egg = $this->cloneEggAndVariables($this->egg);
try {
$this->getService()->handle($egg->id, [
'BUNGEE_VERSION' => '1.2.3',
]);
$this->fail('This statement should not be reached.');
} catch (ValidationException $exception) {
$errors = $exception->errors();
$this->assertCount(2, $errors);
$this->assertArrayHasKey('environment.BUNGEE_VERSION', $errors);
$this->assertArrayHasKey('environment.SERVER_JARFILE', $errors);
$this->assertSame('The Bungeecord Version variable may only contain letters and numbers.', $errors['environment.BUNGEE_VERSION'][0]);
$this->assertSame('The Bungeecord Jar File variable field is required.', $errors['environment.SERVER_JARFILE'][0]);
}
$response = $this->getService()->handle($egg->id, [
'BUNGEE_VERSION' => '1234',
'SERVER_JARFILE' => 'server.jar',
]);
$this->assertInstanceOf(Collection::class, $response);
$this->assertCount(2, $response);
$this->assertSame('BUNGEE_VERSION', $response->get(0)->key);
$this->assertSame('1234', $response->get(0)->value);
$this->assertSame('SERVER_JARFILE', $response->get(1)->key);
$this->assertSame('server.jar', $response->get(1)->value);
}
/**
* Test that variables that are user_editable=false do not get validated (or returned) by
* the handler.
*/
public function testNormalUserCannotValidateNonUserEditableVariables(): void
{
$egg = $this->cloneEggAndVariables($this->egg);
$egg->variables()->first()->update([
'user_editable' => false,
]);
$response = $this->getService()->handle($egg->id, [
// This is an invalid value, but it shouldn't cause any issues since it should be skipped.
'BUNGEE_VERSION' => '1.2.3',
'SERVER_JARFILE' => 'server.jar',
]);
$this->assertInstanceOf(Collection::class, $response);
$this->assertCount(1, $response);
$this->assertSame('SERVER_JARFILE', $response->get(0)->key);
$this->assertSame('server.jar', $response->get(0)->value);
}
public function testEnvironmentVariablesCanBeUpdatedAsAdmin(): void
{
$egg = $this->cloneEggAndVariables($this->egg);
$egg->variables()->first()->update([
'user_editable' => false,
]);
try {
$this->getService()->setUserLevel(User::USER_LEVEL_ADMIN)->handle($egg->id, [
'BUNGEE_VERSION' => '1.2.3',
'SERVER_JARFILE' => 'server.jar',
]);
$this->fail('This statement should not be reached.');
} catch (ValidationException $exception) {
$this->assertCount(1, $exception->errors());
$this->assertArrayHasKey('environment.BUNGEE_VERSION', $exception->errors());
}
$response = $this->getService()->setUserLevel(User::USER_LEVEL_ADMIN)->handle($egg->id, [
'BUNGEE_VERSION' => '123',
'SERVER_JARFILE' => 'server.jar',
]);
$this->assertInstanceOf(Collection::class, $response);
$this->assertCount(2, $response);
$this->assertSame('BUNGEE_VERSION', $response->get(0)->key);
$this->assertSame('123', $response->get(0)->value);
$this->assertSame('SERVER_JARFILE', $response->get(1)->key);
$this->assertSame('server.jar', $response->get(1)->value);
}
public function testNullableEnvironmentVariablesCanBeUsedCorrectly(): void
{
$egg = $this->cloneEggAndVariables($this->egg);
$egg->variables()->where('env_variable', '!=', 'BUNGEE_VERSION')->delete();
$egg->variables()->update(['rules' => ['nullable', 'string']]);
$response = $this->getService()->handle($egg->id, []);
$this->assertCount(1, $response);
$this->assertNull($response->get(0)->value);
$response = $this->getService()->handle($egg->id, ['BUNGEE_VERSION' => null]);
$this->assertCount(1, $response);
$this->assertNull($response->get(0)->value);
$response = $this->getService()->handle($egg->id, ['BUNGEE_VERSION' => '']);
$this->assertCount(1, $response);
$this->assertSame('', $response->get(0)->value);
}
private function getService(): VariableValidatorService
{
return $this->app->make(VariableValidatorService::class);
}
}