token = 'test-employer-token'; $this->employer = User::create([ 'name' => 'Original Name', 'email' => 'employer@example.com', 'password' => bcrypt('Password@123'), 'role' => 'employer', 'api_token' => $this->token, ]); EmployerProfile::create([ 'user_id' => $this->employer->id, 'address' => 'Original Address', 'phone' => '+971501112222', 'verification_status' => 'approved', 'notifications' => true, ]); } /** * Test employer can retrieve profile. */ public function test_employer_can_get_profile() { $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $this->token, ])->getJson('/api/employers/profile'); $response->assertStatus(200) ->assertJsonStructure([ 'success', 'data' => [ 'profile' => [ 'name', 'email', 'phone', 'address', 'notifications', 'verification_status', ] ] ]); $this->assertEquals('Original Name', $response->json('data.profile.name')); $this->assertEquals('Original Address', $response->json('data.profile.address')); } /** * Test employer can update profile details. */ public function test_employer_can_update_profile() { $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $this->token, ])->postJson('/api/employers/profile/update', [ 'name' => 'Updated Name', 'email' => 'employer_updated@example.com', 'phone' => '+971509999999', 'address' => 'Updated Address Info', 'notifications' => false, ]); $response->assertStatus(200) ->assertJsonStructure([ 'success', 'message', 'data' => [ 'profile' => [ 'name', 'email', 'phone', 'address', 'notifications', ] ] ]); $this->assertDatabaseHas('users', [ 'id' => $this->employer->id, 'name' => 'Updated Name', 'email' => 'employer_updated@example.com', ]); $this->assertDatabaseHas('employer_profiles', [ 'user_id' => $this->employer->id, 'address' => 'Updated Address Info', 'notifications' => false, ]); } /** * Test employer can update password when providing correct current password. */ public function test_employer_can_update_password() { $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $this->token, ])->postJson('/api/employers/profile/update', [ 'name' => 'Original Name', 'email' => 'employer@example.com', 'phone' => '+971501112222', 'address' => 'Original Address', 'notifications' => true, 'current_password' => 'Password@123', 'new_password' => 'NewSecurePassword@123', 'new_password_confirmation' => 'NewSecurePassword@123', ]); $response->assertStatus(200); // Verify password hash updated $this->assertTrue(Hash::check('NewSecurePassword@123', $this->employer->fresh()->password)); } /** * Test employer password update fails with incorrect current password. */ public function test_employer_password_update_fails_with_incorrect_current_password() { $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $this->token, ])->postJson('/api/employers/profile/update', [ 'name' => 'Original Name', 'email' => 'employer@example.com', 'phone' => '+971501112222', 'address' => 'Original Address', 'notifications' => true, 'current_password' => 'WrongCurrentPassword', 'new_password' => 'NewSecurePassword@123', 'new_password_confirmation' => 'NewSecurePassword@123', ]); $response->assertStatus(422) ->assertJsonStructure([ 'success', 'message', 'errors' => [ 'current_password' ] ]); // Verify password was NOT changed $this->assertTrue(Hash::check('Password@123', $this->employer->fresh()->password)); } /** * Test employer dashboard returns only the latest 2 approved charity drives. */ public function test_employer_dashboard_returns_only_two_charity_drives() { // Create 5 approved announcements for ($i = 1; $i <= 5; $i++) { $ann = new \App\Models\Announcement([ 'title' => "Charity Drive $i", 'body' => "Details of charity drive $i", 'type' => 'charity', 'status' => 'approved', ]); $ann->created_at = now()->subMinutes(6 - $i); $ann->save(); } // Create 1 pending announcement $pendingAnn = new \App\Models\Announcement([ 'title' => "Pending Charity Drive", 'body' => "Details of pending charity drive", 'type' => 'charity', 'status' => 'pending', ]); $pendingAnn->created_at = now(); $pendingAnn->save(); $response = $this->withHeaders([ 'Authorization' => 'Bearer ' . $this->token, ])->getJson('/api/employers/dashboard'); $response->assertStatus(200) ->assertJson([ 'success' => true, ]); $announcements = $response->json('data.recent_announcements'); $this->assertCount(2, $announcements); // Make sure it contains the latest 2 approved ones $titles = collect($announcements)->pluck('title'); $this->assertTrue($titles->contains('Charity Drive 5')); $this->assertTrue($titles->contains('Charity Drive 4')); $this->assertFalse($titles->contains('Charity Drive 3')); $this->assertFalse($titles->contains('Charity Drive 2')); $this->assertFalse($titles->contains('Charity Drive 1')); $this->assertFalse($titles->contains('Pending Charity Drive')); } }