209 lines
7.8 KiB
PHP
209 lines
7.8 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Worker;
|
|
use App\Models\Skill;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Tests\TestCase;
|
|
|
|
class AdminWorkerManagementTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
protected $admin;
|
|
protected $worker;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
$this->admin = User::create([
|
|
'name' => 'System Admin',
|
|
'email' => 'admin@marketplace.com',
|
|
'password' => bcrypt('password'),
|
|
'role' => 'admin',
|
|
]);
|
|
|
|
$this->worker = Worker::create([
|
|
'name' => 'Jane Helper',
|
|
'phone' => '+971520000000',
|
|
'email' => 'jane@helper.com',
|
|
'password' => bcrypt('password'),
|
|
'salary' => 1500,
|
|
'experience' => '2 years',
|
|
'nationality' => 'Philippine',
|
|
'gender' => 'Female',
|
|
'age' => 25,
|
|
'in_country' => true,
|
|
'visa_status' => 'Tourist Visa',
|
|
'preferred_job_type' => 'live-in',
|
|
'live_in_out' => 'live_in',
|
|
'preferred_location' => 'Dubai Marina',
|
|
'language' => 'English, Tagalog',
|
|
'availability' => 'Available Now',
|
|
'status' => 'active',
|
|
'religion' => 'Christian',
|
|
'bio' => 'Experienced helper',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Test admin can list workers.
|
|
*/
|
|
public function test_admin_can_list_workers()
|
|
{
|
|
$response = $this->actingAs($this->admin)
|
|
->withSession(['user' => $this->admin])
|
|
->get('/admin/workers');
|
|
|
|
$response->assertStatus(200);
|
|
$response->assertSee('Jane Helper');
|
|
}
|
|
|
|
/**
|
|
* Test admin can update worker profile with full registration fields.
|
|
*/
|
|
public function test_admin_can_update_worker_profile()
|
|
{
|
|
$skill1 = Skill::create(['name' => 'cooking']);
|
|
|
|
$response = $this->actingAs($this->admin)
|
|
->withSession(['user' => $this->admin])
|
|
->post("/admin/workers/{$this->worker->id}/update-profile", [
|
|
'name' => 'Jane Helper Edited',
|
|
'phone' => '+971529999999',
|
|
'salary' => 1800,
|
|
'experience' => '4 years',
|
|
'nationality' => 'Philippine',
|
|
'gender' => 'Female',
|
|
'age' => 27,
|
|
'in_country' => 'false',
|
|
'visa_status' => null,
|
|
'preferred_job_type' => 'part-time',
|
|
'live_in_out' => 'live_out',
|
|
'preferred_location' => 'JLT',
|
|
'language' => 'English, Tagalog, Arabic',
|
|
'skills' => 'cooking, cleaning, childcare',
|
|
]);
|
|
|
|
$response->assertStatus(302);
|
|
|
|
$worker = $this->worker->fresh();
|
|
|
|
$this->assertEquals('Jane Helper Edited', $worker->name);
|
|
$this->assertEquals('+971529999999', $worker->phone);
|
|
$this->assertEquals(1800, (int)$worker->salary);
|
|
$this->assertEquals('4 years', $worker->experience);
|
|
$this->assertEquals(27, $worker->age);
|
|
$this->assertFalse((bool)$worker->in_country);
|
|
$this->assertEquals('live_out', $worker->live_in_out);
|
|
$this->assertEquals('JLT', $worker->preferred_location);
|
|
$this->assertEquals('English, Tagalog, Arabic', $worker->language);
|
|
|
|
// Assert skills were synced
|
|
$this->assertEquals(3, $worker->skills()->count());
|
|
$this->assertTrue($worker->skills->contains('name', 'cooking'));
|
|
$this->assertTrue($worker->skills->contains('name', 'cleaning'));
|
|
$this->assertTrue($worker->skills->contains('name', 'childcare'));
|
|
}
|
|
|
|
/**
|
|
* Test validation on worker update profile.
|
|
*/
|
|
public function test_admin_cannot_update_worker_with_invalid_fields()
|
|
{
|
|
$response = $this->actingAs($this->admin)
|
|
->withSession(['user' => $this->admin])
|
|
->post("/admin/workers/{$this->worker->id}/update-profile", [
|
|
'name' => '', // Name is required
|
|
'phone' => '+971529999999',
|
|
'experience' => '', // Experience is required
|
|
]);
|
|
|
|
$response->assertSessionHasErrors(['name', 'experience']);
|
|
}
|
|
|
|
/**
|
|
* Test admin can view worker with passport and visa OCR data.
|
|
*/
|
|
public function test_admin_can_view_worker_with_document_ocr_data()
|
|
{
|
|
// Create a passport document with full OCR data
|
|
$this->worker->documents()->create([
|
|
'type' => 'passport',
|
|
'number' => 'Y34B67890',
|
|
'issue_date' => '2017-07-05',
|
|
'expiry_date' => '2022-07-05',
|
|
'ocr_accuracy' => 99.0,
|
|
'file_path' => null,
|
|
'ocr_data' => [
|
|
'authority' => 'Issuing Authority',
|
|
'date_of_birth' => '14/05/1990',
|
|
'date_of_expiry' => '05/07/2022',
|
|
'date_of_issue' => '05/07/2017',
|
|
'document_type' => 'P',
|
|
'given_names' => 'KHALED',
|
|
'issuing_country' => 'ARE',
|
|
'nationality' => 'ARE',
|
|
'passport_number' => 'Y34B67890',
|
|
'personal_number' => '',
|
|
'place_of_birth' => 'SHARJAH',
|
|
'sex' => 'M',
|
|
'surname' => 'AL-HASHIMI',
|
|
],
|
|
]);
|
|
|
|
// Create a visa document with full OCR data
|
|
$this->worker->documents()->create([
|
|
'type' => 'visa',
|
|
'number' => '201/2021/2840233',
|
|
'issue_date' => '2022-02-16',
|
|
'expiry_date' => '2024-02-15',
|
|
'ocr_accuracy' => 99.0,
|
|
'file_path' => null,
|
|
'ocr_data' => [
|
|
'accompanied_by' => '9',
|
|
'expiry_date' => '2024-02-15',
|
|
'file_number' => '201/2021/2840233',
|
|
'id_number' => '784198839607839',
|
|
'issue_date' => '2022-02-16',
|
|
'name' => 'KHALED AL-HASHIMI',
|
|
'passport_number' => 'Y34B67890',
|
|
'place_of_issue' => 'Dubai',
|
|
'profession' => 'CLEANER',
|
|
'sponsor' => 'Sponsor Company LLC',
|
|
],
|
|
]);
|
|
|
|
$response = $this->actingAs($this->admin)
|
|
->withSession(['user' => $this->admin])
|
|
->get('/admin/workers');
|
|
|
|
$response->assertStatus(200);
|
|
|
|
// Verify documents are present in the page data
|
|
$worker = \App\Models\Worker::with('documents')->find($this->worker->id);
|
|
$passportDoc = $worker->documents->firstWhere('type', 'passport');
|
|
$visaDoc = $worker->documents->firstWhere('type', 'visa');
|
|
|
|
$this->assertNotNull($passportDoc);
|
|
$this->assertEquals('Y34B67890', $passportDoc->number);
|
|
$this->assertEquals('KHALED', $passportDoc->ocr_data['given_names']);
|
|
$this->assertEquals('AL-HASHIMI', $passportDoc->ocr_data['surname']);
|
|
$this->assertEquals('ARE', $passportDoc->ocr_data['nationality']);
|
|
$this->assertEquals('ARE', $passportDoc->ocr_data['issuing_country']);
|
|
$this->assertEquals('SHARJAH', $passportDoc->ocr_data['place_of_birth']);
|
|
$this->assertEquals('M', $passportDoc->ocr_data['sex']);
|
|
$this->assertEquals('P', $passportDoc->ocr_data['document_type']);
|
|
|
|
$this->assertNotNull($visaDoc);
|
|
$this->assertEquals('201/2021/2840233', $visaDoc->number);
|
|
$this->assertEquals('784198839607839', $visaDoc->ocr_data['id_number']);
|
|
$this->assertEquals('CLEANER', $visaDoc->ocr_data['profession']);
|
|
$this->assertEquals('Sponsor Company LLC', $visaDoc->ocr_data['sponsor']);
|
|
$this->assertEquals('Dubai', $visaDoc->ocr_data['place_of_issue']);
|
|
}
|
|
}
|