diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json
index 21fe1a65efb..9b760d2f0c5 100644
--- a/oxlint-suppressions.json
+++ b/oxlint-suppressions.json
@@ -139,9 +139,6 @@
}
},
"web/app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx": {
- "jsx_a11y/tabindex-no-positive": {
- "count": 3
- },
"no-restricted-imports": {
"count": 1
}
diff --git a/web/app/(shareLayout)/webapp-signin/components/__tests__/mail-and-password-auth.spec.tsx b/web/app/(shareLayout)/webapp-signin/components/__tests__/mail-and-password-auth.spec.tsx
new file mode 100644
index 00000000000..c8a7bda9c00
--- /dev/null
+++ b/web/app/(shareLayout)/webapp-signin/components/__tests__/mail-and-password-auth.spec.tsx
@@ -0,0 +1,76 @@
+import { render, screen, waitFor } from '@testing-library/react'
+import userEvent from '@testing-library/user-event'
+import MailAndPasswordAuth from '../mail-and-password-auth'
+
+const replaceMock = vi.fn()
+const webAppLoginMock = vi.fn()
+const fetchAccessTokenMock = vi.fn()
+const searchParams = new URLSearchParams({
+ redirect_url: encodeURIComponent('/chatbot/test-app'),
+})
+
+vi.mock('@/next/navigation', () => ({
+ useRouter: () => ({ replace: replaceMock }),
+ useSearchParams: () => searchParams,
+}))
+
+vi.mock('@/context/i18n', () => ({
+ useLocale: () => 'en-US',
+}))
+
+vi.mock('@/context/web-app-context', () => ({
+ useWebAppStore: (selector: (state: { embeddedUserId: string }) => unknown) =>
+ selector({ embeddedUserId: 'embedded-user-99' }),
+}))
+
+vi.mock('@/service/common', () => ({
+ webAppLogin: (...args: unknown[]) => webAppLoginMock(...args),
+}))
+
+vi.mock('@/service/share', () => ({
+ fetchAccessToken: (...args: unknown[]) => fetchAccessTokenMock(...args),
+}))
+
+vi.mock('@/service/webapp-auth', () => ({
+ setWebAppAccessToken: vi.fn(),
+ setWebAppPassport: vi.fn(),
+}))
+
+describe('MailAndPasswordAuth', () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ webAppLoginMock.mockResolvedValue({
+ result: 'success',
+ data: { access_token: 'login-token' },
+ })
+ fetchAccessTokenMock.mockResolvedValue({ access_token: 'passport-token' })
+ })
+
+ it('submits from the password field through the native form', async () => {
+ const user = userEvent.setup()
+ render(