From 314aad15de747374df3243a43670baf1b5ffc4ac Mon Sep 17 00:00:00 2001 From: b1tc0re Date: Thu, 7 Aug 2025 04:26:05 +0300 Subject: [PATCH] fix bug in fetchIdentities when using first() --- src/Models/UserModel.php | 4 ++++ tests/Unit/UserModelTest.php | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/Models/UserModel.php b/src/Models/UserModel.php index 7f6a9ebb8..529abed9f 100644 --- a/src/Models/UserModel.php +++ b/src/Models/UserModel.php @@ -142,6 +142,10 @@ protected function fetchIdentities(array $data): array $mappedUsers = $this->assignIdentities($data, $identities); + if ($data['method'] === 'first') { + $data['id'] = $data['data']->id; + } + $data['data'] = $data['singleton'] ? $mappedUsers[$data['id']] : $mappedUsers; return $data; diff --git a/tests/Unit/UserModelTest.php b/tests/Unit/UserModelTest.php index 47de1d219..4001b4f0b 100644 --- a/tests/Unit/UserModelTest.php +++ b/tests/Unit/UserModelTest.php @@ -278,4 +278,49 @@ public function testSaveArrayNoDataToUpdate(): void $users->save(['id' => $user->id]); } + + public function testGetFirstIdentity(): void + { + $errors = []; + $users = $this->createUserModel(); + $user = $this->createNewUser(); + $users->save($user); + + // Custom error handler + set_error_handler(static function ($severity, $message, $file, $line) use (&$errors) { + $errors[] = [ + 'message' => $message, + 'severity' => $severity, + 'file' => $file, + 'line' => $line, + ]; + + // Return true so that the default handler is not executed + return true; + }); + + try { + $user = $users->withIdentities()->first(); + $this->assertSame( + $user->getIdentity('all')->secret, + 'foo@bar.com', + 'Verify first() method retrieves user with identity', + ); + } finally { + // restore handler + restore_error_handler(); + } + + if ($errors !== []) { + $errorMessages = array_map(static fn ($error) => sprintf( + '[%s] %s in %s:%s', + $error['severity'], + $error['message'], + $error['file'], + $error['line'], + ), $errors); + + $this->fail("Errors found:\n" . implode("\n", $errorMessages)); + } + } }