Testing usefulLinkController

This commit is contained in:
AVMG20 2021-06-11 10:33:26 +02:00
parent d7a9e47d62
commit 5f6221e88a
4 changed files with 240 additions and 6 deletions

View file

@ -1,6 +1,6 @@
# Building the development environment
cd into the project directory and run the following command: `sudo sh bin/startdocker.sh`
cd into the project directory and run the following command: `sh bin/startdocker.sh`
This should start building the images and start the containers.
After that you need to go into the controlpanel_php container and run some commands:
@ -24,9 +24,7 @@ Now you're ready to run the following commands which switches to the testing con
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 migrate:fresh --seed --env=testing
php artisan config:clear
```

View file

@ -41,10 +41,11 @@ class UsefulLinkController extends Controller
*/
public function store(Request $request)
{
$request->validate([
'icon' => 'required|string',
'title' => 'required|string|max:60',
'link' => 'required|string|max:191',
'link' => 'required|url|string|max:191',
'description' => 'required|string|max:2000',
]);
@ -88,7 +89,7 @@ class UsefulLinkController extends Controller
$request->validate([
'icon' => 'required|string',
'title' => 'required|string|max:60',
'link' => 'required|string|max:191',
'link' => 'required|url|string|max:191',
'description' => 'required|string|max:2000',
]);

View file

@ -0,0 +1,31 @@
<?php
namespace Database\Factories;
use App\Models\UsefulLink;
use Illuminate\Database\Eloquent\Factories\Factory;
class UsefulLinkFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = UsefulLink::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'icon' => 'fas fa-user',
'title' => $this->faker->text(30),
'link' => $this->faker->url,
'description' => $this->faker->text,
];
}
}

View file

@ -0,0 +1,204 @@
<?php
namespace Tests\Feature;
use App\Models\UsefulLink;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Str;
use Tests\TestCase;
/**
* Class TestUsefulLinksController
* @package Tests\Feature
*/
class TestUsefulLinksController extends TestCase
{
use DatabaseTransactions;
/**
* @dataProvider accessibleRoutesDataProvider
* @param string $method
* @param string $route
* @param int $expectedStatus
*/
function test_accessible_routes(string $method, string $route, int $expectedStatus)
{
UsefulLink::factory()->create([
'id' => 1
]);
$response = $this->actingAs(User::factory()->create([
'role' => 'admin',
'pterodactyl_id' => '1'
]))->{$method}($route);
$response->assertStatus($expectedStatus);
}
/**
* @dataProvider usefulLinkDataProvider
* @param array $dataSet
* @param int $expectedCount
* @param bool $assertValidationErrors
*/
function test_creating_useful_link(array $dataSet, int $expectedCount, bool $assertValidationErrors)
{
$response = $this->actingAs($this->getTestUser())->post(route('admin.usefullinks.store'), $dataSet);
if ($assertValidationErrors) $response->assertSessionHasErrors();
else $response->assertSessionHasNoErrors();
$response->assertRedirect();
$this->assertDatabaseCount('useful_links', $expectedCount);
}
/**
* @dataProvider usefulLinkDataProvider
* @param array $dataSet
* @param int $expectedCount
* @param bool $assertValidationErrors
*/
function test_updating_useful_link(array $dataSet, int $expectedCount, bool $assertValidationErrors)
{
$link = UsefulLink::factory()->create([
'id' => 1
]);
$response = $this->actingAs($this->getTestUser())->patch(route('admin.usefullinks.update', $link->id), $dataSet);
if ($assertValidationErrors) $response->assertSessionHasErrors();
else $response->assertSessionHasNoErrors();
$response->assertRedirect();
$this->assertDatabaseCount('useful_links', 1);
}
/**
*
*/
function test_deleting_useful_link()
{
$link = UsefulLink::factory()->create([
'id' => 1
]);
$response = $this->actingAs($this->getTestUser())->delete(route('admin.usefullinks.update', $link->id));
$response->assertRedirect();
$this->assertDatabaseCount('useful_links', 0);
}
/**
* @return User
*/
private function getTestUser(): User
{
return User::factory()->create([
'role' => 'admin',
'pterodactyl_id' => '1'
]);
}
/**
* @return array
*/
function usefulLinkDataProvider(): array
{
return [
'Valid dataset 1' => [
'dataSet' => [
"icon" => "fas fa-user",
"title" => "Bitsec.Dev Dashboard",
"link" => "https://manage.bitsec.dev.com",
"description" => Str::random(1500),
],
'expectedCount' => 1,
'assertValidationErrors' => false
],
'Valid dataset 2' => [
'dataSet' => [
"icon" => "fas fa-user",
"title" => Str::random(30),
"link" => "https://somerandomsite.com",
"description" => Str::random(1500),
],
'expectedCount' => 1,
'assertValidationErrors' => false
],
'Invalid dataset (invalid link)' => [
'dataSet' => [
"icon" => "fas fa-user",
"title" => "Some Random Title",
"link" => "1221",
"description" => "<p>Some Random HTML</p>",
],
'expectedCount' => 0,
'assertValidationErrors' => true
],
'Invalid dataset (no title)' => [
'dataSet' => [
"icon" => "fas fa-user",
"title" => "",
"link" => "https://somerandomsite.com",
"description" => "<p>Some Random HTML</p>",
],
'expectedCount' => 0,
'assertValidationErrors' => true
],
'Invalid dataset (to long title)' => [
'dataSet' => [
"icon" => "fas fa-user",
"title" => Str::random(200),
"link" => "https://valid.com",
"description" => "<p>Some Random HTML</p>",
],
'expectedCount' => 0,
'assertValidationErrors' => true
],
'Invalid dataset (to long description)' => [
'dataSet' => [
"icon" => "fas fa-user",
"title" => "Some Random Valid Title",
"link" => "https://valid.com",
"description" => Str::random(2100),
],
'expectedCount' => 0,
'assertValidationErrors' => true
],
'Invalid dataset (no icon)' => [
'dataSet' => [
"title" => "Some Random Valid Title",
"link" => "https://valid.com",
"description" => Str::random(200),
],
'expectedCount' => 0,
'assertValidationErrors' => true
],
];
}
/**
* @return array[]
*/
public function accessibleRoutesDataProvider(): array
{
return [
'index page' => [
'method' => 'get',
'route' => '/admin/usefullinks',
'expectedStatus' => 200
],
'Create page' => [
'method' => 'get',
'route' => '/admin/usefullinks/create',
'expectedStatus' => 200
],
'Edit page' => [
'method' => 'get',
'route' => '/admin/usefullinks/1/edit',
'expectedStatus' => 200
],
];
}
}