diff --git a/apps/web/src/common/components/Header/User.test.tsx b/apps/web/src/common/components/Header/User.test.tsx
new file mode 100755
index 000000000..383d5dcb8
--- /dev/null
+++ b/apps/web/src/common/components/Header/User.test.tsx
@@ -0,0 +1,59 @@
+import React from 'react';
+import { render, screen } from '@testing-library/react';
+import User from './User';
+
+jest.mock('next/router', () => ({
+ useRouter: () => ({ push: jest.fn() }),
+}));
+
+jest.mock('next/image', () => ({
+ __esModule: true,
+ default: (props: any) => {
+ // eslint-disable-next-line @next/next/no-img-element
+ return ;
+ },
+}));
+
+jest.mock('@modules/auth', () => ({
+ useUserInfo: () => ({
+ providerUser: { avatarUrl: 'https://example.com/a.png', name: 'alice' },
+ roleLevel: 0,
+ dashboardRole: false,
+ }),
+}));
+
+jest.mock('@modules/auth/UserInfoStore', () => ({
+ resetUserInfo: jest.fn(),
+}));
+
+jest.mock('@oss-compass/graphql', () => ({
+ useSignOutMutation: () => ({ mutate: jest.fn() }),
+}));
+
+describe('Header User menu', () => {
+ it('exposes the avatar as a focusable menu trigger button', () => {
+ render(