test(phase-02): add Nyquist validation tests for plan 06 gaps
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
da526cb727
commit
0505beb0a4
@@ -0,0 +1,116 @@
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||
import { mount } from '@vue/test-utils'
|
||||
import { createPinia, setActivePinia } from 'pinia'
|
||||
import { createRouter, createMemoryHistory } from 'vue-router'
|
||||
|
||||
// Mock auth store before any imports
|
||||
vi.mock('../../../stores/auth.js', () => ({
|
||||
useAuthStore: vi.fn(),
|
||||
}))
|
||||
|
||||
// Mock api/client to avoid HTTP calls
|
||||
vi.mock('../../../api/client.js', () => ({
|
||||
changePassword: vi.fn(),
|
||||
totpDisable: vi.fn(),
|
||||
}))
|
||||
|
||||
import { useAuthStore } from '../../../stores/auth.js'
|
||||
import SettingsAccountTab from '../SettingsAccountTab.vue'
|
||||
|
||||
// Minimal router — required because the component calls useRouter() in script setup
|
||||
const testRouter = createRouter({
|
||||
history: createMemoryHistory(),
|
||||
routes: [
|
||||
{ path: '/', component: { template: '<div />' } },
|
||||
{ path: '/login', component: { template: '<div />' } },
|
||||
{ path: '/settings', component: { template: '<div />' } },
|
||||
],
|
||||
})
|
||||
|
||||
const globalStubs = {
|
||||
TotpEnrollment: { template: '<div data-stub="TotpEnrollment" />' },
|
||||
ConfirmBlock: { template: '<div data-stub="ConfirmBlock" />', props: ['message', 'confirmLabel', 'cancelLabel'] },
|
||||
PasswordStrengthBar: { template: '<div data-stub="PasswordStrengthBar" />', props: ['password'] },
|
||||
AppSpinner: { template: '<span />' },
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
setActivePinia(createPinia())
|
||||
vi.clearAllMocks()
|
||||
})
|
||||
|
||||
describe('SettingsAccountTab — four section headings (AUTH-03, AUTH-04)', () => {
|
||||
it('renders all 4 required section headings when totp_enabled is false', () => {
|
||||
useAuthStore.mockReturnValue({
|
||||
user: { email: 'test@example.com', handle: 'testuser', role: 'user', totp_enabled: false },
|
||||
logoutAll: vi.fn(),
|
||||
})
|
||||
|
||||
const wrapper = mount(SettingsAccountTab, {
|
||||
global: {
|
||||
plugins: [createPinia(), testRouter],
|
||||
stubs: globalStubs,
|
||||
},
|
||||
})
|
||||
|
||||
const text = wrapper.text()
|
||||
expect(text).toContain('Account information')
|
||||
expect(text).toContain('Two-factor authentication')
|
||||
expect(text).toContain('Change password')
|
||||
expect(text).toContain('Sessions')
|
||||
})
|
||||
|
||||
it('renders TotpEnrollment stub when totp_enabled is false', () => {
|
||||
useAuthStore.mockReturnValue({
|
||||
user: { email: 'test@example.com', handle: 'testuser', role: 'user', totp_enabled: false },
|
||||
logoutAll: vi.fn(),
|
||||
})
|
||||
|
||||
const wrapper = mount(SettingsAccountTab, {
|
||||
global: {
|
||||
plugins: [createPinia(), testRouter],
|
||||
stubs: globalStubs,
|
||||
},
|
||||
})
|
||||
|
||||
expect(wrapper.find('[data-stub="TotpEnrollment"]').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('shows "Enabled" status and "Disable 2FA" button when totp_enabled is true', () => {
|
||||
useAuthStore.mockReturnValue({
|
||||
user: { email: 'test@example.com', handle: 'testuser', role: 'user', totp_enabled: true },
|
||||
logoutAll: vi.fn(),
|
||||
})
|
||||
|
||||
const wrapper = mount(SettingsAccountTab, {
|
||||
global: {
|
||||
plugins: [createPinia(), testRouter],
|
||||
stubs: globalStubs,
|
||||
},
|
||||
})
|
||||
|
||||
// "Enabled" text must appear (inside the 2FA section)
|
||||
expect(wrapper.text()).toContain('Enabled')
|
||||
|
||||
// "Disable 2FA" button must be present
|
||||
const buttons = wrapper.findAll('button')
|
||||
const disableBtn = buttons.find(b => b.text().includes('Disable 2FA'))
|
||||
expect(disableBtn).toBeDefined()
|
||||
})
|
||||
|
||||
it('does NOT render TotpEnrollment stub when totp_enabled is true', () => {
|
||||
useAuthStore.mockReturnValue({
|
||||
user: { email: 'test@example.com', handle: 'testuser', role: 'user', totp_enabled: true },
|
||||
logoutAll: vi.fn(),
|
||||
})
|
||||
|
||||
const wrapper = mount(SettingsAccountTab, {
|
||||
global: {
|
||||
plugins: [createPinia(), testRouter],
|
||||
stubs: globalStubs,
|
||||
},
|
||||
})
|
||||
|
||||
expect(wrapper.find('[data-stub="TotpEnrollment"]').exists()).toBe(false)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user