Teren-app/tests/Feature/FieldJobIndexFilterTest.php
2025-09-28 22:36:47 +02:00

162 lines
6.2 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\ClientCase;
use App\Models\Contract;
use App\Models\Decision;
use App\Models\FieldJobSetting;
use App\Models\Segment;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Inertia\Testing\AssertableInertia as Assert;
use Tests\TestCase;
class FieldJobIndexFilterTest extends TestCase
{
use RefreshDatabase;
public function test_shows_only_contracts_in_primary_or_queue_segments(): void
{
$user = User::factory()->create();
$this->actingAs($user);
$primary = Segment::factory()->create();
$queue = Segment::factory()->create();
FieldJobSetting::query()->create([
'segment_id' => $primary->id,
'initial_decision_id' => Decision::factory()->create()->id,
'assign_decision_id' => Decision::factory()->create()->id,
'complete_decision_id' => Decision::factory()->create()->id,
'queue_segment_id' => $queue->id,
]);
$case = ClientCase::factory()->create();
$inPrimary = Contract::factory()->create(['client_case_id' => $case->id]);
$inQueue = Contract::factory()->create(['client_case_id' => $case->id]);
$inOther = Contract::factory()->create(['client_case_id' => $case->id]);
DB::table('contract_segment')->insert([
['contract_id' => $inPrimary->id, 'segment_id' => $primary->id, 'active' => true, 'created_at' => now(), 'updated_at' => now()],
['contract_id' => $inQueue->id, 'segment_id' => $queue->id, 'active' => true, 'created_at' => now(), 'updated_at' => now()],
['contract_id' => $inOther->id, 'segment_id' => Segment::factory()->create()->id, 'active' => true, 'created_at' => now(), 'updated_at' => now()],
]);
$response = $this->get(route('fieldjobs.index'));
$response->assertStatus(200);
$response->assertInertia(function (Assert $page) use ($inPrimary, $inQueue, $inOther) {
$contracts = collect($page->toArray()['props']['contracts']);
$uuids = $contracts->pluck('uuid')->all();
$this->assertContains($inPrimary->uuid, $uuids);
$this->assertContains($inQueue->uuid, $uuids);
$this->assertNotContains($inOther->uuid, $uuids);
});
}
public function test_returns_no_contracts_when_there_is_no_field_job_setting(): void
{
$user = User::factory()->create();
$this->actingAs($user);
$case = ClientCase::factory()->create();
$contract = Contract::factory()->create(['client_case_id' => $case->id]);
$seg = Segment::factory()->create();
DB::table('contract_segment')->insert([
'contract_id' => $contract->id, 'segment_id' => $seg->id, 'active' => true, 'created_at' => now(), 'updated_at' => now(),
]);
$response = $this->get(route('fieldjobs.index'));
$response->assertStatus(200);
$response->assertInertia(function (Assert $page) {
$contracts = collect($page->toArray()['props']['contracts']);
$this->assertTrue($contracts->isEmpty());
});
}
public function test_returns_no_contracts_when_setting_has_no_segments_configured(): void
{
$user = User::factory()->create();
$this->actingAs($user);
FieldJobSetting::query()->create([
'segment_id' => null,
'queue_segment_id' => null,
'initial_decision_id' => Decision::factory()->create()->id,
'assign_decision_id' => Decision::factory()->create()->id,
'complete_decision_id' => Decision::factory()->create()->id,
]);
$case = ClientCase::factory()->create();
$contract = Contract::factory()->create(['client_case_id' => $case->id]);
$seg = Segment::factory()->create();
DB::table('contract_segment')->insert([
'contract_id' => $contract->id, 'segment_id' => $seg->id, 'active' => true, 'created_at' => now(), 'updated_at' => now(),
]);
$response = $this->get(route('fieldjobs.index'));
$response->assertStatus(200);
$response->assertInertia(function (Assert $page) {
$contracts = collect($page->toArray()['props']['contracts']);
$this->assertTrue($contracts->isEmpty());
});
}
public function test_cancelling_moves_contract_to_queue_segment(): void
{
$user = User::factory()->create();
$this->actingAs($user);
$primary = Segment::factory()->create();
$queue = Segment::factory()->create();
$setting = FieldJobSetting::query()->create([
'segment_id' => $primary->id,
'queue_segment_id' => $queue->id,
'initial_decision_id' => Decision::factory()->create()->id,
'assign_decision_id' => Decision::factory()->create()->id,
'complete_decision_id' => Decision::factory()->create()->id,
]);
$case = ClientCase::factory()->create();
$contract = Contract::factory()->create(['client_case_id' => $case->id]);
// Ensure contract is in primary segment initially
DB::table('contract_segment')->insert([
'contract_id' => $contract->id, 'segment_id' => $primary->id, 'active' => true, 'created_at' => now(), 'updated_at' => now(),
]);
// Create an active field job for the contract
\App\Models\FieldJob::create([
'field_job_setting_id' => $setting->id,
'assigned_user_id' => $user->id,
'contract_id' => $contract->id,
'assigned_at' => now(),
]);
// Cancel via controller route
$response = $this->post(route('fieldjobs.cancel'), [
'contract_uuid' => $contract->uuid,
]);
$response->assertSessionHasNoErrors();
// After cancellation, the model hook should move the contract to queue segment (ensure pivot exists and active)
$pivot = DB::table('contract_segment')
->where('contract_id', $contract->id)
->where('segment_id', $queue->id)
->first();
$this->assertNotNull($pivot, 'Queue segment pivot should be created/ensured');
$this->assertTrue((bool) $pivot->active, 'Queue segment pivot should be active');
}
}