General improvements to testing environment and removed clutter (#36)
This commit is contained in:
parent
de00a3c5d4
commit
bfdbe62cd7
12 changed files with 109 additions and 63 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -13,3 +13,6 @@ Homestead.json
|
||||||
Homestead.yaml
|
Homestead.yaml
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
|
.gitignore
|
||||||
|
.env.dev
|
||||||
|
.env.testing
|
||||||
|
|
21
BUILDING.md
21
BUILDING.md
|
@ -14,3 +14,24 @@ php artisan key:generate --force
|
||||||
php artisan storage:link
|
php artisan storage:link
|
||||||
php artisan migrate --seed --force
|
php artisan migrate --seed --force
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Setting up testing environment
|
||||||
|
|
||||||
|
Change the .env.testing file to your needs. Then once done you need to go into your phpmyadmin to create a new database named __controlpanel_test__.
|
||||||
|
Visit http://127.0.0.1:8080/ and create your database.
|
||||||
|
|
||||||
|
Now you're ready to run the following commands which switches to the testing config, migrates the test database and seeds it.
|
||||||
|
After that you can switch back to your dev environment again. Clear the config from cache so changes will be instantly available.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
php artisan migrate --env=testing
|
||||||
|
php artisan db:seed --env=testing
|
||||||
|
php artisan config:cache --env=dev
|
||||||
|
php artisan config:clear
|
||||||
|
```
|
||||||
|
|
||||||
|
Now when running tests with PHPUnit it will use your testing database and not your local development one.
|
||||||
|
This is configured in the __phpunit.xml__. You can run your tests by running the command like this. Just type and enter.
|
||||||
|
`./vendor/bin/phpunit`. If you don't want to type that all the time you can also use my shortcut `bin/test.sh`
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,14 +25,17 @@ class Pterodactyl
|
||||||
])->baseUrl(env('PTERODACTYL_URL') . '/api');
|
])->baseUrl(env('PTERODACTYL_URL') . '/api');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: Extend error handling (maybe logger for more errors when debugging)
|
||||||
/**
|
/**
|
||||||
* Get user by pterodactyl id
|
* Get user by pterodactyl id
|
||||||
* @param int $pterodactylId
|
* @param int $pterodactylId
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public static function getUser(int $pterodactylId){
|
public function getUser(int $pterodactylId){
|
||||||
$response = self::client()->get("/application/users/{$pterodactylId}");
|
$response = self::client()->get("/application/users/{$pterodactylId}");
|
||||||
if ($response->failed()) return null;
|
if ($response->failed()) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
return $response->json()['attributes'];
|
return $response->json()['attributes'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,14 +23,17 @@ class MakeUserCommand extends Command
|
||||||
*/
|
*/
|
||||||
protected $description = 'Create an admin account with the Artisan Console';
|
protected $description = 'Create an admin account with the Artisan Console';
|
||||||
|
|
||||||
|
private Pterodactyl $pterodactyl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new command instance.
|
* Create a new command instance.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct(Pterodactyl $pterodactyl)
|
||||||
{
|
{
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
|
$this->pterodactyl = $pterodactyl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -44,17 +47,16 @@ class MakeUserCommand extends Command
|
||||||
$password = $this->option('password') ?? $this->ask('Please specify your password.');
|
$password = $this->option('password') ?? $this->ask('Please specify your password.');
|
||||||
|
|
||||||
if (strlen($password) < 8) {
|
if (strlen($password) < 8) {
|
||||||
print_r('Your password need to be at least 8 characters long');
|
$this->alert('Your password need to be at least 8 characters long');
|
||||||
|
return 0;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$response = Pterodactyl::getUser($ptero_id);
|
//TODO: Do something with response (check for status code and give hints based upon that)
|
||||||
|
$response = $this->pterodactyl->getUser($ptero_id);
|
||||||
|
|
||||||
if (is_null($response)) {
|
if ($response === []) {
|
||||||
print_r('It seems that your Pterodactyl ID isnt correct. Rerun the command and input an correct ID');
|
$this->alert('It seems that your Pterodactyl ID is not correct. Rerun the command and input an correct ID');
|
||||||
|
return 0;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$user = User::create([
|
$user = User::create([
|
||||||
|
@ -73,6 +75,6 @@ class MakeUserCommand extends Command
|
||||||
['Admin', $user->role],
|
['Admin', $user->role],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return true;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,13 @@ use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
class UserController extends Controller
|
class UserController extends Controller
|
||||||
{
|
{
|
||||||
|
private Pterodactyl $pterodactyl;
|
||||||
|
|
||||||
|
public function __construct(Pterodactyl $pterodactyl)
|
||||||
|
{
|
||||||
|
$this->pterodactyl = $pterodactyl;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display a listing of the resource.
|
* Display a listing of the resource.
|
||||||
*
|
*
|
||||||
|
@ -30,27 +37,6 @@ class UserController extends Controller
|
||||||
return view('admin.users.index');
|
return view('admin.users.index');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the form for creating a new resource.
|
|
||||||
*
|
|
||||||
* @return Response
|
|
||||||
*/
|
|
||||||
public function create()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store a newly created resource in storage.
|
|
||||||
*
|
|
||||||
* @param Request $request
|
|
||||||
* @return Response
|
|
||||||
*/
|
|
||||||
public function store(Request $request)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the specified resource.
|
* Display the specified resource.
|
||||||
*
|
*
|
||||||
|
@ -96,7 +82,7 @@ class UserController extends Controller
|
||||||
"role" => Rule::in(['admin', 'mod', 'client', 'member']),
|
"role" => Rule::in(['admin', 'mod', 'client', 'member']),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (is_null(Pterodactyl::getUser($request->input('pterodactyl_id')))) {
|
if (is_null($this->pterodactyl->getUser($request->input('pterodactyl_id')))) {
|
||||||
throw ValidationException::withMessages([
|
throw ValidationException::withMessages([
|
||||||
'pterodactyl_id' => ["User does not exists on pterodactyl's panel"]
|
'pterodactyl_id' => ["User does not exists on pterodactyl's panel"]
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
docker-compose -f docker/docker-compose.yml down
|
docker-compose -f docker/docker-compose.yml down
|
||||||
docker-compose -f docker/docker-compose.yml up -d --force-recreate
|
docker-compose -f docker/docker-compose.yml up -d --force-recreate --remove-orphans
|
||||||
|
|
1
bin/test.sh
Executable file
1
bin/test.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
./vendor/bin/phpunit
|
9
klad.txt
9
klad.txt
|
@ -1,9 +0,0 @@
|
||||||
,
|
|
||||||
fnDrawCallback: function( oSettings ) {
|
|
||||||
$('[data-toggle="popover"]').popover();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
data-content="Delete" data-toggle="popover" data-trigger="hover" data-placement="top"
|
|
|
@ -5,8 +5,8 @@
|
||||||
colors="true"
|
colors="true"
|
||||||
>
|
>
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="Tests">
|
<testsuite name="Unit">
|
||||||
<directory suffix="Test.php">tests</directory>
|
<directory suffix=".php">tests/Unit</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
<coverage processUncoveredFiles="true">
|
<coverage processUncoveredFiles="true">
|
||||||
|
@ -18,11 +18,12 @@
|
||||||
<server name="APP_ENV" value="testing"/>
|
<server name="APP_ENV" value="testing"/>
|
||||||
<server name="BCRYPT_ROUNDS" value="4"/>
|
<server name="BCRYPT_ROUNDS" value="4"/>
|
||||||
<server name="CACHE_DRIVER" value="array"/>
|
<server name="CACHE_DRIVER" value="array"/>
|
||||||
<server name="DB_CONNECTION" value="sqlite"/>
|
<server name="DB_CONNECTION" value="mysql"/>
|
||||||
<server name="DB_DATABASE" value=":memory:"/>
|
<server name="DB_DATABASE" value="controlpanel_test"/>
|
||||||
<server name="MAIL_MAILER" value="array"/>
|
<server name="MAIL_MAILER" value="array"/>
|
||||||
<server name="QUEUE_CONNECTION" value="sync"/>
|
<server name="QUEUE_CONNECTION" value="sync"/>
|
||||||
<server name="SESSION_DRIVER" value="array"/>
|
<server name="SESSION_DRIVER" value="array"/>
|
||||||
<server name="TELESCOPE_ENABLED" value="false"/>
|
<server name="TELESCOPE_ENABLED" value="false"/>
|
||||||
|
<ini name="display_errors" value="true"/>
|
||||||
</php>
|
</php>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Tests\Unit;
|
|
||||||
|
|
||||||
use Tests\TestCase;
|
|
||||||
|
|
||||||
class exampleTest extends TestCase
|
|
||||||
{
|
|
||||||
public function test_example(): void
|
|
||||||
{
|
|
||||||
$response = $this->get('/');
|
|
||||||
$response->assertStatus(302);
|
|
||||||
}
|
|
||||||
}
|
|
52
tests/Unit/testUserCommand.php
Normal file
52
tests/Unit/testUserCommand.php
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit;
|
||||||
|
|
||||||
|
use App\Classes\Pterodactyl;
|
||||||
|
use Illuminate\Foundation\Auth\User;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class testUserCommand extends TestCase
|
||||||
|
{
|
||||||
|
use DatabaseTransactions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A basic feature test example.
|
||||||
|
* @dataProvider invalidPteroIdDataProvider
|
||||||
|
* @param array $apiResponse
|
||||||
|
* @param int $expectedExitCode
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeUserCommand(array $apiResponse, int $expectedExitCode): void
|
||||||
|
{
|
||||||
|
$pterodactyl = $this->getMockBuilder(Pterodactyl::class)->getMock();
|
||||||
|
$pterodactyl->expects(self::once())->method('getUser')->willReturn($apiResponse);
|
||||||
|
|
||||||
|
$this->app->instance(Pterodactyl::class, $pterodactyl);
|
||||||
|
|
||||||
|
$this->artisan('make:user')
|
||||||
|
->expectsQuestion('Please specify your Pterodactyl ID.', 0)
|
||||||
|
->expectsQuestion('Please specify your password.', 'password')
|
||||||
|
->assertExitCode($expectedExitCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function invalidPteroIdDataProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'Good Response' => [
|
||||||
|
'apiResponse' => [
|
||||||
|
'id' => 12345,
|
||||||
|
'first_name' => 'Test',
|
||||||
|
'email' => 'test@test.test'
|
||||||
|
],
|
||||||
|
'expectedExitCode' => 1
|
||||||
|
],
|
||||||
|
'Bad Response' => [
|
||||||
|
'apiResponse' => [],
|
||||||
|
'expectedExitCode' => 0
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue