79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
import { describe, it, expect, beforeEach, vi } from 'vitest'
|
|
import { setActivePinia, createPinia } from 'pinia'
|
|
import { useAuthStore } from './auth'
|
|
|
|
// localStorage is not available in jsdom by default without setup,
|
|
// so we mock it minimally
|
|
const localStorageMock = (() => {
|
|
let store = {}
|
|
return {
|
|
getItem: (key) => store[key] ?? null,
|
|
setItem: (key, value) => { store[key] = String(value) },
|
|
removeItem: (key) => { delete store[key] },
|
|
clear: () => { store = {} },
|
|
}
|
|
})()
|
|
|
|
Object.defineProperty(globalThis, 'localStorage', { value: localStorageMock })
|
|
|
|
// Mock the API module so tests don't make real HTTP calls
|
|
vi.mock('@/api', () => ({
|
|
authApi: {
|
|
login: vi.fn(),
|
|
},
|
|
}))
|
|
|
|
describe('useAuthStore', () => {
|
|
beforeEach(() => {
|
|
localStorageMock.clear()
|
|
setActivePinia(createPinia())
|
|
})
|
|
|
|
it('initializes with null user when localStorage is empty', () => {
|
|
const store = useAuthStore()
|
|
expect(store.user).toBeNull()
|
|
expect(store.tenants).toEqual([])
|
|
expect(store.activeTenantId).toBeNull()
|
|
expect(store.isLoggedIn).toBe(false)
|
|
})
|
|
|
|
it('isLoggedIn is true when user is set', () => {
|
|
localStorageMock.setItem('user', JSON.stringify({ id: '1', email: 'a@b.de' }))
|
|
const store = useAuthStore()
|
|
expect(store.isLoggedIn).toBe(true)
|
|
})
|
|
|
|
it('logout clears state and localStorage', () => {
|
|
localStorageMock.setItem('user', JSON.stringify({ id: '1' }))
|
|
localStorageMock.setItem('tenants', JSON.stringify([{ id: 'tid' }]))
|
|
localStorageMock.setItem('tenant_id', 'tid')
|
|
|
|
const store = useAuthStore()
|
|
store.logout()
|
|
|
|
expect(store.user).toBeNull()
|
|
expect(store.tenants).toEqual([])
|
|
expect(store.activeTenantId).toBeNull()
|
|
expect(localStorageMock.getItem('user')).toBeNull()
|
|
})
|
|
|
|
it('setActiveTenant updates state and localStorage', () => {
|
|
const store = useAuthStore()
|
|
store.setActiveTenant('new-tenant-id')
|
|
expect(store.activeTenantId).toBe('new-tenant-id')
|
|
expect(localStorageMock.getItem('tenant_id')).toBe('new-tenant-id')
|
|
})
|
|
|
|
it('activeTenant returns matching tenant from list', () => {
|
|
const tenants = [
|
|
{ id: 'tid-1', name: 'Erster' },
|
|
{ id: 'tid-2', name: 'Zweiter' },
|
|
]
|
|
localStorageMock.setItem('tenants', JSON.stringify(tenants))
|
|
localStorageMock.setItem('tenant_id', 'tid-2')
|
|
|
|
const store = useAuthStore()
|
|
expect(store.activeTenant?.name).toBe('Zweiter')
|
|
})
|
|
})
|