Fix: Display logout option even when user is not available (#10077)

Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
Tim O'Farrell 2025-08-04 13:24:20 -04:00 committed by GitHub
parent d5cdecea21
commit a0adbd741a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 15 deletions

View File

@ -62,16 +62,16 @@ describe("UserActions", () => {
).not.toBeInTheDocument();
});
it("should NOT show context menu when user is undefined and avatar is clicked", async () => {
it("should show context menu when user is undefined and avatar is clicked", async () => {
render(<UserActions onLogout={onLogoutMock} />);
const userAvatar = screen.getByTestId("user-avatar");
await user.click(userAvatar);
// Context menu should NOT appear because user is undefined
// Context menu SHOULD appear even when user is undefined
expect(
screen.queryByTestId("account-settings-context-menu"),
).not.toBeInTheDocument();
screen.getByTestId("account-settings-context-menu"),
).toBeInTheDocument();
});
it("should show context menu even when user has no avatar_url", async () => {
@ -86,23 +86,35 @@ describe("UserActions", () => {
).toBeInTheDocument();
});
it("should NOT be able to access logout when no user is provided", async () => {
it("should be able to access logout even when no user is provided", async () => {
render(<UserActions onLogout={onLogoutMock} />);
const userAvatar = screen.getByTestId("user-avatar");
await user.click(userAvatar);
// Logout option should not be accessible because context menu doesn't appear
// Logout option should be accessible even when no user is provided
expect(
screen.queryByText("ACCOUNT_SETTINGS$LOGOUT"),
).not.toBeInTheDocument();
expect(onLogoutMock).not.toHaveBeenCalled();
screen.getByText("ACCOUNT_SETTINGS$LOGOUT"),
).toBeInTheDocument();
// Verify logout works
const logoutOption = screen.getByText("ACCOUNT_SETTINGS$LOGOUT");
await user.click(logoutOption);
expect(onLogoutMock).toHaveBeenCalledOnce();
});
it("should handle user prop changing from undefined to defined", () => {
it("should handle user prop changing from undefined to defined", async () => {
const { rerender } = render(<UserActions onLogout={onLogoutMock} />);
// Initially no user - context menu shouldn't work
// Initially no user - but we can still click to show the menu
const userAvatar = screen.getByTestId("user-avatar");
await user.click(userAvatar);
expect(
screen.getByTestId("account-settings-context-menu"),
).toBeInTheDocument();
// Close the menu
await user.click(userAvatar);
expect(
screen.queryByTestId("account-settings-context-menu"),
).not.toBeInTheDocument();
@ -118,6 +130,12 @@ describe("UserActions", () => {
// Component should still render correctly
expect(screen.getByTestId("user-actions")).toBeInTheDocument();
expect(screen.getByTestId("user-avatar")).toBeInTheDocument();
// Menu should still work with user defined
await user.click(userAvatar);
expect(
screen.getByTestId("account-settings-context-menu"),
).toBeInTheDocument();
});
it("should handle user prop changing from defined to undefined", async () => {
@ -135,12 +153,18 @@ describe("UserActions", () => {
screen.getByTestId("account-settings-context-menu"),
).toBeInTheDocument();
// Remove user prop - menu should disappear
// Remove user prop - menu should still be visible
rerender(<UserActions onLogout={onLogoutMock} />);
// Context menu should remain visible even when user becomes undefined
expect(
screen.queryByTestId("account-settings-context-menu"),
).not.toBeInTheDocument();
screen.getByTestId("account-settings-context-menu"),
).toBeInTheDocument();
// Verify logout still works
const logoutOption = screen.getByText("ACCOUNT_SETTINGS$LOGOUT");
await user.click(logoutOption);
expect(onLogoutMock).toHaveBeenCalledOnce();
});
it("should work with loading state and user provided", async () => {

View File

@ -13,6 +13,7 @@ export function UserActions({ onLogout, user, isLoading }: UserActionsProps) {
React.useState(false);
const toggleAccountMenu = () => {
// Always toggle the menu, even if user is undefined
setAccountContextMenuIsVisible((prev) => !prev);
};
@ -33,7 +34,7 @@ export function UserActions({ onLogout, user, isLoading }: UserActionsProps) {
isLoading={isLoading}
/>
{accountContextMenuIsVisible && !!user && (
{accountContextMenuIsVisible && (
<AccountSettingsContextMenu
onLogout={handleLogout}
onClose={closeAccountMenu}