Add test for service option exporter

This commit is contained in:
Dane Everitt 2017-10-04 23:42:04 -05:00
parent d95a63c09b
commit 609bf32843
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
4 changed files with 154 additions and 0 deletions

View file

@ -43,3 +43,31 @@ if (! function_exists('is_digit')) {
return is_bool($value) ? false : ctype_digit(strval($value));
}
}
if (! function_exists('object_get_strict')) {
/**
* Get an object using dot notation. An object key with a value of null is still considered valid
* and will not trigger the response of a default value (unlike object_get).
*
* @param object $object
* @param string $key
* @param null $default
* @return mixed
*/
function object_get_strict($object, $key, $default = null)
{
if (is_null($key) || trim($key) == '') {
return $object;
}
foreach (explode('.', $key) as $segment) {
if (! is_object($object) || ! property_exists($object, $segment)) {
return value($default);
}
$object = $object->{$segment};
}
return $object;
}
}

View file

@ -107,6 +107,7 @@ $factory->define(Pterodactyl\Models\ServiceOption::class, function (Faker\Genera
'service_id' => $faker->unique()->randomNumber(),
'name' => $faker->name,
'description' => implode(' ', $faker->sentences(3)),
'startup' => 'java -jar test.jar',
'tag' => 'test@testfactory.com:' . $faker->unique()->randomNumber(8),
];
});

View file

@ -0,0 +1,47 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
namespace Tests\Assertions;
use PHPUnit\Framework\Assert;
use PHPUnit_Util_InvalidArgumentHelper;
trait NestedObjectAssertionsTrait
{
/**
* Assert that an object value matches an expected value.
*
* @param string $key
* @param mixed $expected
* @param object $object
*/
public function assertObjectNestedValueEquals(string $key, $expected, $object)
{
if (! is_object($object)) {
throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'object');
}
Assert::assertEquals($expected, object_get_strict($object, $key, '__TEST_FAILURE'), 'Assert that an object value equals a provided value.');
}
/**
* Assert that an object contains a nested key.
*
* @param string $key
* @param object $object
*/
public function assertObjectHasNestedAttribute(string $key, $object)
{
if (! is_object($object)) {
throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
}
Assert::assertNotEquals('__TEST_FAILURE', object_get_strict($object, $key, '__TEST_FAILURE'), 'Assert that an object contains a nested key.');
}
}

View file

@ -0,0 +1,78 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
namespace Tests\Unit\Services\Services\Sharing;
use Mockery as m;
use Carbon\Carbon;
use Tests\TestCase;
use Pterodactyl\Models\ServiceOption;
use Pterodactyl\Models\ServiceVariable;
use Tests\Assertions\NestedObjectAssertionsTrait;
use Pterodactyl\Contracts\Repository\ServiceOptionRepositoryInterface;
use Pterodactyl\Services\Services\Sharing\ServiceOptionExporterService;
class ServiceOptionExporterServiceTest extends TestCase
{
use NestedObjectAssertionsTrait;
/**
* @var \Carbon\Carbon
*/
protected $carbon;
/**
* @var \Pterodactyl\Contracts\Repository\ServiceOptionRepositoryInterface|\Mockery\Mock
*/
protected $repository;
/**
* @var \Pterodactyl\Services\Services\Sharing\ServiceOptionExporterService
*/
protected $service;
/**
* Setup tests.
*/
public function setUp()
{
parent::setUp();
Carbon::setTestNow(Carbon::now());
$this->carbon = new Carbon();
$this->repository = m::mock(ServiceOptionRepositoryInterface::class);
$this->service = new ServiceOptionExporterService($this->carbon, $this->repository);
}
public function testJsonStructureIsExported()
{
$option = factory(ServiceOption::class)->make();
$option->variables = collect([$variable = factory(ServiceVariable::class)->make()]);
$this->repository->shouldReceive('getWithExportAttributes')->with($option->id)->once()->andReturn($option);
$response = $this->service->handle($option->id);
$this->assertNotEmpty($response);
$data = json_decode($response);
$this->assertEquals(JSON_ERROR_NONE, json_last_error());
$this->assertObjectHasNestedAttribute('meta.version', $data);
$this->assertObjectNestedValueEquals('meta.version', 'PTDL_v1', $data);
$this->assertObjectHasNestedAttribute('exported_at', $data);
$this->assertObjectNestedValueEquals('exported_at', Carbon::now()->toIso8601String(), $data);
$this->assertObjectHasNestedAttribute('scripts.installation.script', $data);
$this->assertObjectHasNestedAttribute('scripts.installation.container', $data);
$this->assertObjectHasNestedAttribute('scripts.installation.entrypoint', $data);
$this->assertObjectHasAttribute('variables', $data);
$this->assertArrayHasKey('0', $data->variables);
$this->assertObjectHasAttribute('name', $data->variables[0]);
$this->assertObjectNestedValueEquals('name', $variable->name, $data->variables[0]);
}
}