240 lines
8.5 KiB
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'));
|
|
}
|
|
}
|