212 lines
7.3 KiB
PHP
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']);
|
|
}
|
|
}
|