Files
Verde-Web/tests/Feature/Api/V1/Helper/HelperAssignmentTest.php

145 lines
4.4 KiB
PHP

<?php
namespace Tests\Feature\Api\V1\Helper;
use App\Models\CollectionTeam;
use App\Models\TeamMember;
use App\Models\User;
use Database\Seeders\RoleSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Sanctum\Sanctum;
use Tests\TestCase;
class HelperAssignmentTest extends TestCase
{
use RefreshDatabase;
private User $helper;
private CollectionTeam $team;
protected function setUp(): void
{
parent::setUp();
$this->seed(RoleSeeder::class);
$this->helper = User::factory()->create([
'role' => User::ROLE_HELPER,
'status' => User::STATUS_ACTIVE,
]);
$this->team = CollectionTeam::create([
'name' => 'QC Team Alpha',
'status' => CollectionTeam::STATUS_ACTIVE,
]);
}
public function test_helper_can_get_current_assignment(): void
{
Sanctum::actingAs($this->helper);
// No assignment initially
$response = $this->getJson('/api/v1/helper/assignment');
$response->assertOk()
->assertJsonPath('data', null);
// Assign helper
TeamMember::create([
'team_id' => $this->team->id,
'user_id' => $this->helper->id,
'role_in_team' => TeamMember::ROLE_HELPER,
'assigned_from' => now()->toDateString(),
'status' => TeamMember::STATUS_PENDING,
]);
$response = $this->getJson('/api/v1/helper/assignment');
$response->assertOk()
->assertJsonPath('data.status', TeamMember::STATUS_PENDING)
->assertJsonPath('data.team.name', $this->team->name);
}
public function test_helper_can_accept_assignment(): void
{
Sanctum::actingAs($this->helper);
TeamMember::create([
'team_id' => $this->team->id,
'user_id' => $this->helper->id,
'role_in_team' => TeamMember::ROLE_HELPER,
'assigned_from' => now()->toDateString(),
'status' => TeamMember::STATUS_PENDING,
]);
$response = $this->postJson('/api/v1/helper/assignment/accept');
$response->assertOk()
->assertJsonPath('data.status', TeamMember::STATUS_ACCEPTED);
$this->assertDatabaseHas('team_members', [
'user_id' => $this->helper->id,
'status' => TeamMember::STATUS_ACCEPTED,
]);
}
public function test_helper_can_reject_assignment(): void
{
Sanctum::actingAs($this->helper);
TeamMember::create([
'team_id' => $this->team->id,
'user_id' => $this->helper->id,
'role_in_team' => TeamMember::ROLE_HELPER,
'assigned_from' => now()->toDateString(),
'status' => TeamMember::STATUS_PENDING,
]);
$response = $this->postJson('/api/v1/helper/assignment/reject');
$response->assertOk()
->assertJsonPath('data.status', TeamMember::STATUS_REJECTED);
$this->assertDatabaseHas('team_members', [
'user_id' => $this->helper->id,
'status' => TeamMember::STATUS_REJECTED,
]);
}
public function test_helper_can_get_assignment_history(): void
{
Sanctum::actingAs($this->helper);
// Create 2 past assignments
TeamMember::create([
'team_id' => $this->team->id,
'user_id' => $this->helper->id,
'role_in_team' => TeamMember::ROLE_HELPER,
'assigned_from' => now()->subDays(2)->toDateString(),
'assigned_until' => now()->subDays(2)->toDateString(),
'status' => TeamMember::STATUS_ACCEPTED,
]);
TeamMember::create([
'team_id' => $this->team->id,
'user_id' => $this->helper->id,
'role_in_team' => TeamMember::ROLE_HELPER,
'assigned_from' => now()->subDays(1)->toDateString(),
'assigned_until' => now()->subDays(1)->toDateString(),
'status' => TeamMember::STATUS_REJECTED,
]);
$response = $this->getJson('/api/v1/helper/history');
$response->assertOk()
->assertJsonCount(2, 'data');
}
public function test_non_helper_blocked_from_helper_endpoints(): void
{
$driver = User::factory()->create([
'role' => User::ROLE_DRIVER,
'status' => User::STATUS_ACTIVE,
]);
Sanctum::actingAs($driver);
$this->getJson('/api/v1/helper/assignment')->assertStatus(403);
}
}