mirror of
https://gitee.com/wanwujie/sub2api
synced 2026-05-06 06:00:44 +08:00
206 lines
6.2 KiB
TypeScript
206 lines
6.2 KiB
TypeScript
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()
|
|
const showError = vi.fn()
|
|
|
|
vi.mock('vue-i18n', async () => {
|
|
const actual = await vi.importActual<typeof import('vue-i18n')>('vue-i18n')
|
|
return {
|
|
...actual,
|
|
useI18n: () => ({
|
|
t: (key: string) => key
|
|
})
|
|
}
|
|
})
|
|
|
|
vi.mock('@/api/auth', async () => {
|
|
const actual = await vi.importActual<typeof import('@/api/auth')>('@/api/auth')
|
|
return {
|
|
...actual,
|
|
sendVerifyCode: (...args: any[]) => sendVerifyCode(...args),
|
|
sendPendingOAuthVerifyCode: (...args: any[]) => sendPendingOAuthVerifyCode(...args),
|
|
getPublicSettings: (...args: any[]) => getPublicSettings(...args)
|
|
}
|
|
})
|
|
|
|
vi.mock('@/stores', () => ({
|
|
useAppStore: () => ({
|
|
showError
|
|
})
|
|
}))
|
|
|
|
describe('PendingOAuthCreateAccountForm', () => {
|
|
beforeEach(() => {
|
|
sendVerifyCode.mockReset()
|
|
sendPendingOAuthVerifyCode.mockReset()
|
|
getPublicSettings.mockReset()
|
|
showError.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('renders action labels through i18n keys', () => {
|
|
const wrapper = mount(PendingOAuthCreateAccountForm, {
|
|
props: {
|
|
testIdPrefix: 'linuxdo',
|
|
initialEmail: '',
|
|
isSubmitting: false
|
|
}
|
|
})
|
|
|
|
expect(wrapper.text()).toContain('auth.createAccount')
|
|
expect(wrapper.text()).toContain('auth.alreadyHaveAccount')
|
|
})
|
|
|
|
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('shows send-code failures via toast without rendering inline error text', async () => {
|
|
sendPendingOAuthVerifyCode.mockRejectedValue(new Error('send failed'))
|
|
|
|
const wrapper = mount(PendingOAuthCreateAccountForm, {
|
|
props: {
|
|
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(showError).toHaveBeenCalledWith('send failed')
|
|
expect(wrapper.text()).not.toContain('send failed')
|
|
})
|
|
|
|
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: '<button data-testid="turnstile-verify" @click="$emit(\'verify\', \'turnstile-token\')">verify</button>'
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
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'
|
|
})
|
|
})
|
|
})
|