service = app(AuthService::class); } public function test_get_levels_for_phone_maps_user_levels_to_slugs(): void { User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value]); User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Supervisor->value]); User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Vet->value]); $levels = $this->service->getLevelsForPhone('09120000000'); $this->assertEqualsCanonicalizing(['doctor', 'supervisor', 'veterinarian'], $levels); } public function test_get_levels_for_phone_excludes_admin_level(): void { User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Admin->value]); User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value]); $this->assertSame(['doctor'], $this->service->getLevelsForPhone('09120000000')); } public function test_get_levels_for_phone_returns_unique_levels(): void { User::factory()->count(2)->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value]); $this->assertSame(['doctor'], $this->service->getLevelsForPhone('09120000000')); } public function test_get_levels_for_phone_returns_empty_array_for_unknown_phone(): void { User::factory()->create(['phone' => '09130000000']); $this->assertSame([], $this->service->getLevelsForPhone('09120000000')); } public function test_get_levels_for_phone_flushes_session(): void { session(['login_phone' => '09120000000']); $this->service->getLevelsForPhone('09120000000'); $this->assertFalse(session()->has('login_phone')); } public function test_authenticate_logs_in_user_matching_phone_level_and_password(): void { $user = User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value, 'password' => 'secret123']); $authenticated = $this->service->authenticateByPhoneAndLevel('09120000000', UserEnum::Doctor->value, 'secret123'); $this->assertTrue($authenticated->is($user)); $this->assertTrue(Auth::check()); $this->assertTrue(Auth::user()->is($user)); } public function test_authenticate_clears_login_flow_session_keys(): void { User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value, 'password' => 'secret123']); session(['register_phone' => 'x', 'verified_phone' => 'x', 'otp_verified' => true, 'login_phone' => 'x', 'login_level' => 'x', 'available_levels' => []]); $this->service->authenticateByPhoneAndLevel('09120000000', UserEnum::Doctor->value, 'secret123'); foreach (['register_phone', 'verified_phone', 'otp_verified', 'login_phone', 'login_level', 'available_levels'] as $key) { $this->assertFalse(session()->has($key), "session key {$key} was not forgotten"); } } public function test_authenticate_returns_null_for_wrong_password(): void { User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value, 'password' => 'secret123']); $this->assertNull($this->service->authenticateByPhoneAndLevel('09120000000', UserEnum::Doctor->value, 'wrong')); $this->assertFalse(Auth::check()); } public function test_authenticate_returns_null_for_wrong_level(): void { User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value, 'password' => 'secret123']); $this->assertNull($this->service->authenticateByPhoneAndLevel('09120000000', UserEnum::Supervisor->value, 'secret123')); $this->assertFalse(Auth::check()); } public function test_authenticate_returns_null_for_unknown_phone(): void { $this->assertNull($this->service->authenticateByPhoneAndLevel('09120000000', UserEnum::Doctor->value, 'secret123')); $this->assertFalse(Auth::check()); } public function test_authenticate_picks_account_with_requested_level_when_phone_has_many(): void { User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Doctor->value, 'password' => 'doctor-pass']); $supervisor = User::factory()->create(['phone' => '09120000000', 'level' => UserEnum::Supervisor->value, 'password' => 'supervisor-pass']); $authenticated = $this->service->authenticateByPhoneAndLevel('09120000000', UserEnum::Supervisor->value, 'supervisor-pass'); $this->assertTrue($authenticated->is($supervisor)); } }