201 lines
7.6 KiB
PHP
201 lines
7.6 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature;
|
|
|
|
use App\Models\Sponsor;
|
|
use App\Models\User;
|
|
use App\Models\Worker;
|
|
use App\Models\EmployerProfile;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Http\UploadedFile;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Tests\TestCase;
|
|
|
|
class FcmAuthenticationTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
// Write a temporary fake credential file so FCMService doesn't fail on file check
|
|
$credentialsPath = base_path('migrant-fe5a7-firebase-adminsdk-fbsvc-f8b365ecd0.json');
|
|
if (!file_exists($credentialsPath)) {
|
|
file_put_contents($credentialsPath, json_encode([
|
|
'private_key' => "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3\n-----END PRIVATE KEY-----",
|
|
'client_email' => 'fake-fcm@migrant.iam.gserviceaccount.com',
|
|
'project_id' => 'migrant-fe5a7'
|
|
]));
|
|
}
|
|
|
|
// Fake Google OAuth and FCM endpoints
|
|
Http::fake([
|
|
'https://oauth2.googleapis.com/token' => Http::response(['access_token' => 'fake_token'], 200),
|
|
'https://fcm.googleapis.com/v1/projects/*' => Http::response(['name' => 'projects/migrant-fe5a7/messages/1234'], 200),
|
|
]);
|
|
}
|
|
|
|
protected function tearDown(): void
|
|
{
|
|
// Clean up temporary credentials file if needed, but since it's inside workspace it's fine.
|
|
parent::tearDown();
|
|
}
|
|
|
|
public function test_employer_registration_and_login_stores_fcm_token_and_sends_notification()
|
|
{
|
|
// Register Employer
|
|
$response = $this->postJson('/api/employers/register', [
|
|
'name' => 'Employer FCM Test',
|
|
'email' => 'employer.fcm@example.com',
|
|
'phone' => '+971500000001',
|
|
'fcm_token' => 'employer_register_fcm_token'
|
|
]);
|
|
|
|
$response->assertStatus(201);
|
|
|
|
$user = User::where('email', 'employer.fcm@example.com')->first();
|
|
$this->assertEquals('employer_register_fcm_token', $user->fcm_token);
|
|
|
|
$sponsor = Sponsor::where('email', 'employer.fcm@example.com')->first();
|
|
$this->assertEquals('employer_register_fcm_token', $sponsor->fcm_token);
|
|
|
|
// Verify OTP
|
|
$otpData = Cache::get('employer_otp_employer.fcm@example.com');
|
|
$this->assertNotNull($otpData);
|
|
|
|
$verifyResponse = $this->postJson('/api/employers/verify', [
|
|
'email' => 'employer.fcm@example.com',
|
|
'otp' => $otpData['code'],
|
|
'fcm_token' => 'employer_verify_fcm_token'
|
|
]);
|
|
$verifyResponse->assertStatus(200);
|
|
|
|
$user->refresh();
|
|
$sponsor->refresh();
|
|
$this->assertEquals('employer_verify_fcm_token', $user->fcm_token);
|
|
$this->assertEquals('employer_verify_fcm_token', $sponsor->fcm_token);
|
|
|
|
// Set payment/activate status so password can be set
|
|
$sponsor->update(['payment_status' => 'paid']);
|
|
|
|
// Set password
|
|
$passwordResponse = $this->postJson('/api/employers/password', [
|
|
'email' => 'employer.fcm@example.com',
|
|
'password' => 'newpassword123',
|
|
'password_confirmation' => 'newpassword123',
|
|
'fcm_token' => 'employer_password_fcm_token'
|
|
]);
|
|
$passwordResponse->assertStatus(200);
|
|
|
|
$user->refresh();
|
|
$sponsor->refresh();
|
|
$this->assertEquals('employer_password_fcm_token', $user->fcm_token);
|
|
$this->assertEquals('employer_password_fcm_token', $sponsor->fcm_token);
|
|
|
|
// Login
|
|
$loginResponse = $this->postJson('/api/employers/login', [
|
|
'email' => 'employer.fcm@example.com',
|
|
'password' => 'newpassword123',
|
|
'fcm_token' => 'employer_login_fcm_token'
|
|
]);
|
|
$loginResponse->assertStatus(200);
|
|
|
|
$user->refresh();
|
|
$sponsor->refresh();
|
|
$this->assertEquals('employer_login_fcm_token', $user->fcm_token);
|
|
$this->assertEquals('employer_login_fcm_token', $sponsor->fcm_token);
|
|
}
|
|
|
|
public function test_worker_registration_setup_profile_and_login_stores_fcm_token_and_sends_notification()
|
|
{
|
|
// 1. Worker Setup Profile Flow (Requires OTP verified in session cache)
|
|
$phone = '+971500000002';
|
|
Cache::put('worker_otp_verified_' . $phone, true, 60);
|
|
|
|
$responseSetup = $this->postJson('/api/workers/setup-profile', [
|
|
'phone' => $phone,
|
|
'name' => 'Worker Setup FCM',
|
|
'nationality' => 'Indian',
|
|
'language' => 'hi',
|
|
'gender' => 'male',
|
|
'fcm_token' => 'worker_setup_fcm_token'
|
|
]);
|
|
|
|
$responseSetup->assertStatus(201);
|
|
$worker = Worker::where('phone', $phone)->first();
|
|
$this->assertEquals('worker_setup_fcm_token', $worker->fcm_token);
|
|
|
|
// Set password for login
|
|
$worker->update(['password' => Hash::make('workerpassword123')]);
|
|
|
|
// Login Setup Worker
|
|
$loginResponse = $this->postJson('/api/workers/login', [
|
|
'phone' => $phone,
|
|
'password' => 'workerpassword123',
|
|
'fcm_token' => 'worker_login_fcm_token'
|
|
]);
|
|
$loginResponse->assertStatus(200);
|
|
|
|
$worker->refresh();
|
|
$this->assertEquals('worker_login_fcm_token', $worker->fcm_token);
|
|
|
|
// 2. Worker Unified Register Flow
|
|
$passportFile = UploadedFile::fake()->create('passport.pdf', 500, 'application/pdf');
|
|
$visaFile = UploadedFile::fake()->create('visa.pdf', 500, 'application/pdf');
|
|
|
|
$responseRegister = $this->postJson('/api/workers/register', [
|
|
'name' => 'Worker Unified FCM',
|
|
'phone' => '+971500000003',
|
|
'salary' => 2000,
|
|
'password' => 'workerpassword123',
|
|
'passport_file' => $passportFile,
|
|
'visa_file' => $visaFile,
|
|
'fcm_token' => 'worker_register_fcm_token'
|
|
]);
|
|
|
|
$responseRegister->assertStatus(201);
|
|
$workerReg = Worker::where('phone', '+971500000003')->first();
|
|
$this->assertEquals('worker_register_fcm_token', $workerReg->fcm_token);
|
|
}
|
|
|
|
public function test_sponsor_registration_and_login_stores_fcm_token_and_sends_notification()
|
|
{
|
|
$licenseFile = UploadedFile::fake()->create('license.pdf', 500, 'application/pdf');
|
|
$emiratesIdFile = UploadedFile::fake()->create('emirates_id.pdf', 500, 'application/pdf');
|
|
|
|
$response = $this->postJson('/api/sponsors/register', [
|
|
'full_name' => 'Sponsor FCM Org',
|
|
'mobile' => '+971500000004',
|
|
'password' => 'sponsorpassword123',
|
|
'license_file' => $licenseFile,
|
|
'emirates_id_file' => $emiratesIdFile,
|
|
'organization_name' => 'Sponsor FCM Co',
|
|
'email' => 'sponsor.fcm@example.com',
|
|
'nationality' => 'Emirati',
|
|
'city' => 'Dubai',
|
|
'address' => 'Test Address',
|
|
'country_code' => '+971',
|
|
'license_expiry' => '2027-01-01',
|
|
'fcm_token' => 'sponsor_register_fcm_token'
|
|
]);
|
|
|
|
$response->assertStatus(201);
|
|
$sponsor = Sponsor::where('mobile', '+971500000004')->first();
|
|
$this->assertEquals('sponsor_register_fcm_token', $sponsor->fcm_token);
|
|
|
|
// Login
|
|
$loginResponse = $this->postJson('/api/sponsors/login', [
|
|
'mobile' => '+971500000004',
|
|
'password' => 'sponsorpassword123',
|
|
'fcm_token' => 'sponsor_login_fcm_token'
|
|
]);
|
|
|
|
$loginResponse->assertStatus(200);
|
|
$sponsor->refresh();
|
|
$this->assertEquals('sponsor_login_fcm_token', $sponsor->fcm_token);
|
|
}
|
|
}
|