migrant-web/tests/Feature/WorkerLoginReviewDataTest.php
2026-07-04 21:07:00 +05:30

212 lines
7.3 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\User;
use App\Models\Worker;
use App\Models\WorkerDocument;
use App\Models\JobPost;
use App\Models\JobApplication;
use App\Models\Review;
use App\Models\EmployerReview;
use App\Models\JobOffer;
use App\Models\EmployerProfile;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class WorkerLoginReviewDataTest extends TestCase
{
use RefreshDatabase;
protected $worker;
protected $employer;
protected $job;
protected function setUp(): void
{
parent::setUp();
// 1. Create worker
$this->worker = Worker::create([
'name' => 'Rahul Sharma',
'email' => 'rahul@example.com',
'phone' => '+971501234567',
'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' => $this->worker->id,
'type' => 'passport',
'number' => '123456',
'file_path' => 'passports/test.pdf',
]);
// 2. Create an employer
$this->employer = User::create([
'name' => 'Employer One',
'email' => 'emp1@example.com',
'password' => bcrypt('password'),
'role' => 'employer',
'api_token' => 'employer-test-token',
]);
EmployerProfile::create([
'user_id' => $this->employer->id,
'company_name' => 'Ahmad Tech Ltd',
'nationality' => 'UAE',
'city' => 'Dubai',
'phone' => '+971 50 123 4567',
'address' => 'Dubai, UAE',
]);
// 3. Create job post
$this->job = JobPost::create([
'employer_id' => $this->employer->id,
'title' => 'Test Job',
'location' => 'Dubai',
'salary' => 2500,
'workers_needed' => 1,
'job_type' => 'Full Time',
'start_date' => now()->subMonths(4)->toDateString(),
'description' => 'Test Job Description',
'status' => 'active',
]);
}
public function test_worker_login_and_profile_returns_review_data()
{
// Create an Employer review of this Worker
Review::create([
'employer_id' => $this->employer->id,
'worker_id' => $this->worker->id,
'rating' => 4,
'comment' => 'Good worker',
]);
// Create a Worker review of this Employer
EmployerReview::create([
'worker_id' => $this->worker->id,
'employer_id' => $this->employer->id,
'job_id' => $this->job->id,
'rating' => 5,
'title' => 'Nice place',
'comment' => 'Great experience',
]);
// Act: Worker login
$response = $this->postJson('/api/workers/login', [
'phone' => '+971501234567',
'password' => 'password'
]);
$response->assertStatus(200);
$workerData = $response->json('data.worker');
$this->assertEquals(4.0, $workerData['rating']);
$this->assertEquals(1, $workerData['reviews_count']);
$this->assertCount(1, $workerData['reviews']);
$this->assertEquals('Good worker', $workerData['reviews'][0]['comment']);
$this->assertEquals('Employer One', $workerData['reviews'][0]['employer']['name']);
$this->assertCount(1, $workerData['employer_reviews']);
$this->assertEquals('Great experience', $workerData['employer_reviews'][0]['comment']);
$this->assertEquals('Employer One', $workerData['employer_reviews'][0]['employer']['name']);
// Act: Get worker profile
$token = $response->json('data.token');
$profileResponse = $this->withHeaders([
'Authorization' => 'Bearer ' . $token,
])->getJson('/api/workers/profile');
$profileResponse->assertStatus(200);
$profileWorker = $profileResponse->json('data.worker');
$this->assertEquals(4.0, $profileWorker['rating']);
$this->assertEquals(1, $profileWorker['reviews_count']);
}
public function test_worker_dashboard_and_employers_list_includes_employer_review_stats()
{
// Hired job offer to establish relationship
JobOffer::create([
'employer_id' => $this->employer->id,
'worker_id' => $this->worker->id,
'work_date' => now()->subDays(10),
'location' => 'Dubai',
'salary' => 2500,
'status' => 'accepted',
'notes' => 'Current Active Job',
]);
// Submit worker review of employer
EmployerReview::create([
'worker_id' => $this->worker->id,
'employer_id' => $this->employer->id,
'job_id' => $this->job->id,
'rating' => 5,
'title' => 'Fantastic',
'comment' => 'Very good',
]);
// Act: Get dashboard
$dashboardResponse = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/dashboard');
$dashboardResponse->assertStatus(200);
$currentEmp = $dashboardResponse->json('data.current_employer');
$this->assertEquals(5.0, $currentEmp['rating']);
$this->assertEquals(1, $currentEmp['reviews_count']);
$this->assertCount(1, $currentEmp['reviews']);
$this->assertEquals('Very good', $currentEmp['reviews'][0]['comment']);
// Act: Get employers list
$employersResponse = $this->withHeaders([
'Authorization' => 'Bearer worker-test-token',
])->getJson('/api/workers/employers');
$employersResponse->assertStatus(200);
$listEmp = $employersResponse->json('data.employers.0.employer');
$this->assertEquals(5.0, $listEmp['rating']);
$this->assertEquals(1, $listEmp['reviews_count']);
$this->assertCount(1, $listEmp['reviews']);
}
public function test_employer_profile_returns_review_data()
{
// Submit review of employer
EmployerReview::create([
'worker_id' => $this->worker->id,
'employer_id' => $this->employer->id,
'job_id' => $this->job->id,
'rating' => 5,
'title' => 'Nice place',
'comment' => 'Great experience',
]);
// Act: Get employer profile
$response = $this->withHeaders([
'Authorization' => 'Bearer employer-test-token',
])->getJson('/api/employers/profile');
$response->assertStatus(200);
$profile = $response->json('data.profile');
$this->assertEquals(5.0, $profile['rating']);
$this->assertEquals(1, $profile['reviews_count']);
$this->assertCount(1, $profile['reviews']);
$this->assertEquals('Great experience', $profile['reviews'][0]['comment']);
$this->assertEquals('Rahul Sharma', $profile['reviews'][0]['worker']['name']);
}
}