Implement projects and project keys
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Models;
|
||||
|
||||
use App\Models\Project;
|
||||
use Database\Seeders\ProjectSeeder;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ProjectTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
/**
|
||||
* Ensure project keys are always stored in uppercase.
|
||||
*/
|
||||
public function test_project_keys_are_stored_in_uppercase(): void
|
||||
{
|
||||
$project = Project::factory()->create([
|
||||
'key' => 'core',
|
||||
]);
|
||||
|
||||
$this->assertSame('CORE', $project->fresh()->key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure the project seeder creates the expected starter projects.
|
||||
*/
|
||||
public function test_project_seeder_creates_projects(): void
|
||||
{
|
||||
$this->seed(ProjectSeeder::class);
|
||||
|
||||
$this->assertDatabaseHas('projects', [
|
||||
'name' => 'Core Platform',
|
||||
'key' => 'CORE',
|
||||
]);
|
||||
|
||||
$this->assertDatabaseHas('projects', [
|
||||
'name' => 'Authentication',
|
||||
'key' => 'AUTH',
|
||||
]);
|
||||
|
||||
$this->assertDatabaseHas('projects', [
|
||||
'name' => 'Operations',
|
||||
'key' => 'OPS',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature\Projects;
|
||||
|
||||
use App\Models\Project;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Inertia\Testing\AssertableInertia as Assert;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ProjectControllerTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
/**
|
||||
* Ensure guests cannot access authenticated project pages.
|
||||
*/
|
||||
public function test_guests_are_redirected_from_project_pages(): void
|
||||
{
|
||||
$this->get(route('projects.index'))
|
||||
->assertRedirect(route('login'));
|
||||
|
||||
$this->get(route('projects.create'))
|
||||
->assertRedirect(route('login'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure authenticated users can view the projects index.
|
||||
*/
|
||||
public function test_authenticated_users_can_view_the_projects_index(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$firstProject = Project::factory()->create([
|
||||
'name' => 'Core Platform',
|
||||
'key' => 'CORE',
|
||||
]);
|
||||
$secondProject = Project::factory()->create([
|
||||
'name' => 'Authentication',
|
||||
'key' => 'AUTH',
|
||||
]);
|
||||
|
||||
$this->actingAs($user)
|
||||
->get(route('projects.index'))
|
||||
->assertOk()
|
||||
->assertInertia(fn (Assert $page) => $page
|
||||
->component('projects/Index')
|
||||
->has('projects', 2)
|
||||
->where('projects.0.id', $secondProject->id)
|
||||
->where('projects.1.id', $firstProject->id),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure authenticated users can view the project creation screen.
|
||||
*/
|
||||
public function test_authenticated_users_can_view_the_project_creation_screen(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
|
||||
$this->actingAs($user)
|
||||
->get(route('projects.create'))
|
||||
->assertOk()
|
||||
->assertInertia(fn (Assert $page) => $page
|
||||
->component('projects/Create'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure project keys are normalized to uppercase on creation.
|
||||
*/
|
||||
public function test_authenticated_users_can_create_projects_with_uppercase_keys(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
|
||||
$response = $this->actingAs($user)
|
||||
->post(route('projects.store'), [
|
||||
'name' => 'Kanban Foundation',
|
||||
'key' => 'core',
|
||||
]);
|
||||
|
||||
$project = Project::query()->firstOrFail();
|
||||
|
||||
$response->assertRedirect(route('projects.show', $project));
|
||||
|
||||
$this->assertDatabaseHas('projects', [
|
||||
'name' => 'Kanban Foundation',
|
||||
'key' => 'CORE',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure project keys remain unique after normalization.
|
||||
*/
|
||||
public function test_project_keys_must_be_unique_case_insensitively(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
|
||||
Project::factory()->create([
|
||||
'key' => 'AUTH',
|
||||
]);
|
||||
|
||||
$this->actingAs($user)
|
||||
->from(route('projects.create'))
|
||||
->post(route('projects.store'), [
|
||||
'name' => 'Another Auth Project',
|
||||
'key' => 'auth',
|
||||
])
|
||||
->assertSessionHasErrors('key')
|
||||
->assertRedirect(route('projects.create'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure project keys cannot exceed five characters.
|
||||
*/
|
||||
public function test_project_keys_may_not_exceed_five_characters(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
|
||||
$this->actingAs($user)
|
||||
->from(route('projects.create'))
|
||||
->post(route('projects.store'), [
|
||||
'name' => 'Too Long',
|
||||
'key' => 'KANBAN',
|
||||
])
|
||||
->assertSessionHasErrors('key')
|
||||
->assertRedirect(route('projects.create'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure authenticated users can view the project hub page.
|
||||
*/
|
||||
public function test_authenticated_users_can_view_a_project_hub_page(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$project = Project::factory()->create([
|
||||
'name' => 'Core Platform',
|
||||
'key' => 'CORE',
|
||||
]);
|
||||
|
||||
$this->actingAs($user)
|
||||
->get(route('projects.show', $project))
|
||||
->assertOk()
|
||||
->assertInertia(fn (Assert $page) => $page
|
||||
->component('projects/Show')
|
||||
->where('project.id', $project->id)
|
||||
->where('project.key', 'CORE'),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user