migrant-web/tests/Feature/WorkerEmployersApiTest.php

240 lines
8.5 KiB
PHP

<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Models\Worker;
use App\Models\WorkerDocument;
use App\Models\User;
use App\Models\JobOffer;
use App\Models\EmployerProfile;
class WorkerEmployersApiTest extends TestCase
{
use RefreshDatabase;
public function test_worker_dashboard_current_employer_detail()
{
// Create worker
$worker = Worker::create([
'name' => 'Rahul Sharma',
'email' => 'rahul@example.com',
'phone' => '+971501234567',
'language' => 'HI',
'password' => bcrypt('password'),
'nationality' => 'Indian',
'age' => 25,
'salary' => 1500,
'availability' => 'Immediate',
'experience' => 'Not Specified',
'religion' => 'Not Specified',
'bio' => 'Test',
'verified' => true,
'status' => 'active',
'api_token' => 'worker-test-token',
]);
// Create passport document to prevent pending 404
WorkerDocument::create([
'worker_id' => $worker->id,
'type' => 'passport',
'number' => '123456',
'file_path' => 'passports/test.pdf',
]);
// Create an employer
$employer = User::create([
'name' => 'Employer One',
'email' => 'emp1@example.com',
'password' => bcrypt('password'),
'role' => 'employer',
]);
EmployerProfile::create([
'user_id' => $employer->id,
'company_name' => 'Ahmad Tech Ltd',
'nationality' => 'UAE',
'city' => 'Dubai',
]);
// Create an accepted job offer (current employer)
JobOffer::create([
'employer_id' => $employer->id,
'worker_id' => $worker->id,
'work_date' => now()->subDays(10),
'location' => 'Dubai',
'salary' => 2500,
'status' => 'accepted',
'notes' => 'Current Active Job',
]);
// Hit the worker dashboard API
$response = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/dashboard');
$response->assertStatus(200)
->assertJson([
'success' => true,
'data' => [
'current_employer' => [
'id' => $employer->id,
'name' => 'Employer One',
'company_name' => 'Ahmad Tech Ltd',
'city' => 'Dubai',
'nationality' => 'UAE',
],
'currently_working_sponsor' => [
'id' => $employer->id,
'name' => 'Employer One',
'company_name' => 'Ahmad Tech Ltd',
'city' => 'Dubai',
'nationality' => 'UAE',
]
]
]);
}
public function test_worker_employers_list_pagination_and_sorting()
{
// Create worker
$worker = Worker::create([
'name' => 'Rahul Sharma',
'email' => 'rahul@example.com',
'phone' => '+971501234567',
'language' => 'HI',
'password' => bcrypt('password'),
'nationality' => 'Indian',
'age' => 25,
'salary' => 1500,
'availability' => 'Immediate',
'experience' => 'Not Specified',
'religion' => 'Not Specified',
'bio' => 'Test',
'verified' => true,
'status' => 'active',
'api_token' => 'worker-test-token',
]);
WorkerDocument::create([
'worker_id' => $worker->id,
'type' => 'passport',
'number' => '123456',
'file_path' => 'passports/test.pdf',
]);
// Create 3 employers
$emp1 = User::create([
'name' => 'Employer One',
'email' => 'emp1@example.com',
'password' => bcrypt('password'),
'role' => 'employer'
]);
EmployerProfile::create(['user_id' => $emp1->id, 'company_name' => 'Tech One']);
$emp2 = User::create([
'name' => 'Employer Two',
'email' => 'emp2@example.com',
'password' => bcrypt('password'),
'role' => 'employer'
]);
EmployerProfile::create(['user_id' => $emp2->id, 'company_name' => 'Tech Two']);
$emp3 = User::create([
'name' => 'Employer Three',
'email' => 'emp3@example.com',
'password' => bcrypt('password'),
'role' => 'employer'
]);
EmployerProfile::create(['user_id' => $emp3->id, 'company_name' => 'Tech Three']);
// Create JobOffers:
// Offer 1: Completed status, joining 20 days ago
JobOffer::create([
'employer_id' => $emp1->id,
'worker_id' => $worker->id,
'work_date' => now()->subDays(20),
'location' => 'Abu Dhabi',
'salary' => 2000,
'status' => 'completed',
'notes' => 'Past job',
]);
// Offer 2: Cancelled status, joining 30 days ago
JobOffer::create([
'employer_id' => $emp2->id,
'worker_id' => $worker->id,
'work_date' => now()->subDays(30),
'location' => 'Sharjah',
'salary' => 1800,
'status' => 'cancelled',
'notes' => 'Cancelled job',
]);
// Offer 3: Accepted (Active) status, joining 10 days ago
JobOffer::create([
'employer_id' => $emp3->id,
'worker_id' => $worker->id,
'work_date' => now()->subDays(10),
'location' => 'Dubai',
'salary' => 3000,
'status' => 'accepted',
'notes' => 'Active job',
]);
// List all employers (should return 3)
// With Active employer at the top, then previous employers sorted by work_date desc:
// 1st: Emp 3 (Active)
// 2nd: Emp 1 (Completed, 20 days ago)
// 3rd: Emp 2 (Cancelled, 30 days ago)
$response = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/employers');
$response->assertStatus(200);
$data = $response->json('data.employers');
$this->assertCount(3, $data);
$this->assertEquals('Active', $data[0]['status']);
$this->assertEquals('Employer Three', $data[0]['employer']['name']);
$this->assertEquals('Completed', $data[1]['status']);
$this->assertEquals('Employer One', $data[1]['employer']['name']);
$this->assertEquals('Cancelled', $data[2]['status']);
$this->assertEquals('Employer Two', $data[2]['employer']['name']);
// Test filtering by status Completed
$responseFiltered = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/employers?status=completed');
$responseFiltered->assertStatus(200);
$filteredData = $responseFiltered->json('data.employers');
$this->assertCount(1, $filteredData);
$this->assertEquals('Completed', $filteredData[0]['status']);
$this->assertEquals('Employer One', $filteredData[0]['employer']['name']);
// Test filtering by status Active
$responseActive = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/employers?status=active');
$responseActive->assertStatus(200);
$activeData = $responseActive->json('data.employers');
$this->assertCount(1, $activeData);
$this->assertEquals('Active', $activeData[0]['status']);
$this->assertEquals('Employer Three', $activeData[0]['employer']['name']);
// Test pagination
$responsePaginated = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/employers?per_page=2');
$responsePaginated->assertStatus(200);
$paginatedData = $responsePaginated->json('data.employers');
$this->assertCount(2, $paginatedData);
$this->assertEquals(3, $responsePaginated->json('data.pagination.total'));
$this->assertEquals(2, $responsePaginated->json('data.pagination.per_page'));
}
}