import { beforeEach, describe, expect, it, vi } from 'vitest' import { flushPromises, mount } from '@vue/test-utils' import PendingOAuthCreateAccountForm from '../PendingOAuthCreateAccountForm.vue' const sendVerifyCode = vi.fn() const sendPendingOAuthVerifyCode = vi.fn() const getPublicSettings = vi.fn() vi.mock('vue-i18n', async () => { const actual = await vi.importActual('vue-i18n') return { ...actual, useI18n: () => ({ t: (key: string) => key }) } }) vi.mock('@/api/auth', async () => { const actual = await vi.importActual('@/api/auth') return { ...actual, sendVerifyCode: (...args: any[]) => sendVerifyCode(...args), sendPendingOAuthVerifyCode: (...args: any[]) => sendPendingOAuthVerifyCode(...args), getPublicSettings: (...args: any[]) => getPublicSettings(...args) } }) describe('PendingOAuthCreateAccountForm', () => { beforeEach(() => { sendVerifyCode.mockReset() sendPendingOAuthVerifyCode.mockReset() getPublicSettings.mockReset() getPublicSettings.mockResolvedValue({ turnstile_enabled: false, turnstile_site_key: '' }) }) it('emits trimmed email, password, and verify code on submit', async () => { const wrapper = mount(PendingOAuthCreateAccountForm, { props: { providerName: 'LinuxDo', testIdPrefix: 'linuxdo', initialEmail: 'prefill@example.com', isSubmitting: false } }) await wrapper.get('[data-testid="linuxdo-create-account-email"]').setValue(' user@example.com ') await wrapper.get('[data-testid="linuxdo-create-account-password"]').setValue('secret-123') await wrapper.get('[data-testid="linuxdo-create-account-verify-code"]').setValue(' 246810 ') await wrapper.get('form').trigger('submit.prevent') expect(wrapper.emitted('submit')).toEqual([ [ { email: 'user@example.com', password: 'secret-123', verifyCode: '246810' } ] ]) }) it('shows and emits invitation code when invitation-only signup is enabled', async () => { getPublicSettings.mockResolvedValue({ invitation_code_enabled: true, turnstile_enabled: false, turnstile_site_key: '' }) const wrapper = mount(PendingOAuthCreateAccountForm, { props: { providerName: 'LinuxDo', testIdPrefix: 'linuxdo', initialEmail: 'prefill@example.com', isSubmitting: false } }) await flushPromises() await wrapper.get('[data-testid="linuxdo-create-account-password"]').setValue('secret-123') await wrapper.get('[data-testid="linuxdo-create-account-verify-code"]').setValue('246810') await wrapper.get('[data-testid="linuxdo-create-account-invitation-code"]').setValue(' INVITE123 ') await wrapper.get('form').trigger('submit.prevent') expect(wrapper.emitted('submit')).toEqual([ [ { email: 'prefill@example.com', password: 'secret-123', verifyCode: '246810', invitationCode: 'INVITE123' } ] ]) }) it('sends a verify code for the trimmed email value', async () => { sendPendingOAuthVerifyCode.mockResolvedValue({ message: 'sent', countdown: 60 }) const wrapper = mount(PendingOAuthCreateAccountForm, { props: { providerName: 'LinuxDo', testIdPrefix: 'linuxdo', initialEmail: '', isSubmitting: false } }) await wrapper.get('[data-testid="linuxdo-create-account-email"]').setValue(' user@example.com ') await wrapper.get('[data-testid="linuxdo-create-account-send-code"]').trigger('click') await flushPromises() expect(sendPendingOAuthVerifyCode).toHaveBeenCalledWith({ email: 'user@example.com' }) }) it('requires a turnstile token before sending a verify code when turnstile is enabled', async () => { getPublicSettings.mockResolvedValue({ turnstile_enabled: true, turnstile_site_key: 'site-key' }) sendPendingOAuthVerifyCode.mockResolvedValue({ message: 'sent', countdown: 60 }) const wrapper = mount(PendingOAuthCreateAccountForm, { props: { providerName: 'LinuxDo', testIdPrefix: 'linuxdo', initialEmail: '', isSubmitting: false }, global: { stubs: { TurnstileWidget: { template: '' } } } }) await flushPromises() await wrapper.get('[data-testid="linuxdo-create-account-email"]').setValue(' user@example.com ') expect(wrapper.get('[data-testid="linuxdo-create-account-send-code"]').attributes('disabled')).toBeDefined() await wrapper.get('[data-testid="turnstile-verify"]').trigger('click') await wrapper.get('[data-testid="linuxdo-create-account-send-code"]').trigger('click') await flushPromises() expect(sendPendingOAuthVerifyCode).toHaveBeenCalledWith({ email: 'user@example.com', turnstile_token: 'turnstile-token' }) }) })